Replace StructDecoration::IsBlock with Castable

Change-Id: I4b053aab610b18f99b72156f92317bc8eaf430b4
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34313
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/struct.cc b/src/ast/struct.cc
index 525afe4..5825dca 100644
--- a/src/ast/struct.cc
+++ b/src/ast/struct.cc
@@ -14,6 +14,8 @@
 
 #include "src/ast/struct.h"
 
+#include "src/ast/struct_block_decoration.h"
+
 namespace tint {
 namespace ast {
 
@@ -52,7 +54,7 @@
 
 bool Struct::IsBlockDecorated() const {
   for (auto* deco : decorations_) {
-    if (deco->IsBlock()) {
+    if (deco->Is<StructBlockDecoration>()) {
       return true;
     }
   }
diff --git a/src/ast/struct_block_decoration.cc b/src/ast/struct_block_decoration.cc
index 33fa124..90fb248 100644
--- a/src/ast/struct_block_decoration.cc
+++ b/src/ast/struct_block_decoration.cc
@@ -22,10 +22,6 @@
 
 StructBlockDecoration::~StructBlockDecoration() = default;
 
-bool StructBlockDecoration::IsBlock() const {
-  return true;
-}
-
 void StructBlockDecoration::to_str(std::ostream& out, size_t indent) const {
   make_indent(out, indent);
   out << "block";
diff --git a/src/ast/struct_block_decoration.h b/src/ast/struct_block_decoration.h
index 9c06255..6f55984 100644
--- a/src/ast/struct_block_decoration.h
+++ b/src/ast/struct_block_decoration.h
@@ -33,9 +33,6 @@
   explicit StructBlockDecoration(const Source& source);
   ~StructBlockDecoration() override;
 
-  /// @returns true if this is a block struct
-  bool IsBlock() const override;
-
   /// Outputs the decoration to the given stream
   /// @param out the stream to write to
   /// @param indent number of spaces to indent the node when writing
diff --git a/src/ast/struct_decoration.h b/src/ast/struct_decoration.h
index bba2162..c8af9e7 100644
--- a/src/ast/struct_decoration.h
+++ b/src/ast/struct_decoration.h
@@ -35,9 +35,6 @@
   /// @return the decoration kind
   DecorationKind GetKind() const override;
 
-  /// @returns true if this is a block struct
-  virtual bool IsBlock() const = 0;
-
  protected:
   /// Constructor
   /// @param source the source of this decoration
diff --git a/src/ast/struct_test.cc b/src/ast/struct_test.cc
index 016166e..33f0697 100644
--- a/src/ast/struct_test.cc
+++ b/src/ast/struct_test.cc
@@ -57,7 +57,7 @@
   Struct s{decos, members};
   EXPECT_EQ(s.members().size(), 1u);
   ASSERT_EQ(s.decorations().size(), 1u);
-  EXPECT_TRUE(s.decorations()[0]->IsBlock());
+  EXPECT_TRUE(s.decorations()[0]->Is<StructBlockDecoration>());
   EXPECT_EQ(s.source().range.begin.line, 0u);
   EXPECT_EQ(s.source().range.begin.column, 0u);
   EXPECT_EQ(s.source().range.end.line, 0u);
@@ -79,7 +79,7 @@
       decos, members};
   EXPECT_EQ(s.members().size(), 1u);
   ASSERT_EQ(s.decorations().size(), 1u);
-  EXPECT_TRUE(s.decorations()[0]->IsBlock());
+  EXPECT_TRUE(s.decorations()[0]->Is<StructBlockDecoration>());
   EXPECT_EQ(s.source().range.begin.line, 27u);
   EXPECT_EQ(s.source().range.begin.column, 4u);
   EXPECT_EQ(s.source().range.end.line, 27u);
diff --git a/src/reader/wgsl/parser_impl_struct_decl_test.cc b/src/reader/wgsl/parser_impl_struct_decl_test.cc
index 87e40e5..e1557a7 100644
--- a/src/reader/wgsl/parser_impl_struct_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_decl_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "gtest/gtest.h"
+#include "src/ast/struct_block_decoration.h"
 #include "src/ast/type/struct_type.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
@@ -65,7 +66,7 @@
   EXPECT_EQ(s->impl()->members()[0]->name(), "a");
   EXPECT_EQ(s->impl()->members()[1]->name(), "b");
   ASSERT_EQ(s->impl()->decorations().size(), 1u);
-  EXPECT_TRUE(s->impl()->decorations()[0]->IsBlock());
+  EXPECT_TRUE(s->impl()->decorations()[0]->Is<ast::StructBlockDecoration>());
 }
 
 TEST_F(ParserImplTest, StructDecl_ParsesWithMultipleDecoration) {
@@ -90,8 +91,8 @@
   EXPECT_EQ(s->impl()->members()[0]->name(), "a");
   EXPECT_EQ(s->impl()->members()[1]->name(), "b");
   ASSERT_EQ(s->impl()->decorations().size(), 2u);
-  EXPECT_TRUE(s->impl()->decorations()[0]->IsBlock());
-  EXPECT_TRUE(s->impl()->decorations()[1]->IsBlock());
+  EXPECT_TRUE(s->impl()->decorations()[0]->Is<ast::StructBlockDecoration>());
+  EXPECT_TRUE(s->impl()->decorations()[1]->Is<ast::StructBlockDecoration>());
 }
 
 TEST_F(ParserImplTest, StructDecl_EmptyMembers) {
diff --git a/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc b/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc
index 3cfa9dc..5ef5f82 100644
--- a/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "gtest/gtest.h"
+#include "src/ast/struct_block_decoration.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
 
@@ -29,7 +30,7 @@
   EXPECT_TRUE(decos.matched);
   ASSERT_EQ(decos.value.size(), 1u);
   auto* struct_deco = decos.value[0]->As<ast::StructDecoration>();
-  EXPECT_TRUE(struct_deco->IsBlock());
+  EXPECT_TRUE(struct_deco->Is<ast::StructBlockDecoration>());
 }
 
 TEST_F(ParserImplTest, StructDecorationDecl_MissingAttrRight) {
diff --git a/src/reader/wgsl/parser_impl_struct_decoration_test.cc b/src/reader/wgsl/parser_impl_struct_decoration_test.cc
index 1810451..e6e2cf6 100644
--- a/src/reader/wgsl/parser_impl_struct_decoration_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_decoration_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "gtest/gtest.h"
+#include "src/ast/struct_block_decoration.h"
 #include "src/ast/struct_decoration.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
@@ -45,7 +46,7 @@
   ASSERT_NE(deco.value, nullptr);
   auto* struct_deco = deco.value->As<ast::StructDecoration>();
   ASSERT_NE(struct_deco, nullptr);
-  EXPECT_EQ(struct_deco->IsBlock(), params.is_block);
+  EXPECT_EQ(struct_deco->Is<ast::StructBlockDecoration>(), params.is_block);
 }
 INSTANTIATE_TEST_SUITE_P(ParserImplTest,
                          StructDecorationTest,