Replace VariableDecoration::(Is|As)Builtin with Castable

Change-Id: I49d970301c46cfe29d7b22e18abb443daa0c8073
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34307
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/binding_decoration_test.cc b/src/ast/binding_decoration_test.cc
index 7204c37..7bd236f 100644
--- a/src/ast/binding_decoration_test.cc
+++ b/src/ast/binding_decoration_test.cc
@@ -28,12 +28,13 @@
 }
 
 TEST_F(BindingDecorationTest, Is) {
-  BindingDecoration d{2, Source{}};
-  EXPECT_TRUE(d.Is<BindingDecoration>());
-  EXPECT_FALSE(d.IsBuiltin());
-  EXPECT_FALSE(d.IsConstantId());
-  EXPECT_FALSE(d.IsLocation());
-  EXPECT_FALSE(d.IsSet());
+  BindingDecoration bd{2, Source{}};
+  Decoration* d = &bd;
+  EXPECT_TRUE(d->Is<BindingDecoration>());
+  EXPECT_FALSE(d->Is<BuiltinDecoration>());
+  EXPECT_FALSE(bd.IsConstantId());
+  EXPECT_FALSE(bd.IsLocation());
+  EXPECT_FALSE(bd.IsSet());
 }
 
 TEST_F(BindingDecorationTest, ToStr) {
diff --git a/src/ast/builtin_decoration.cc b/src/ast/builtin_decoration.cc
index 34d48f5..856fc9a 100644
--- a/src/ast/builtin_decoration.cc
+++ b/src/ast/builtin_decoration.cc
@@ -22,10 +22,6 @@
 
 BuiltinDecoration::~BuiltinDecoration() = default;
 
-bool BuiltinDecoration::IsBuiltin() const {
-  return true;
-}
-
 void BuiltinDecoration::to_str(std::ostream& out, size_t indent) const {
   make_indent(out, indent);
   out << "BuiltinDecoration{" << builtin_ << "}" << std::endl;
diff --git a/src/ast/builtin_decoration.h b/src/ast/builtin_decoration.h
index 251a409..9f4636d 100644
--- a/src/ast/builtin_decoration.h
+++ b/src/ast/builtin_decoration.h
@@ -31,9 +31,6 @@
   BuiltinDecoration(Builtin builtin, const Source& source);
   ~BuiltinDecoration() override;
 
-  /// @returns true if this is a builtin decoration
-  bool IsBuiltin() const override;
-
   /// @returns the builtin value
   Builtin value() const { return builtin_; }
 
diff --git a/src/ast/builtin_decoration_test.cc b/src/ast/builtin_decoration_test.cc
index 438552b..d3e3702 100644
--- a/src/ast/builtin_decoration_test.cc
+++ b/src/ast/builtin_decoration_test.cc
@@ -31,7 +31,7 @@
   BuiltinDecoration bd{Builtin::kFragDepth, Source{}};
   Decoration* d = &bd;
   EXPECT_FALSE(d->Is<BindingDecoration>());
-  EXPECT_TRUE(bd.IsBuiltin());
+  EXPECT_TRUE(d->Is<BuiltinDecoration>());
   EXPECT_FALSE(bd.IsConstantId());
   EXPECT_FALSE(bd.IsLocation());
   EXPECT_FALSE(bd.IsSet());
diff --git a/src/ast/constant_id_decoration_test.cc b/src/ast/constant_id_decoration_test.cc
index f2b7c60..6df2495 100644
--- a/src/ast/constant_id_decoration_test.cc
+++ b/src/ast/constant_id_decoration_test.cc
@@ -31,7 +31,7 @@
   ConstantIdDecoration cd{27, Source{}};
   Decoration* d = &cd;
   EXPECT_FALSE(d->Is<BindingDecoration>());
-  EXPECT_FALSE(cd.IsBuiltin());
+  EXPECT_FALSE(d->Is<BuiltinDecoration>());
   EXPECT_TRUE(cd.IsConstantId());
   EXPECT_FALSE(cd.IsLocation());
   EXPECT_FALSE(cd.IsSet());
diff --git a/src/ast/decorated_variable.cc b/src/ast/decorated_variable.cc
index 9b30e57..dcf6da3 100644
--- a/src/ast/decorated_variable.cc
+++ b/src/ast/decorated_variable.cc
@@ -16,6 +16,7 @@
 
 #include <cassert>
 
+#include "src/ast/builtin_decoration.h"
 #include "src/ast/constant_id_decoration.h"
 
 namespace tint {
@@ -41,7 +42,7 @@
 
 bool DecoratedVariable::HasBuiltinDecoration() const {
   for (auto* deco : decorations_) {
-    if (deco->IsBuiltin()) {
+    if (deco->Is<BuiltinDecoration>()) {
       return true;
     }
   }
diff --git a/src/ast/function.cc b/src/ast/function.cc
index f13a898..555230b 100644
--- a/src/ast/function.cc
+++ b/src/ast/function.cc
@@ -163,8 +163,8 @@
       continue;
     }
     for (auto* deco : var->AsDecorated()->decorations()) {
-      if (deco->IsBuiltin()) {
-        ret.push_back({var, deco->AsBuiltin()});
+      if (auto* builtin = deco->As<BuiltinDecoration>()) {
+        ret.push_back({var, builtin});
         break;
       }
     }
diff --git a/src/ast/location_decoration_test.cc b/src/ast/location_decoration_test.cc
index d794925..e2c1b7c 100644
--- a/src/ast/location_decoration_test.cc
+++ b/src/ast/location_decoration_test.cc
@@ -33,7 +33,7 @@
   LocationDecoration ld{2, Source{}};
   Decoration* d = &ld;
   EXPECT_FALSE(d->Is<BindingDecoration>());
-  EXPECT_FALSE(ld.IsBuiltin());
+  EXPECT_FALSE(d->Is<BuiltinDecoration>());
   EXPECT_FALSE(ld.IsConstantId());
   EXPECT_TRUE(ld.IsLocation());
   EXPECT_FALSE(ld.IsSet());
diff --git a/src/ast/set_decoration_test.cc b/src/ast/set_decoration_test.cc
index e457573..df5afa1 100644
--- a/src/ast/set_decoration_test.cc
+++ b/src/ast/set_decoration_test.cc
@@ -31,7 +31,7 @@
   SetDecoration sd{2, Source{}};
   Decoration* d = &sd;
   EXPECT_FALSE(d->Is<BindingDecoration>());
-  EXPECT_FALSE(sd.IsBuiltin());
+  EXPECT_FALSE(d->Is<BuiltinDecoration>());
   EXPECT_FALSE(sd.IsConstantId());
   EXPECT_FALSE(sd.IsLocation());
   EXPECT_TRUE(sd.IsSet());
diff --git a/src/ast/variable_decoration.cc b/src/ast/variable_decoration.cc
index 5e902f1..3dfb875 100644
--- a/src/ast/variable_decoration.cc
+++ b/src/ast/variable_decoration.cc
@@ -35,10 +35,6 @@
   return Kind;
 }
 
-bool VariableDecoration::IsBuiltin() const {
-  return false;
-}
-
 bool VariableDecoration::IsLocation() const {
   return false;
 }
@@ -51,11 +47,6 @@
   return false;
 }
 
-BuiltinDecoration* VariableDecoration::AsBuiltin() {
-  assert(IsBuiltin());
-  return static_cast<BuiltinDecoration*>(this);
-}
-
 ConstantIdDecoration* VariableDecoration::AsConstantId() {
   assert(IsConstantId());
   return static_cast<ConstantIdDecoration*>(this);
diff --git a/src/ast/variable_decoration.h b/src/ast/variable_decoration.h
index a6b4f9b..c83d22b 100644
--- a/src/ast/variable_decoration.h
+++ b/src/ast/variable_decoration.h
@@ -25,7 +25,6 @@
 namespace tint {
 namespace ast {
 
-class BuiltinDecoration;
 class ConstantIdDecoration;
 class LocationDecoration;
 class SetDecoration;
@@ -41,8 +40,6 @@
   /// @return the decoration kind
   DecorationKind GetKind() const override;
 
-  /// @returns true if this is a builtin decoration
-  virtual bool IsBuiltin() const;
   /// @returns true if this is a constant id decoration
   virtual bool IsConstantId() const;
   /// @returns true if this is a location decoration
@@ -50,8 +47,6 @@
   /// @returns true if this is a set decoration
   virtual bool IsSet() const;
 
-  /// @returns the decoration as a builtin decoration
-  BuiltinDecoration* AsBuiltin();
   /// @returns the decoration as a constant id decoration
   ConstantIdDecoration* AsConstantId();
   /// @returns the decoration as a location decoration
diff --git a/src/reader/wgsl/parser_impl_variable_decoration_list_test.cc b/src/reader/wgsl/parser_impl_variable_decoration_list_test.cc
index 81f5356..50b5e29 100644
--- a/src/reader/wgsl/parser_impl_variable_decoration_list_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_decoration_list_test.cc
@@ -38,8 +38,9 @@
 
   ASSERT_TRUE(deco_0->IsLocation());
   EXPECT_EQ(deco_0->AsLocation()->value(), 4u);
-  ASSERT_TRUE(deco_1->IsBuiltin());
-  EXPECT_EQ(deco_1->AsBuiltin()->value(), ast::Builtin::kPosition);
+  ASSERT_TRUE(deco_1->Is<ast::BuiltinDecoration>());
+  EXPECT_EQ(deco_1->As<ast::BuiltinDecoration>()->value(),
+            ast::Builtin::kPosition);
 }
 
 TEST_F(ParserImplTest, VariableDecorationList_Empty) {
diff --git a/src/reader/wgsl/parser_impl_variable_decoration_test.cc b/src/reader/wgsl/parser_impl_variable_decoration_test.cc
index 33ba645..3c9cdcb 100644
--- a/src/reader/wgsl/parser_impl_variable_decoration_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_decoration_test.cc
@@ -104,9 +104,9 @@
   auto* var_deco = deco.value->As<ast::VariableDecoration>();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(var_deco, nullptr);
-  ASSERT_TRUE(var_deco->IsBuiltin());
+  ASSERT_TRUE(var_deco->Is<ast::BuiltinDecoration>());
 
-  auto* builtin = var_deco->AsBuiltin();
+  auto* builtin = var_deco->As<ast::BuiltinDecoration>();
   EXPECT_EQ(builtin->value(), params.result);
 }
 INSTANTIATE_TEST_SUITE_P(
diff --git a/src/transform/vertex_pulling_transform.cc b/src/transform/vertex_pulling_transform.cc
index 4d7a6e3..05a6ab0 100644
--- a/src/transform/vertex_pulling_transform.cc
+++ b/src/transform/vertex_pulling_transform.cc
@@ -127,8 +127,9 @@
     }
 
     for (auto* d : v->AsDecorated()->decorations()) {
-      if (d->IsBuiltin() &&
-          d->AsBuiltin()->value() == ast::Builtin::kVertexIdx) {
+      if (d->Is<ast::BuiltinDecoration>() &&
+          d->As<ast::BuiltinDecoration>()->value() ==
+              ast::Builtin::kVertexIdx) {
         vertex_index_name_ = v->name();
         return;
       }
@@ -169,8 +170,9 @@
     }
 
     for (auto* d : v->AsDecorated()->decorations()) {
-      if (d->IsBuiltin() &&
-          d->AsBuiltin()->value() == ast::Builtin::kInstanceIdx) {
+      if (d->Is<ast::BuiltinDecoration>() &&
+          d->As<ast::BuiltinDecoration>()->value() ==
+              ast::Builtin::kInstanceIdx) {
         instance_index_name_ = v->name();
         return;
       }
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index b9f16d72..a8d14d4 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -1383,8 +1383,9 @@
           return false;
         }
         out << "TEXCOORD" << deco->AsLocation()->value();
-      } else if (deco->IsBuiltin()) {
-        auto attr = builtin_to_attribute(deco->AsBuiltin()->value());
+      } else if (deco->Is<ast::BuiltinDecoration>()) {
+        auto attr =
+            builtin_to_attribute(deco->As<ast::BuiltinDecoration>()->value());
         if (attr.empty()) {
           error_ = "unsupported builtin";
           return false;
@@ -1433,8 +1434,9 @@
           error_ = "invalid location variable for pipeline stage";
           return false;
         }
-      } else if (deco->IsBuiltin()) {
-        auto attr = builtin_to_attribute(deco->AsBuiltin()->value());
+      } else if (deco->Is<ast::BuiltinDecoration>()) {
+        auto attr =
+            builtin_to_attribute(deco->As<ast::BuiltinDecoration>()->value());
         if (attr.empty()) {
           error_ = "unsupported builtin";
           return false;
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 0bd9116..d38c9d9 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -1070,8 +1070,9 @@
           error_ = "invalid location variable for pipeline stage";
           return false;
         }
-      } else if (deco->IsBuiltin()) {
-        auto attr = builtin_to_attribute(deco->AsBuiltin()->value());
+      } else if (deco->Is<ast::BuiltinDecoration>()) {
+        auto attr =
+            builtin_to_attribute(deco->As<ast::BuiltinDecoration>()->value());
         if (attr.empty()) {
           error_ = "unsupported builtin";
           return false;
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index a4a4840..c7123100 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -779,10 +779,10 @@
 
   if (var->IsDecorated()) {
     for (auto* deco : var->AsDecorated()->decorations()) {
-      if (deco->IsBuiltin()) {
+      if (auto* builtin = deco->As<ast::BuiltinDecoration>()) {
         push_annot(spv::Op::OpDecorate,
                    {Operand::Int(var_id), Operand::Int(SpvDecorationBuiltIn),
-                    Operand::Int(ConvertBuiltin(deco->AsBuiltin()->value()))});
+                    Operand::Int(ConvertBuiltin(builtin->value()))});
       } else if (deco->IsLocation()) {
         push_annot(spv::Op::OpDecorate,
                    {Operand::Int(var_id), Operand::Int(SpvDecorationLocation),
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index e2dda1c..b0d3fa5 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -647,8 +647,8 @@
       out_ << "set(" << deco->AsSet()->value() << ")";
     } else if (deco->IsLocation()) {
       out_ << "location(" << deco->AsLocation()->value() << ")";
-    } else if (deco->IsBuiltin()) {
-      out_ << "builtin(" << deco->AsBuiltin()->value() << ")";
+    } else if (auto* builtin = deco->As<ast::BuiltinDecoration>()) {
+      out_ << "builtin(" << builtin->value() << ")";
     } else if (deco->IsConstantId()) {
       out_ << "constant_id(" << deco->AsConstantId()->value() << ")";
     } else {