Replace TextureType::(Is|As)Sampled with Castable

Change-Id: Id997f118a8ce9f4f7c42bed306368d3f204b6607
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34279
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/function.cc b/src/ast/function.cc
index 08a2869..0d20fc1 100644
--- a/src/ast/function.cc
+++ b/src/ast/function.cc
@@ -19,6 +19,7 @@
 #include "src/ast/decorated_variable.h"
 #include "src/ast/stage_decoration.h"
 #include "src/ast/type/multisampled_texture_type.h"
+#include "src/ast/type/sampled_texture_type.h"
 #include "src/ast/type/texture_type.h"
 #include "src/ast/workgroup_decoration.h"
 
@@ -318,7 +319,7 @@
     if ((multisampled &&
          !unwrapped_type->Is<ast::type::MultisampledTextureType>()) ||
         (!multisampled &&
-         !unwrapped_type->As<ast::type::TextureType>()->IsSampled())) {
+         !unwrapped_type->Is<ast::type::SampledTextureType>())) {
       continue;
     }
 
diff --git a/src/ast/type/depth_texture_type_test.cc b/src/ast/type/depth_texture_type_test.cc
index 867c2a1..4b39585 100644
--- a/src/ast/type/depth_texture_type_test.cc
+++ b/src/ast/type/depth_texture_type_test.cc
@@ -23,6 +23,7 @@
 #include "src/ast/type/i32_type.h"
 #include "src/ast/type/matrix_type.h"
 #include "src/ast/type/pointer_type.h"
+#include "src/ast/type/sampled_texture_type.h"
 #include "src/ast/type/storage_texture_type.h"
 #include "src/ast/type/struct_type.h"
 #include "src/ast/type/u32_type.h"
@@ -55,9 +56,9 @@
 
 TEST_F(DepthTextureTypeTest, IsTextureType) {
   DepthTextureType d(TextureDimension::kCube);
-  TextureType*ty = &d;
+  TextureType* ty = &d;
   EXPECT_TRUE(ty->Is<DepthTextureType>());
-  EXPECT_FALSE(ty->IsSampled());
+  EXPECT_FALSE(ty->Is<SampledTextureType>());
   EXPECT_FALSE(ty->Is<StorageTextureType>());
 }
 
diff --git a/src/ast/type/multisampled_texture_type_test.cc b/src/ast/type/multisampled_texture_type_test.cc
index 1d987e6..8b1aa21 100644
--- a/src/ast/type/multisampled_texture_type_test.cc
+++ b/src/ast/type/multisampled_texture_type_test.cc
@@ -23,6 +23,7 @@
 #include "src/ast/type/i32_type.h"
 #include "src/ast/type/matrix_type.h"
 #include "src/ast/type/pointer_type.h"
+#include "src/ast/type/sampled_texture_type.h"
 #include "src/ast/type/storage_texture_type.h"
 #include "src/ast/type/struct_type.h"
 #include "src/ast/type/u32_type.h"
@@ -60,7 +61,7 @@
   TextureType* ty = &s;
   EXPECT_FALSE(ty->Is<DepthTextureType>());
   EXPECT_TRUE(ty->Is<MultisampledTextureType>());
-  EXPECT_FALSE(ty->IsSampled());
+  EXPECT_FALSE(ty->Is<SampledTextureType>());
   EXPECT_FALSE(ty->Is<StorageTextureType>());
 }
 
diff --git a/src/ast/type/sampled_texture_type.cc b/src/ast/type/sampled_texture_type.cc
index 78576b7..dc03beb 100644
--- a/src/ast/type/sampled_texture_type.cc
+++ b/src/ast/type/sampled_texture_type.cc
@@ -30,10 +30,6 @@
 
 SampledTextureType::~SampledTextureType() = default;
 
-bool SampledTextureType::IsSampled() const {
-  return true;
-}
-
 std::string SampledTextureType::type_name() const {
   std::ostringstream out;
   out << "__sampled_texture_" << dim() << type_->type_name();
diff --git a/src/ast/type/sampled_texture_type.h b/src/ast/type/sampled_texture_type.h
index 3b1fb3f..a270a95 100644
--- a/src/ast/type/sampled_texture_type.h
+++ b/src/ast/type/sampled_texture_type.h
@@ -34,9 +34,6 @@
   SampledTextureType(SampledTextureType&&);
   ~SampledTextureType() override;
 
-  /// @returns true if the type is a sampled texture type
-  bool IsSampled() const override;
-
   /// @returns the subtype of the sampled texture
   Type* type() const { return type_; }
 
diff --git a/src/ast/type/sampled_texture_type_test.cc b/src/ast/type/sampled_texture_type_test.cc
index ed6344f..f0049a4 100644
--- a/src/ast/type/sampled_texture_type_test.cc
+++ b/src/ast/type/sampled_texture_type_test.cc
@@ -59,7 +59,7 @@
   SampledTextureType s(TextureDimension::kCube, &f32);
   TextureType* ty = &s;
   EXPECT_FALSE(ty->Is<DepthTextureType>());
-  EXPECT_TRUE(ty->IsSampled());
+  EXPECT_TRUE(ty->Is<SampledTextureType>());
   EXPECT_FALSE(ty->Is<StorageTextureType>());
 }
 
diff --git a/src/ast/type/storage_texture_type_test.cc b/src/ast/type/storage_texture_type_test.cc
index 9062d7d..0f29099 100644
--- a/src/ast/type/storage_texture_type_test.cc
+++ b/src/ast/type/storage_texture_type_test.cc
@@ -26,6 +26,7 @@
 #include "src/ast/type/i32_type.h"
 #include "src/ast/type/matrix_type.h"
 #include "src/ast/type/pointer_type.h"
+#include "src/ast/type/sampled_texture_type.h"
 #include "src/ast/type/struct_type.h"
 #include "src/ast/type/u32_type.h"
 #include "src/ast/type/vector_type.h"
@@ -62,7 +63,7 @@
                        ImageFormat::kRgba32Float);
   TextureType* ty = &s;
   EXPECT_FALSE(ty->Is<DepthTextureType>());
-  EXPECT_FALSE(ty->IsSampled());
+  EXPECT_FALSE(ty->Is<SampledTextureType>());
   EXPECT_TRUE(ty->Is<StorageTextureType>());
 }
 
diff --git a/src/ast/type/texture_type.cc b/src/ast/type/texture_type.cc
index 14c698e..453dcd0 100644
--- a/src/ast/type/texture_type.cc
+++ b/src/ast/type/texture_type.cc
@@ -59,20 +59,6 @@
 
 TextureType::~TextureType() = default;
 
-bool TextureType::IsSampled() const {
-  return false;
-}
-
-const SampledTextureType* TextureType::AsSampled() const {
-  assert(IsSampled());
-  return static_cast<const SampledTextureType*>(this);
-}
-
-SampledTextureType* TextureType::AsSampled() {
-  assert(IsSampled());
-  return static_cast<SampledTextureType*>(this);
-}
-
 }  // namespace type
 }  // namespace ast
 }  // namespace tint
diff --git a/src/ast/type/texture_type.h b/src/ast/type/texture_type.h
index f3047df..aa8db9f 100644
--- a/src/ast/type/texture_type.h
+++ b/src/ast/type/texture_type.h
@@ -24,8 +24,6 @@
 namespace ast {
 namespace type {
 
-class SampledTextureType;
-
 /// The dimensionality of the texture
 enum class TextureDimension {
   /// Invalid texture
@@ -60,15 +58,6 @@
   /// @returns the texture dimension
   TextureDimension dim() const { return dim_; }
 
-  /// @returns true if this is a sampled texture
-  virtual bool IsSampled() const;
-
-  /// @returns the texture as a sampled texture
-  const SampledTextureType* AsSampled() const;
-
-  /// @returns the texture as a sampled texture
-  SampledTextureType* AsSampled();
-
  private:
   TextureDimension dim_ = TextureDimension::k1d;
 };
diff --git a/src/inspector/inspector.cc b/src/inspector/inspector.cc
index 5cacc0f..7a62f3f 100644
--- a/src/inspector/inspector.cc
+++ b/src/inspector/inspector.cc
@@ -386,7 +386,9 @@
                       ->type()
                       ->UnwrapIfNeeded();
     } else {
-      base_type = texture_type->AsSampled()->type()->UnwrapIfNeeded();
+      base_type = texture_type->As<ast::type::SampledTextureType>()
+                      ->type()
+                      ->UnwrapIfNeeded();
     }
 
     if (base_type->Is<ast::type::ArrayType>()) {
diff --git a/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc b/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
index 4dcb422..1827766 100644
--- a/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
+++ b/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
@@ -80,11 +80,9 @@
   EXPECT_FALSE(t.errored);
   ASSERT_NE(t.value, nullptr);
   ASSERT_TRUE(t->Is<ast::type::TextureType>());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()->IsSampled());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()
-                  ->AsSampled()
-                  ->type()
-                  ->Is<ast::type::F32Type>());
+  ASSERT_TRUE(t->Is<ast::type::SampledTextureType>());
+  ASSERT_TRUE(
+      t->As<ast::type::SampledTextureType>()->type()->Is<ast::type::F32Type>());
   EXPECT_EQ(t->As<ast::type::TextureType>()->dim(),
             ast::type::TextureDimension::k1d);
 }
@@ -97,11 +95,9 @@
   EXPECT_FALSE(t.errored);
   ASSERT_NE(t.value, nullptr);
   ASSERT_TRUE(t->Is<ast::type::TextureType>());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()->IsSampled());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()
-                  ->AsSampled()
-                  ->type()
-                  ->Is<ast::type::I32Type>());
+  ASSERT_TRUE(t->Is<ast::type::SampledTextureType>());
+  ASSERT_TRUE(
+      t->As<ast::type::SampledTextureType>()->type()->Is<ast::type::I32Type>());
   EXPECT_EQ(t->As<ast::type::TextureType>()->dim(),
             ast::type::TextureDimension::k2d);
 }
@@ -114,11 +110,9 @@
   EXPECT_FALSE(t.errored);
   ASSERT_NE(t.value, nullptr);
   ASSERT_TRUE(t->Is<ast::type::TextureType>());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()->IsSampled());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()
-                  ->AsSampled()
-                  ->type()
-                  ->Is<ast::type::U32Type>());
+  ASSERT_TRUE(t->Is<ast::type::SampledTextureType>());
+  ASSERT_TRUE(
+      t->As<ast::type::SampledTextureType>()->type()->Is<ast::type::U32Type>());
   EXPECT_EQ(t->As<ast::type::TextureType>()->dim(),
             ast::type::TextureDimension::k3d);
 }
@@ -172,11 +166,9 @@
   EXPECT_FALSE(t.errored);
   ASSERT_NE(t.value, nullptr);
   ASSERT_TRUE(t->Is<ast::type::TextureType>());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()->IsSampled());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()
-                  ->AsSampled()
-                  ->type()
-                  ->Is<ast::type::F32Type>());
+  ASSERT_TRUE(t->Is<ast::type::SampledTextureType>());
+  ASSERT_TRUE(
+      t->As<ast::type::SampledTextureType>()->type()->Is<ast::type::F32Type>());
   EXPECT_EQ(t->As<ast::type::TextureType>()->dim(),
             ast::type::TextureDimension::k1d);
 }
@@ -189,11 +181,9 @@
   EXPECT_FALSE(t.errored);
   ASSERT_NE(t.value, nullptr);
   ASSERT_TRUE(t->Is<ast::type::TextureType>());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()->IsSampled());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()
-                  ->AsSampled()
-                  ->type()
-                  ->Is<ast::type::I32Type>());
+  ASSERT_TRUE(t->Is<ast::type::SampledTextureType>());
+  ASSERT_TRUE(
+      t->As<ast::type::SampledTextureType>()->type()->Is<ast::type::I32Type>());
   EXPECT_EQ(t->As<ast::type::TextureType>()->dim(),
             ast::type::TextureDimension::k2d);
 }
@@ -206,11 +196,9 @@
   EXPECT_FALSE(t.errored);
   ASSERT_NE(t.value, nullptr);
   ASSERT_TRUE(t->Is<ast::type::TextureType>());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()->IsSampled());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()
-                  ->AsSampled()
-                  ->type()
-                  ->Is<ast::type::U32Type>());
+  ASSERT_TRUE(t->Is<ast::type::SampledTextureType>());
+  ASSERT_TRUE(
+      t->As<ast::type::SampledTextureType>()->type()->Is<ast::type::U32Type>());
   EXPECT_EQ(t->As<ast::type::TextureType>()->dim(),
             ast::type::TextureDimension::k3d);
 }
diff --git a/src/reader/wgsl/parser_impl_type_decl_test.cc b/src/reader/wgsl/parser_impl_type_decl_test.cc
index 24ac3cd..29c509c 100644
--- a/src/reader/wgsl/parser_impl_type_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_type_decl_test.cc
@@ -765,11 +765,9 @@
   ASSERT_NE(t.value, nullptr) << p->error();
   EXPECT_EQ(t.value, type);
   ASSERT_TRUE(t->Is<ast::type::TextureType>());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()->IsSampled());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()
-                  ->AsSampled()
-                  ->type()
-                  ->Is<ast::type::F32Type>());
+  ASSERT_TRUE(t->Is<ast::type::SampledTextureType>());
+  ASSERT_TRUE(
+      t->As<ast::type::SampledTextureType>()->type()->Is<ast::type::F32Type>());
 }
 
 TEST_F(ParserImplTest, TypeDecl_Texture) {
@@ -786,11 +784,9 @@
   ASSERT_NE(t.value, nullptr);
   EXPECT_EQ(t.value, type);
   ASSERT_TRUE(t->Is<ast::type::TextureType>());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()->IsSampled());
-  ASSERT_TRUE(t->As<ast::type::TextureType>()
-                  ->AsSampled()
-                  ->type()
-                  ->Is<ast::type::F32Type>());
+  ASSERT_TRUE(t->Is<ast::type::SampledTextureType>());
+  ASSERT_TRUE(
+      t->As<ast::type::SampledTextureType>()->type()->Is<ast::type::F32Type>());
 }
 
 }  // namespace
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index ffe72d0..40f55a7 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -672,7 +672,7 @@
     }
 
     if (!texture->Is<ast::type::StorageTextureType>() &&
-        !(texture->IsSampled() ||
+        !(texture->Is<ast::type::SampledTextureType>() ||
           texture->Is<ast::type::MultisampledTextureType>())) {
       set_error(expr->source(), "invalid texture for " + ident->name());
       return false;
@@ -681,8 +681,8 @@
     ast::type::Type* type = nullptr;
     if (texture->Is<ast::type::StorageTextureType>()) {
       type = texture->As<ast::type::StorageTextureType>()->type();
-    } else if (texture->IsSampled()) {
-      type = texture->AsSampled()->type();
+    } else if (texture->Is<ast::type::SampledTextureType>()) {
+      type = texture->As<ast::type::SampledTextureType>()->type();
     } else if (texture->Is<ast::type::MultisampledTextureType>()) {
       type = texture->As<ast::type::MultisampledTextureType>()->type();
     } else {
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 6205aa8..0bd9116 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -1900,8 +1900,8 @@
         return false;
       }
       out_ << ", access::sample";
-    } else if (tex->IsSampled()) {
-      if (!EmitType(tex->AsSampled()->type(), "")) {
+    } else if (tex->Is<ast::type::SampledTextureType>()) {
+      if (!EmitType(tex->As<ast::type::SampledTextureType>()->type(), "")) {
         return false;
       }
       out_ << ", access::sample";
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index bff08f4..8a56827 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -2501,7 +2501,7 @@
   if (dim == ast::type::TextureDimension::k1dArray ||
       dim == ast::type::TextureDimension::k1d) {
     dim_literal = SpvDim1D;
-    if (texture->IsSampled()) {
+    if (texture->Is<ast::type::SampledTextureType>()) {
       push_capability(SpvCapabilitySampled1D);
     } else {
       assert(texture->Is<ast::type::StorageTextureType>());
@@ -2528,12 +2528,14 @@
 
   uint32_t sampled_literal = 2u;
   if (texture->Is<ast::type::MultisampledTextureType>() ||
-      texture->IsSampled() || texture->Is<ast::type::DepthTextureType>()) {
+      texture->Is<ast::type::SampledTextureType>() ||
+      texture->Is<ast::type::DepthTextureType>()) {
     sampled_literal = 1u;
   }
 
   if (dim == ast::type::TextureDimension::kCubeArray) {
-    if (texture->IsSampled() || texture->Is<ast::type::DepthTextureType>()) {
+    if (texture->Is<ast::type::SampledTextureType>() ||
+        texture->Is<ast::type::DepthTextureType>()) {
       push_capability(SpvCapabilitySampledCubeArray);
     }
   }
@@ -2542,8 +2544,9 @@
   if (texture->Is<ast::type::DepthTextureType>()) {
     ast::type::F32Type f32;
     type_id = GenerateTypeIfNeeded(&f32);
-  } else if (texture->IsSampled()) {
-    type_id = GenerateTypeIfNeeded(texture->AsSampled()->type());
+  } else if (texture->Is<ast::type::SampledTextureType>()) {
+    type_id = GenerateTypeIfNeeded(
+        texture->As<ast::type::SampledTextureType>()->type());
   } else if (texture->Is<ast::type::MultisampledTextureType>()) {
     type_id = GenerateTypeIfNeeded(
         texture->As<ast::type::MultisampledTextureType>()->type());
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index f5f6015..2428187 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -472,7 +472,7 @@
     out_ << "texture_";
     if (texture->Is<ast::type::DepthTextureType>()) {
       out_ << "depth_";
-    } else if (texture->IsSampled()) {
+    } else if (texture->Is<ast::type::SampledTextureType>()) {
       /* nothing to emit */
     } else if (texture->Is<ast::type::MultisampledTextureType>()) {
       out_ << "multisampled_";
@@ -520,8 +520,8 @@
         return false;
     }
 
-    if (texture->IsSampled()) {
-      auto* sampled = texture->AsSampled();
+    if (texture->Is<ast::type::SampledTextureType>()) {
+      auto* sampled = texture->As<ast::type::SampledTextureType>();
 
       out_ << "<";
       if (!EmitType(sampled->type())) {