Replace Type::(Is|As)Sampler with Castable

Change-Id: Iaa43e607199e25308ecb121c61bb7a37abff197c
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34270
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/function.cc b/src/ast/function.cc
index da18d53..2dc9c21 100644
--- a/src/ast/function.cc
+++ b/src/ast/function.cc
@@ -281,8 +281,8 @@
 
   for (auto* var : referenced_module_variables()) {
     auto* unwrapped_type = var->type()->UnwrapIfNeeded();
-    if (!var->IsDecorated() || !unwrapped_type->IsSampler() ||
-        unwrapped_type->AsSampler()->kind() != kind) {
+    if (!var->IsDecorated() || !unwrapped_type->Is<ast::type::SamplerType>() ||
+        unwrapped_type->As<ast::type::SamplerType>()->kind() != kind) {
       continue;
     }
 
diff --git a/src/ast/type/access_control_type_test.cc b/src/ast/type/access_control_type_test.cc
index 5ea362d..2557a53 100644
--- a/src/ast/type/access_control_type_test.cc
+++ b/src/ast/type/access_control_type_test.cc
@@ -59,7 +59,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_FALSE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/alias_type_test.cc b/src/ast/type/alias_type_test.cc
index b4507ca..8be31d0 100644
--- a/src/ast/type/alias_type_test.cc
+++ b/src/ast/type/alias_type_test.cc
@@ -60,7 +60,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_FALSE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/array_type_test.cc b/src/ast/type/array_type_test.cc
index f45bc15..8ade7c4 100644
--- a/src/ast/type/array_type_test.cc
+++ b/src/ast/type/array_type_test.cc
@@ -65,7 +65,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_FALSE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/bool_type_test.cc b/src/ast/type/bool_type_test.cc
index 3952c9a..9aa14a4 100644
--- a/src/ast/type/bool_type_test.cc
+++ b/src/ast/type/bool_type_test.cc
@@ -40,7 +40,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_FALSE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/depth_texture_type_test.cc b/src/ast/type/depth_texture_type_test.cc
index 3a58197..089c696 100644
--- a/src/ast/type/depth_texture_type_test.cc
+++ b/src/ast/type/depth_texture_type_test.cc
@@ -42,7 +42,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_TRUE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/f32_type_test.cc b/src/ast/type/f32_type_test.cc
index 01622af..6918a1f 100644
--- a/src/ast/type/f32_type_test.cc
+++ b/src/ast/type/f32_type_test.cc
@@ -40,7 +40,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_FALSE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/i32_type_test.cc b/src/ast/type/i32_type_test.cc
index ff22000..d0fa3fe 100644
--- a/src/ast/type/i32_type_test.cc
+++ b/src/ast/type/i32_type_test.cc
@@ -40,7 +40,7 @@
   EXPECT_TRUE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_FALSE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/matrix_type_test.cc b/src/ast/type/matrix_type_test.cc
index e203c36..c1af49f 100644
--- a/src/ast/type/matrix_type_test.cc
+++ b/src/ast/type/matrix_type_test.cc
@@ -49,7 +49,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_TRUE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_FALSE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/multisampled_texture_type_test.cc b/src/ast/type/multisampled_texture_type_test.cc
index 1e9b67e..52fca6f 100644
--- a/src/ast/type/multisampled_texture_type_test.cc
+++ b/src/ast/type/multisampled_texture_type_test.cc
@@ -42,7 +42,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_TRUE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/pointer_type_test.cc b/src/ast/type/pointer_type_test.cc
index 7350824..3166db5 100644
--- a/src/ast/type/pointer_type_test.cc
+++ b/src/ast/type/pointer_type_test.cc
@@ -48,7 +48,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_TRUE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_FALSE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/sampled_texture_type_test.cc b/src/ast/type/sampled_texture_type_test.cc
index be16aeb..4790229 100644
--- a/src/ast/type/sampled_texture_type_test.cc
+++ b/src/ast/type/sampled_texture_type_test.cc
@@ -42,7 +42,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_TRUE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/sampler_type.cc b/src/ast/type/sampler_type.cc
index ccbd3fa..c183b43 100644
--- a/src/ast/type/sampler_type.cc
+++ b/src/ast/type/sampler_type.cc
@@ -36,10 +36,6 @@
 
 SamplerType::~SamplerType() = default;
 
-bool SamplerType::IsSampler() const {
-  return true;
-}
-
 std::string SamplerType::type_name() const {
   return std::string("__sampler_") +
          (kind_ == SamplerKind::kSampler ? "sampler" : "comparison");
diff --git a/src/ast/type/sampler_type.h b/src/ast/type/sampler_type.h
index d064a88..c83c44a 100644
--- a/src/ast/type/sampler_type.h
+++ b/src/ast/type/sampler_type.h
@@ -43,9 +43,6 @@
   SamplerType(SamplerType&&);
   ~SamplerType() override;
 
-  /// @returns true if the type is a sampler type
-  bool IsSampler() const override;
-
   /// @returns the sampler type
   SamplerKind kind() const { return kind_; }
 
diff --git a/src/ast/type/sampler_type_test.cc b/src/ast/type/sampler_type_test.cc
index 42210bc..4bdc6e4 100644
--- a/src/ast/type/sampler_type_test.cc
+++ b/src/ast/type/sampler_type_test.cc
@@ -52,7 +52,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_TRUE(ty->IsSampler());
+  EXPECT_TRUE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_FALSE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/storage_texture_type_test.cc b/src/ast/type/storage_texture_type_test.cc
index f7764d1..43a0d29 100644
--- a/src/ast/type/storage_texture_type_test.cc
+++ b/src/ast/type/storage_texture_type_test.cc
@@ -46,7 +46,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_TRUE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/struct_type_test.cc b/src/ast/type/struct_type_test.cc
index 8667acf..c13caa2 100644
--- a/src/ast/type/struct_type_test.cc
+++ b/src/ast/type/struct_type_test.cc
@@ -57,7 +57,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_TRUE(ty->IsStruct());
   EXPECT_FALSE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/ast/type/type.cc b/src/ast/type/type.cc
index affca72..1e8ed5c 100644
--- a/src/ast/type/type.cc
+++ b/src/ast/type/type.cc
@@ -66,10 +66,6 @@
   return UnwrapIfNeeded()->UnwrapPtrIfNeeded()->UnwrapIfNeeded();
 }
 
-bool Type::IsSampler() const {
-  return false;
-}
-
 bool Type::IsStruct() const {
   return false;
 }
@@ -142,11 +138,6 @@
   return is_unsigned_scalar_or_vector() || is_signed_scalar_or_vector();
 }
 
-const SamplerType* Type::AsSampler() const {
-  assert(IsSampler());
-  return static_cast<const SamplerType*>(this);
-}
-
 const StructType* Type::AsStruct() const {
   assert(IsStruct());
   return static_cast<const StructType*>(this);
@@ -172,11 +163,6 @@
   return static_cast<const VoidType*>(this);
 }
 
-SamplerType* Type::AsSampler() {
-  assert(IsSampler());
-  return static_cast<SamplerType*>(this);
-}
-
 StructType* Type::AsStruct() {
   assert(IsStruct());
   return static_cast<StructType*>(this);
diff --git a/src/ast/type/type.h b/src/ast/type/type.h
index 93a9fb8..805c058 100644
--- a/src/ast/type/type.h
+++ b/src/ast/type/type.h
@@ -23,7 +23,6 @@
 namespace ast {
 namespace type {
 
-class SamplerType;
 class StructType;
 class TextureType;
 class U32Type;
@@ -40,8 +39,6 @@
   Type(Type&&);
   ~Type() override;
 
-  /// @returns true if the type is a sampler
-  virtual bool IsSampler() const;
   /// @returns true if the type is a struct type
   virtual bool IsStruct() const;
   /// @returns true if the type is a texture type
@@ -107,8 +104,6 @@
   /// @returns true if this type is an integer scalar or vector
   bool is_integer_scalar_or_vector();
 
-  /// @returns the type as a sampler type
-  const SamplerType* AsSampler() const;
   /// @returns the type as a struct type
   const StructType* AsStruct() const;
   /// @returns the type as a texture type
@@ -120,8 +115,6 @@
   /// @returns the type as a void type
   const VoidType* AsVoid() const;
 
-  /// @returns the type as a sampler type
-  SamplerType* AsSampler();
   /// @returns the type as a struct type
   StructType* AsStruct();
   /// @returns the type as a texture type
diff --git a/src/ast/type/u32_type_test.cc b/src/ast/type/u32_type_test.cc
index 60a946b..77b2e40 100644
--- a/src/ast/type/u32_type_test.cc
+++ b/src/ast/type/u32_type_test.cc
@@ -22,6 +22,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/sampler_type.h"
 
 namespace tint {
 namespace ast {
@@ -41,7 +42,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_FALSE(ty->IsTexture());
   EXPECT_TRUE(ty->IsU32());
diff --git a/src/ast/type/vector_type_test.cc b/src/ast/type/vector_type_test.cc
index d59d96f..94a8b3f 100644
--- a/src/ast/type/vector_type_test.cc
+++ b/src/ast/type/vector_type_test.cc
@@ -49,7 +49,7 @@
   EXPECT_FALSE(ty->Is<I32Type>());
   EXPECT_FALSE(ty->Is<MatrixType>());
   EXPECT_FALSE(ty->Is<PointerType>());
-  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->Is<SamplerType>());
   EXPECT_FALSE(ty->IsStruct());
   EXPECT_FALSE(ty->IsTexture());
   EXPECT_FALSE(ty->IsU32());
diff --git a/src/reader/wgsl/parser_impl_sampler_type_test.cc b/src/reader/wgsl/parser_impl_sampler_type_test.cc
index 76e376a..5b17627 100644
--- a/src/reader/wgsl/parser_impl_sampler_type_test.cc
+++ b/src/reader/wgsl/parser_impl_sampler_type_test.cc
@@ -37,8 +37,8 @@
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
   ASSERT_NE(t.value, nullptr);
-  ASSERT_TRUE(t->IsSampler());
-  EXPECT_FALSE(t->AsSampler()->IsComparison());
+  ASSERT_TRUE(t->Is<ast::type::SamplerType>());
+  EXPECT_FALSE(t->As<ast::type::SamplerType>()->IsComparison());
   EXPECT_FALSE(p->has_error());
 }
 
@@ -48,8 +48,8 @@
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
   ASSERT_NE(t.value, nullptr);
-  ASSERT_TRUE(t->IsSampler());
-  EXPECT_TRUE(t->AsSampler()->IsComparison());
+  ASSERT_TRUE(t->Is<ast::type::SamplerType>());
+  EXPECT_TRUE(t->As<ast::type::SamplerType>()->IsComparison());
   EXPECT_FALSE(p->has_error());
 }
 
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 c1eb2c6..463533d 100644
--- a/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
+++ b/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
@@ -42,8 +42,8 @@
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
   ASSERT_NE(t.value, nullptr);
-  ASSERT_TRUE(t->IsSampler());
-  ASSERT_FALSE(t->AsSampler()->IsComparison());
+  ASSERT_TRUE(t->Is<ast::type::SamplerType>());
+  ASSERT_FALSE(t->As<ast::type::SamplerType>()->IsComparison());
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SamplerComparison) {
@@ -53,8 +53,8 @@
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
   ASSERT_NE(t.value, nullptr);
-  ASSERT_TRUE(t->IsSampler());
-  ASSERT_TRUE(t->AsSampler()->IsComparison());
+  ASSERT_TRUE(t->Is<ast::type::SamplerType>());
+  ASSERT_TRUE(t->As<ast::type::SamplerType>()->IsComparison());
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_DepthTexture) {
diff --git a/src/reader/wgsl/parser_impl_type_decl_test.cc b/src/reader/wgsl/parser_impl_type_decl_test.cc
index 5943dab..0472dae 100644
--- a/src/reader/wgsl/parser_impl_type_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_type_decl_test.cc
@@ -747,8 +747,8 @@
   EXPECT_FALSE(t.errored);
   ASSERT_NE(t.value, nullptr) << p->error();
   EXPECT_EQ(t.value, type);
-  ASSERT_TRUE(t->IsSampler());
-  ASSERT_FALSE(t->AsSampler()->IsComparison());
+  ASSERT_TRUE(t->Is<ast::type::SamplerType>());
+  ASSERT_FALSE(t->As<ast::type::SamplerType>()->IsComparison());
 }
 
 TEST_F(ParserImplTest, TypeDecl_Texture_Old) {
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index a697caa..525d8a1 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -2079,8 +2079,8 @@
     // https://bugs.chromium.org/p/tint/issues/detail?id=183
     error_ = "pointers not supported in HLSL";
     return false;
-  } else if (type->IsSampler()) {
-    auto* sampler = type->AsSampler();
+  } else if (type->Is<ast::type::SamplerType>()) {
+    auto* sampler = type->As<ast::type::SamplerType>();
     out << "Sampler";
     if (sampler->IsComparison()) {
       out << "Comparison";
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 762cd9a..695ccfd 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -1832,7 +1832,7 @@
       return false;
     }
     out_ << "*";
-  } else if (type->IsSampler()) {
+  } else if (type->Is<ast::type::SamplerType>()) {
     out_ << "sampler";
   } else if (type->IsStruct()) {
     // The struct type emits as just the name. The declaration would be emitted
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 0906c6f..590f467 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -734,7 +734,7 @@
           break;
       }
     }
-  } else if (!type->IsSampler()) {
+  } else if (!type->Is<ast::type::SamplerType>()) {
     // Certain cases require us to generate a constructor value.
     //
     // 1- ConstantId's must be attached to the OpConstant, if we have a
@@ -2452,7 +2452,7 @@
     if (!GenerateTextureType(type->AsTexture(), result)) {
       return 0;
     }
-  } else if (type->IsSampler()) {
+  } else if (type->Is<ast::type::SamplerType>()) {
     push_type(spv::Op::OpTypeSampler, {result});
 
     // Register both of the sampler type names. In SPIR-V they're the same
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index e9ed0e8..52fa961 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -453,8 +453,8 @@
       return false;
     }
     out_ << ">";
-  } else if (type->IsSampler()) {
-    auto* sampler = type->AsSampler();
+  } else if (type->Is<ast::type::SamplerType>()) {
+    auto* sampler = type->As<ast::type::SamplerType>();
     out_ << "sampler";
 
     if (sampler->IsComparison()) {