Replace StructMemberDecoration::(Is|As) with Castable

Change-Id: I158194c60a9fe0ea2126ca31a92ad536c92a6388
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34314
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/struct_member.cc b/src/ast/struct_member.cc
index 6293234..ea5223c 100644
--- a/src/ast/struct_member.cc
+++ b/src/ast/struct_member.cc
@@ -41,7 +41,7 @@
 
 bool StructMember::has_offset_decoration() const {
   for (auto* deco : decorations_) {
-    if (deco->IsOffset()) {
+    if (deco->Is<ast::StructMemberOffsetDecoration>()) {
       return true;
     }
   }
@@ -50,8 +50,8 @@
 
 uint32_t StructMember::offset() const {
   for (auto* deco : decorations_) {
-    if (deco->IsOffset()) {
-      return deco->AsOffset()->offset();
+    if (auto* offset = deco->As<ast::StructMemberOffsetDecoration>()) {
+      return offset->offset();
     }
   }
   return 0;
diff --git a/src/ast/struct_member_decoration.cc b/src/ast/struct_member_decoration.cc
index 9c3118d..353f1ca 100644
--- a/src/ast/struct_member_decoration.cc
+++ b/src/ast/struct_member_decoration.cc
@@ -32,14 +32,5 @@
   return Kind;
 }
 
-bool StructMemberDecoration::IsOffset() const {
-  return false;
-}
-
-StructMemberOffsetDecoration* StructMemberDecoration::AsOffset() {
-  assert(IsOffset());
-  return static_cast<StructMemberOffsetDecoration*>(this);
-}
-
 }  // namespace ast
 }  // namespace tint
diff --git a/src/ast/struct_member_decoration.h b/src/ast/struct_member_decoration.h
index 837ecc0..6a0bf18 100644
--- a/src/ast/struct_member_decoration.h
+++ b/src/ast/struct_member_decoration.h
@@ -24,8 +24,6 @@
 namespace tint {
 namespace ast {
 
-class StructMemberOffsetDecoration;
-
 /// A decoration attached to a struct member
 class StructMemberDecoration
     : public Castable<StructMemberDecoration, Decoration> {
@@ -38,12 +36,6 @@
   /// @return the decoration kind
   DecorationKind GetKind() const override;
 
-  /// @returns true if this is an offset decoration
-  virtual bool IsOffset() const;
-
-  /// @returns the decoration as an offset decoration
-  StructMemberOffsetDecoration* AsOffset();
-
  protected:
   /// Constructor
   /// @param source the source of this decoration
diff --git a/src/ast/struct_member_offset_decoration.cc b/src/ast/struct_member_offset_decoration.cc
index f1ceb43..91ed01b 100644
--- a/src/ast/struct_member_offset_decoration.cc
+++ b/src/ast/struct_member_offset_decoration.cc
@@ -21,10 +21,6 @@
                                                            const Source& source)
     : Base(source), offset_(offset) {}
 
-bool StructMemberOffsetDecoration::IsOffset() const {
-  return true;
-}
-
 StructMemberOffsetDecoration::~StructMemberOffsetDecoration() = default;
 
 void StructMemberOffsetDecoration::to_str(std::ostream& out,
diff --git a/src/ast/struct_member_offset_decoration.h b/src/ast/struct_member_offset_decoration.h
index 21c2cf4..1f44271 100644
--- a/src/ast/struct_member_offset_decoration.h
+++ b/src/ast/struct_member_offset_decoration.h
@@ -34,9 +34,6 @@
   StructMemberOffsetDecoration(uint32_t offset, const Source& source);
   ~StructMemberOffsetDecoration() override;
 
-  /// @returns true if this is an offset decoration
-  bool IsOffset() const override;
-
   /// @returns the offset value
   uint32_t offset() const { return offset_; }
 
diff --git a/src/ast/struct_member_offset_decoration_test.cc b/src/ast/struct_member_offset_decoration_test.cc
index fb96a3b..51fab73 100644
--- a/src/ast/struct_member_offset_decoration_test.cc
+++ b/src/ast/struct_member_offset_decoration_test.cc
@@ -29,7 +29,7 @@
 
 TEST_F(StructMemberOffsetDecorationTest, Is) {
   StructMemberOffsetDecoration d{2, Source{}};
-  EXPECT_TRUE(d.IsOffset());
+  EXPECT_TRUE(d.Is<ast::StructMemberOffsetDecoration>());
 }
 
 }  // namespace
diff --git a/src/ast/struct_member_test.cc b/src/ast/struct_member_test.cc
index a7fe388..729c11a 100644
--- a/src/ast/struct_member_test.cc
+++ b/src/ast/struct_member_test.cc
@@ -36,7 +36,7 @@
   EXPECT_EQ(st.name(), "a");
   EXPECT_EQ(st.type(), &i32);
   EXPECT_EQ(st.decorations().size(), 1u);
-  EXPECT_TRUE(st.decorations()[0]->IsOffset());
+  EXPECT_TRUE(st.decorations()[0]->Is<ast::StructMemberOffsetDecoration>());
   EXPECT_EQ(st.source().range.begin.line, 0u);
   EXPECT_EQ(st.source().range.begin.column, 0u);
   EXPECT_EQ(st.source().range.end.line, 0u);
diff --git a/src/reader/spirv/parser_impl_convert_member_decoration_test.cc b/src/reader/spirv/parser_impl_convert_member_decoration_test.cc
index 9f95d0a..0551710 100644
--- a/src/reader/spirv/parser_impl_convert_member_decoration_test.cc
+++ b/src/reader/spirv/parser_impl_convert_member_decoration_test.cc
@@ -63,8 +63,8 @@
 
   auto* result = p->ConvertMemberDecoration(1, 1, {SpvDecorationOffset, 8});
   ASSERT_NE(result, nullptr);
-  EXPECT_TRUE(result->IsOffset());
-  auto* offset_deco = result->AsOffset();
+  EXPECT_TRUE(result->Is<ast::StructMemberOffsetDecoration>());
+  auto* offset_deco = result->As<ast::StructMemberOffsetDecoration>();
   ASSERT_NE(offset_deco, nullptr);
   EXPECT_EQ(offset_deco->offset(), 8u);
   EXPECT_TRUE(p->error().empty());
diff --git a/src/reader/wgsl/parser_impl_struct_member_decoration_decl_test.cc b/src/reader/wgsl/parser_impl_struct_member_decoration_decl_test.cc
index 6d0a317..9d9081b 100644
--- a/src/reader/wgsl/parser_impl_struct_member_decoration_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_member_decoration_decl_test.cc
@@ -50,7 +50,7 @@
   ASSERT_EQ(decos.value.size(), 1u);
   auto* deco = decos.value[0]->As<ast::StructMemberDecoration>();
   ASSERT_NE(deco, nullptr);
-  EXPECT_TRUE(deco->IsOffset());
+  EXPECT_TRUE(deco->Is<ast::StructMemberOffsetDecoration>());
 }
 
 TEST_F(ParserImplTest, StructMemberDecorationDecl_InvalidDecoration) {
diff --git a/src/reader/wgsl/parser_impl_struct_member_decoration_test.cc b/src/reader/wgsl/parser_impl_struct_member_decoration_test.cc
index c9f2357..450c3a2 100644
--- a/src/reader/wgsl/parser_impl_struct_member_decoration_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_member_decoration_test.cc
@@ -32,9 +32,9 @@
 
   auto* member_deco = deco.value->As<ast::StructMemberDecoration>();
   ASSERT_NE(member_deco, nullptr);
-  ASSERT_TRUE(member_deco->IsOffset());
+  ASSERT_TRUE(member_deco->Is<ast::StructMemberOffsetDecoration>());
 
-  auto* o = member_deco->AsOffset();
+  auto* o = member_deco->As<ast::StructMemberOffsetDecoration>();
   EXPECT_EQ(o->offset(), 4u);
 }
 
diff --git a/src/reader/wgsl/parser_impl_struct_member_test.cc b/src/reader/wgsl/parser_impl_struct_member_test.cc
index 4e98980..f4643d3 100644
--- a/src/reader/wgsl/parser_impl_struct_member_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_member_test.cc
@@ -68,8 +68,10 @@
   EXPECT_EQ(m->name(), "a");
   EXPECT_EQ(m->type(), i32);
   EXPECT_EQ(m->decorations().size(), 1u);
-  EXPECT_TRUE(m->decorations()[0]->IsOffset());
-  EXPECT_EQ(m->decorations()[0]->AsOffset()->offset(), 2u);
+  EXPECT_TRUE(m->decorations()[0]->Is<ast::StructMemberOffsetDecoration>());
+  EXPECT_EQ(
+      m->decorations()[0]->As<ast::StructMemberOffsetDecoration>()->offset(),
+      2u);
 
   ASSERT_EQ(m->source().range.begin.line, 1u);
   ASSERT_EQ(m->source().range.begin.column, 15u);
@@ -97,10 +99,14 @@
   EXPECT_EQ(m->name(), "a");
   EXPECT_EQ(m->type(), i32);
   EXPECT_EQ(m->decorations().size(), 2u);
-  EXPECT_TRUE(m->decorations()[0]->IsOffset());
-  EXPECT_EQ(m->decorations()[0]->AsOffset()->offset(), 2u);
-  EXPECT_TRUE(m->decorations()[1]->IsOffset());
-  EXPECT_EQ(m->decorations()[1]->AsOffset()->offset(), 4u);
+  EXPECT_TRUE(m->decorations()[0]->Is<ast::StructMemberOffsetDecoration>());
+  EXPECT_EQ(
+      m->decorations()[0]->As<ast::StructMemberOffsetDecoration>()->offset(),
+      2u);
+  EXPECT_TRUE(m->decorations()[1]->Is<ast::StructMemberOffsetDecoration>());
+  EXPECT_EQ(
+      m->decorations()[1]->As<ast::StructMemberOffsetDecoration>()->offset(),
+      4u);
 
   ASSERT_EQ(m->source().range.begin.line, 2u);
   ASSERT_EQ(m->source().range.begin.column, 15u);
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index d7d2fb2..5fb958c 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -218,8 +218,8 @@
     // Offset decorations in WGSL must be in increasing order.
     for (auto* mem : stct->members()) {
       for (auto* deco : mem->decorations()) {
-        if (deco->IsOffset()) {
-          count = deco->AsOffset()->offset();
+        if (auto* offset = deco->As<ast::StructMemberOffsetDecoration>()) {
+          count = offset->offset();
         }
       }
       auto align = calculate_alignment_size(mem->type());
@@ -1941,8 +1941,8 @@
   for (auto* mem : str->impl()->members()) {
     make_indent();
     for (auto* deco : mem->decorations()) {
-      if (deco->IsOffset()) {
-        uint32_t offset = deco->AsOffset()->offset();
+      if (auto* o = deco->As<ast::StructMemberOffsetDecoration>()) {
+        uint32_t offset = o->offset();
         if (offset != current_offset) {
           out_ << "int8_t pad_" << pad_count << "[" << (offset - current_offset)
                << "];" << std::endl;
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 0c1c1d5..5487120 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -2696,11 +2696,11 @@
 
   bool has_layout = false;
   for (auto* deco : member->decorations()) {
-    if (deco->IsOffset()) {
+    if (auto* offset = deco->As<ast::StructMemberOffsetDecoration>()) {
       push_annot(spv::Op::OpMemberDecorate,
                  {Operand::Int(struct_id), Operand::Int(idx),
                   Operand::Int(SpvDecorationOffset),
-                  Operand::Int(deco->AsOffset()->offset())});
+                  Operand::Int(offset->offset())});
       has_layout = true;
     } else {
       error_ = "unknown struct member decoration";
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index a417837..bcff24f 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -580,8 +580,10 @@
       make_indent();
 
       // TODO(dsinclair): Split this out when we have more then one
-      assert(deco->IsOffset());
-      out_ << "[[offset(" << deco->AsOffset()->offset() << ")]]" << std::endl;
+      assert(deco->Is<ast::StructMemberOffsetDecoration>());
+      out_ << "[[offset("
+           << deco->As<ast::StructMemberOffsetDecoration>()->offset() << ")]]"
+           << std::endl;
     }
     make_indent();
     out_ << mem->name() << " : ";