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

Change-Id: I3f402fe8925ef7d5c9b3d5b21f2556d7af59a0cd
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34308
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/binding_decoration_test.cc b/src/ast/binding_decoration_test.cc
index 7bd236f..e3889e2 100644
--- a/src/ast/binding_decoration_test.cc
+++ b/src/ast/binding_decoration_test.cc
@@ -15,6 +15,7 @@
 #include "src/ast/binding_decoration.h"
 
 #include "src/ast/test_helper.h"
+#include "src/ast/constant_id_decoration.h"
 
 namespace tint {
 namespace ast {
@@ -32,7 +33,7 @@
   Decoration* d = &bd;
   EXPECT_TRUE(d->Is<BindingDecoration>());
   EXPECT_FALSE(d->Is<BuiltinDecoration>());
-  EXPECT_FALSE(bd.IsConstantId());
+  EXPECT_FALSE(d->Is<ConstantIdDecoration>());
   EXPECT_FALSE(bd.IsLocation());
   EXPECT_FALSE(bd.IsSet());
 }
diff --git a/src/ast/builtin_decoration_test.cc b/src/ast/builtin_decoration_test.cc
index d3e3702..b0fa0ff 100644
--- a/src/ast/builtin_decoration_test.cc
+++ b/src/ast/builtin_decoration_test.cc
@@ -14,6 +14,7 @@
 
 #include "src/ast/builtin_decoration.h"
 
+#include "src/ast/constant_id_decoration.h"
 #include "src/ast/test_helper.h"
 
 namespace tint {
@@ -32,7 +33,7 @@
   Decoration* d = &bd;
   EXPECT_FALSE(d->Is<BindingDecoration>());
   EXPECT_TRUE(d->Is<BuiltinDecoration>());
-  EXPECT_FALSE(bd.IsConstantId());
+  EXPECT_FALSE(d->Is<ConstantIdDecoration>());
   EXPECT_FALSE(bd.IsLocation());
   EXPECT_FALSE(bd.IsSet());
 }
diff --git a/src/ast/constant_id_decoration.cc b/src/ast/constant_id_decoration.cc
index 86eaa7a..6b10150 100644
--- a/src/ast/constant_id_decoration.cc
+++ b/src/ast/constant_id_decoration.cc
@@ -22,10 +22,6 @@
 
 ConstantIdDecoration::~ConstantIdDecoration() = default;
 
-bool ConstantIdDecoration::IsConstantId() const {
-  return true;
-}
-
 void ConstantIdDecoration::to_str(std::ostream& out, size_t indent) const {
   make_indent(out, indent);
   out << "ConstantIdDecoration{" << value_ << "}" << std::endl;
diff --git a/src/ast/constant_id_decoration.h b/src/ast/constant_id_decoration.h
index 0a1192f..d7a0256 100644
--- a/src/ast/constant_id_decoration.h
+++ b/src/ast/constant_id_decoration.h
@@ -31,9 +31,6 @@
   ConstantIdDecoration(uint32_t val, const Source& source);
   ~ConstantIdDecoration() override;
 
-  /// @returns true if this is a constant_id decoration
-  bool IsConstantId() const override;
-
   /// @returns the constant id value
   uint32_t value() const { return value_; }
 
diff --git a/src/ast/constant_id_decoration_test.cc b/src/ast/constant_id_decoration_test.cc
index 6df2495..d784b44 100644
--- a/src/ast/constant_id_decoration_test.cc
+++ b/src/ast/constant_id_decoration_test.cc
@@ -32,7 +32,7 @@
   Decoration* d = &cd;
   EXPECT_FALSE(d->Is<BindingDecoration>());
   EXPECT_FALSE(d->Is<BuiltinDecoration>());
-  EXPECT_TRUE(cd.IsConstantId());
+  EXPECT_TRUE(d->Is<ConstantIdDecoration>());
   EXPECT_FALSE(cd.IsLocation());
   EXPECT_FALSE(cd.IsSet());
 }
diff --git a/src/ast/decorated_variable.cc b/src/ast/decorated_variable.cc
index dcf6da3..2e704b1 100644
--- a/src/ast/decorated_variable.cc
+++ b/src/ast/decorated_variable.cc
@@ -51,7 +51,7 @@
 
 bool DecoratedVariable::HasConstantIdDecoration() const {
   for (auto* deco : decorations_) {
-    if (deco->IsConstantId()) {
+    if (deco->Is<ConstantIdDecoration>()) {
       return true;
     }
   }
@@ -61,8 +61,8 @@
 uint32_t DecoratedVariable::constant_id() const {
   assert(HasConstantIdDecoration());
   for (auto* deco : decorations_) {
-    if (deco->IsConstantId()) {
-      return deco->AsConstantId()->value();
+    if (auto* cid = deco->As<ConstantIdDecoration>()) {
+      return cid->value();
     }
   }
   return 0;
diff --git a/src/ast/location_decoration_test.cc b/src/ast/location_decoration_test.cc
index e2c1b7c..2876899 100644
--- a/src/ast/location_decoration_test.cc
+++ b/src/ast/location_decoration_test.cc
@@ -16,6 +16,7 @@
 
 #include <sstream>
 
+#include "src/ast/constant_id_decoration.h"
 #include "src/ast/test_helper.h"
 
 namespace tint {
@@ -34,7 +35,7 @@
   Decoration* d = &ld;
   EXPECT_FALSE(d->Is<BindingDecoration>());
   EXPECT_FALSE(d->Is<BuiltinDecoration>());
-  EXPECT_FALSE(ld.IsConstantId());
+  EXPECT_FALSE(d->Is<ConstantIdDecoration>());
   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 df5afa1..ceac9a7 100644
--- a/src/ast/set_decoration_test.cc
+++ b/src/ast/set_decoration_test.cc
@@ -14,6 +14,7 @@
 
 #include "src/ast/set_decoration.h"
 
+#include "src/ast/constant_id_decoration.h"
 #include "src/ast/test_helper.h"
 
 namespace tint {
@@ -32,7 +33,7 @@
   Decoration* d = &sd;
   EXPECT_FALSE(d->Is<BindingDecoration>());
   EXPECT_FALSE(d->Is<BuiltinDecoration>());
-  EXPECT_FALSE(sd.IsConstantId());
+  EXPECT_FALSE(d->Is<ConstantIdDecoration>());
   EXPECT_FALSE(sd.IsLocation());
   EXPECT_TRUE(sd.IsSet());
 }
diff --git a/src/ast/variable_decoration.cc b/src/ast/variable_decoration.cc
index 3dfb875..79e9562 100644
--- a/src/ast/variable_decoration.cc
+++ b/src/ast/variable_decoration.cc
@@ -16,9 +16,6 @@
 
 #include <assert.h>
 
-#include "src/ast/binding_decoration.h"
-#include "src/ast/builtin_decoration.h"
-#include "src/ast/constant_id_decoration.h"
 #include "src/ast/location_decoration.h"
 #include "src/ast/set_decoration.h"
 
@@ -39,19 +36,10 @@
   return false;
 }
 
-bool VariableDecoration::IsConstantId() const {
-  return false;
-}
-
 bool VariableDecoration::IsSet() const {
   return false;
 }
 
-ConstantIdDecoration* VariableDecoration::AsConstantId() {
-  assert(IsConstantId());
-  return static_cast<ConstantIdDecoration*>(this);
-}
-
 LocationDecoration* VariableDecoration::AsLocation() {
   assert(IsLocation());
   return static_cast<LocationDecoration*>(this);
diff --git a/src/ast/variable_decoration.h b/src/ast/variable_decoration.h
index c83d22b..8e6ae16 100644
--- a/src/ast/variable_decoration.h
+++ b/src/ast/variable_decoration.h
@@ -40,15 +40,11 @@
   /// @return the decoration kind
   DecorationKind GetKind() const override;
 
-  /// @returns true if this is a constant id decoration
-  virtual bool IsConstantId() const;
   /// @returns true if this is a location decoration
   virtual bool IsLocation() const;
   /// @returns true if this is a set decoration
   virtual bool IsSet() const;
 
-  /// @returns the decoration as a constant id decoration
-  ConstantIdDecoration* AsConstantId();
   /// @returns the decoration as a location decoration
   LocationDecoration* AsLocation();
   /// @returns the decoration as a set decoration
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index c712310..43b0507 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -31,6 +31,7 @@
 #include "src/ast/call_expression.h"
 #include "src/ast/call_statement.h"
 #include "src/ast/case_statement.h"
+#include "src/ast/constant_id_decoration.h"
 #include "src/ast/constructor_expression.h"
 #include "src/ast/decorated_variable.h"
 #include "src/ast/else_statement.h"
@@ -796,7 +797,7 @@
             spv::Op::OpDecorate,
             {Operand::Int(var_id), Operand::Int(SpvDecorationDescriptorSet),
              Operand::Int(deco->AsSet()->value())});
-      } else if (deco->IsConstantId()) {
+      } else if (deco->Is<ast::ConstantIdDecoration>()) {
         // Spec constants are handled elsewhere
       } else {
         error_ = "unknown decoration";
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index b0d3fa5..b22a529 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -649,8 +649,8 @@
       out_ << "location(" << deco->AsLocation()->value() << ")";
     } else if (auto* builtin = deco->As<ast::BuiltinDecoration>()) {
       out_ << "builtin(" << builtin->value() << ")";
-    } else if (deco->IsConstantId()) {
-      out_ << "constant_id(" << deco->AsConstantId()->value() << ")";
+    } else if (auto* cid = deco->As<ast::ConstantIdDecoration>()) {
+      out_ << "constant_id(" << cid->value() << ")";
     } else {
       error_ = "unknown variable decoration";
       return false;