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

Change-Id: I10f1d3d0757661a41b44517d55d6f159aced04ce
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34263
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/module.cc b/src/ast/module.cc
index 0d0c261..101d746 100644
--- a/src/ast/module.cc
+++ b/src/ast/module.cc
@@ -56,8 +56,8 @@
     if (ty == nullptr) {
       return false;
     }
-    if (ty->IsAlias()) {
-      auto* alias = ty->AsAlias();
+    if (ty->Is<ast::type::AliasType>()) {
+      auto* alias = ty->As<ast::type::AliasType>();
       if (alias->type() == nullptr) {
         return false;
       }
@@ -91,8 +91,8 @@
     for (size_t i = 0; i < indent; ++i) {
       out << " ";
     }
-    if (ty->IsAlias()) {
-      auto* alias = ty->AsAlias();
+    if (ty->Is<ast::type::AliasType>()) {
+      auto* alias = ty->As<ast::type::AliasType>();
       out << alias->name() << " -> " << alias->type()->type_name() << std::endl;
       if (alias->type()->IsStruct()) {
         alias->type()->AsStruct()->impl()->to_str(out, indent);
diff --git a/src/ast/type/access_control_type_test.cc b/src/ast/type/access_control_type_test.cc
index afa2463..523bd36 100644
--- a/src/ast/type/access_control_type_test.cc
+++ b/src/ast/type/access_control_type_test.cc
@@ -47,19 +47,20 @@
   I32Type i32;
 
   AccessControlType at{AccessControl::kReadOnly, &i32};
-  EXPECT_TRUE(at.Is<AccessControlType>());
-  EXPECT_FALSE(at.IsAlias());
-  EXPECT_FALSE(at.IsArray());
-  EXPECT_FALSE(at.IsBool());
-  EXPECT_FALSE(at.IsF32());
-  EXPECT_FALSE(at.IsI32());
-  EXPECT_FALSE(at.IsMatrix());
-  EXPECT_FALSE(at.IsPointer());
-  EXPECT_FALSE(at.IsSampler());
-  EXPECT_FALSE(at.IsStruct());
-  EXPECT_FALSE(at.IsTexture());
-  EXPECT_FALSE(at.IsU32());
-  EXPECT_FALSE(at.IsVector());
+  Type* ty = &at;
+  EXPECT_TRUE(ty->Is<AccessControlType>());
+  EXPECT_FALSE(ty->Is<AliasType>());
+  EXPECT_FALSE(ty->IsArray());
+  EXPECT_FALSE(ty->IsBool());
+  EXPECT_FALSE(ty->IsF32());
+  EXPECT_FALSE(ty->IsI32());
+  EXPECT_FALSE(ty->IsMatrix());
+  EXPECT_FALSE(ty->IsPointer());
+  EXPECT_FALSE(ty->IsSampler());
+  EXPECT_FALSE(ty->IsStruct());
+  EXPECT_FALSE(ty->IsTexture());
+  EXPECT_FALSE(ty->IsU32());
+  EXPECT_FALSE(ty->IsVector());
 }
 
 TEST_F(AccessControlTypeTest, AccessRead) {
diff --git a/src/ast/type/alias_type.cc b/src/ast/type/alias_type.cc
index 6944cf3..f2fece8 100644
--- a/src/ast/type/alias_type.cc
+++ b/src/ast/type/alias_type.cc
@@ -29,10 +29,6 @@
 
 AliasType::~AliasType() = default;
 
-bool AliasType::IsAlias() const {
-  return true;
-}
-
 std::string AliasType::type_name() const {
   return "__alias_" + name_ + subtype_->type_name();
 }
diff --git a/src/ast/type/alias_type.h b/src/ast/type/alias_type.h
index 9e08d21..1476b59 100644
--- a/src/ast/type/alias_type.h
+++ b/src/ast/type/alias_type.h
@@ -34,9 +34,6 @@
   AliasType(AliasType&&);
   ~AliasType() override;
 
-  /// @returns true if the type is an alias type
-  bool IsAlias() const override;
-
   /// @returns the alias name
   const std::string& name() const { return name_; }
   /// @returns the alias type
diff --git a/src/ast/type/alias_type_test.cc b/src/ast/type/alias_type_test.cc
index 9c2137a..e54b165 100644
--- a/src/ast/type/alias_type_test.cc
+++ b/src/ast/type/alias_type_test.cc
@@ -50,7 +50,7 @@
   AliasType at{"a", &i32};
   Type* ty = &at;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_TRUE(ty->IsAlias());
+  EXPECT_TRUE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/ast/type/array_type_test.cc b/src/ast/type/array_type_test.cc
index 04267d3..12c486c 100644
--- a/src/ast/type/array_type_test.cc
+++ b/src/ast/type/array_type_test.cc
@@ -54,7 +54,7 @@
   ArrayType arr{&i32, 3};
   Type* ty = &arr;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_TRUE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/ast/type/bool_type_test.cc b/src/ast/type/bool_type_test.cc
index 9efe20c..3775a2c 100644
--- a/src/ast/type/bool_type_test.cc
+++ b/src/ast/type/bool_type_test.cc
@@ -28,7 +28,7 @@
   BoolType b;
   Type* ty = &b;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_TRUE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/ast/type/depth_texture_type_test.cc b/src/ast/type/depth_texture_type_test.cc
index 852dc62..a06af27 100644
--- a/src/ast/type/depth_texture_type_test.cc
+++ b/src/ast/type/depth_texture_type_test.cc
@@ -29,7 +29,7 @@
   DepthTextureType d(TextureDimension::kCube);
   Type* ty = &d;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/ast/type/f32_type_test.cc b/src/ast/type/f32_type_test.cc
index 3267400..93cd1ca 100644
--- a/src/ast/type/f32_type_test.cc
+++ b/src/ast/type/f32_type_test.cc
@@ -28,7 +28,7 @@
   F32Type f;
   Type* ty = &f;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_TRUE(ty->IsF32());
diff --git a/src/ast/type/i32_type_test.cc b/src/ast/type/i32_type_test.cc
index d0d3e25..11dbd96 100644
--- a/src/ast/type/i32_type_test.cc
+++ b/src/ast/type/i32_type_test.cc
@@ -28,7 +28,7 @@
   I32Type i;
   Type* ty = &i;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/ast/type/matrix_type_test.cc b/src/ast/type/matrix_type_test.cc
index 068aeed..1990dcc 100644
--- a/src/ast/type/matrix_type_test.cc
+++ b/src/ast/type/matrix_type_test.cc
@@ -38,7 +38,7 @@
   MatrixType m{&i32, 2, 3};
   Type* ty = &m;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/ast/type/multisampled_texture_type_test.cc b/src/ast/type/multisampled_texture_type_test.cc
index 8c89c9a..7a7a54d 100644
--- a/src/ast/type/multisampled_texture_type_test.cc
+++ b/src/ast/type/multisampled_texture_type_test.cc
@@ -30,7 +30,7 @@
   MultisampledTextureType s(TextureDimension::kCube, &f32);
   Type* ty = &s;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/ast/type/pointer_type_test.cc b/src/ast/type/pointer_type_test.cc
index 9d3764d..9014cce 100644
--- a/src/ast/type/pointer_type_test.cc
+++ b/src/ast/type/pointer_type_test.cc
@@ -37,7 +37,7 @@
   PointerType p{&i32, StorageClass::kFunction};
   Type* ty = &p;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/ast/type/sampled_texture_type_test.cc b/src/ast/type/sampled_texture_type_test.cc
index d709928..a8f41d7 100644
--- a/src/ast/type/sampled_texture_type_test.cc
+++ b/src/ast/type/sampled_texture_type_test.cc
@@ -30,7 +30,7 @@
   SampledTextureType s(TextureDimension::kCube, &f32);
   Type* ty = &s;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/ast/type/sampler_type_test.cc b/src/ast/type/sampler_type_test.cc
index 263c93b..2189e92 100644
--- a/src/ast/type/sampler_type_test.cc
+++ b/src/ast/type/sampler_type_test.cc
@@ -39,7 +39,7 @@
   SamplerType s{SamplerKind::kSampler};
   Type* ty = &s;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/ast/type/storage_texture_type_test.cc b/src/ast/type/storage_texture_type_test.cc
index 4cd3af4..ed6bbe0 100644
--- a/src/ast/type/storage_texture_type_test.cc
+++ b/src/ast/type/storage_texture_type_test.cc
@@ -33,7 +33,7 @@
                        ImageFormat::kRgba32Float);
   Type* ty = &s;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/ast/type/struct_type_test.cc b/src/ast/type/struct_type_test.cc
index 9d83f01..05378ea 100644
--- a/src/ast/type/struct_type_test.cc
+++ b/src/ast/type/struct_type_test.cc
@@ -46,7 +46,7 @@
   StructType s{"S", impl};
   Type* ty = &s;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/ast/type/type.cc b/src/ast/type/type.cc
index 9587688..41634fb 100644
--- a/src/ast/type/type.cc
+++ b/src/ast/type/type.cc
@@ -51,8 +51,8 @@
 Type* Type::UnwrapIfNeeded() {
   auto* where = this;
   while (true) {
-    if (where->IsAlias()) {
-      where = where->AsAlias()->type();
+    if (where->Is<AliasType>()) {
+      where = where->As<AliasType>()->type();
     } else if (where->Is<AccessControlType>()) {
       where = where->As<AccessControlType>()->type();
     } else {
@@ -66,10 +66,6 @@
   return UnwrapIfNeeded()->UnwrapPtrIfNeeded()->UnwrapIfNeeded();
 }
 
-bool Type::IsAlias() const {
-  return false;
-}
-
 bool Type::IsArray() const {
   return false;
 }
@@ -170,11 +166,6 @@
   return is_unsigned_scalar_or_vector() || is_signed_scalar_or_vector();
 }
 
-const AliasType* Type::AsAlias() const {
-  assert(IsAlias());
-  return static_cast<const AliasType*>(this);
-}
-
 const ArrayType* Type::AsArray() const {
   assert(IsArray());
   return static_cast<const ArrayType*>(this);
@@ -235,11 +226,6 @@
   return static_cast<const VoidType*>(this);
 }
 
-AliasType* Type::AsAlias() {
-  assert(IsAlias());
-  return static_cast<AliasType*>(this);
-}
-
 ArrayType* Type::AsArray() {
   assert(IsArray());
   return static_cast<ArrayType*>(this);
diff --git a/src/ast/type/type.h b/src/ast/type/type.h
index ad83af9..04905c9 100644
--- a/src/ast/type/type.h
+++ b/src/ast/type/type.h
@@ -23,7 +23,6 @@
 namespace ast {
 namespace type {
 
-class AliasType;
 class ArrayType;
 class BoolType;
 class F32Type;
@@ -47,8 +46,6 @@
   Type(Type&&);
   ~Type() override;
 
-  /// @returns true if the type is an alias type
-  virtual bool IsAlias() const;
   /// @returns true if the type is an array type
   virtual bool IsArray() const;
   /// @returns true if the type is a bool type
@@ -128,8 +125,6 @@
   /// @returns true if this type is an integer scalar or vector
   bool is_integer_scalar_or_vector();
 
-  /// @returns the type as an alias type
-  const AliasType* AsAlias() const;
   /// @returns the type as an array type
   const ArrayType* AsArray() const;
   /// @returns the type as a bool type
@@ -155,8 +150,6 @@
   /// @returns the type as a void type
   const VoidType* AsVoid() const;
 
-  /// @returns the type as an alias type
-  AliasType* AsAlias();
   /// @returns the type as an array type
   ArrayType* AsArray();
   /// @returns the type as a bool type
diff --git a/src/ast/type/u32_type_test.cc b/src/ast/type/u32_type_test.cc
index 0a8af4b..1a2450f 100644
--- a/src/ast/type/u32_type_test.cc
+++ b/src/ast/type/u32_type_test.cc
@@ -28,7 +28,7 @@
   U32Type u;
   Type* ty = &u;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/ast/type/vector_type_test.cc b/src/ast/type/vector_type_test.cc
index 3eed2cf..c8a4188 100644
--- a/src/ast/type/vector_type_test.cc
+++ b/src/ast/type/vector_type_test.cc
@@ -37,7 +37,7 @@
   VectorType v{&i32, 4};
   Type* ty = &v;
   EXPECT_FALSE(ty->Is<AccessControlType>());
-  EXPECT_FALSE(ty->IsAlias());
+  EXPECT_FALSE(ty->Is<AliasType>());
   EXPECT_FALSE(ty->IsArray());
   EXPECT_FALSE(ty->IsBool());
   EXPECT_FALSE(ty->IsF32());
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index 6aab589..019f442 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -903,7 +903,7 @@
   auto* alias = module_.create<ast::type::AliasType>(name.value, type.value);
   register_constructed(name.value, alias);
 
-  return alias->AsAlias();
+  return alias;
 }
 
 // type_decl
diff --git a/src/reader/wgsl/parser_impl_global_decl_test.cc b/src/reader/wgsl/parser_impl_global_decl_test.cc
index 956aaf8..de5bcf7 100644
--- a/src/reader/wgsl/parser_impl_global_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_decl_test.cc
@@ -88,8 +88,8 @@
 
   auto& m = p->get_module();
   ASSERT_EQ(m.constructed_types().size(), 1u);
-  ASSERT_TRUE(m.constructed_types()[0]->IsAlias());
-  EXPECT_EQ(m.constructed_types()[0]->AsAlias()->name(), "A");
+  ASSERT_TRUE(m.constructed_types()[0]->Is<ast::type::AliasType>());
+  EXPECT_EQ(m.constructed_types()[0]->As<ast::type::AliasType>()->name(), "A");
 }
 
 TEST_F(ParserImplTest, GlobalDecl_TypeAlias_StructIdent) {
@@ -107,8 +107,8 @@
   auto* str = m.constructed_types()[0]->AsStruct();
   EXPECT_EQ(str->name(), "A");
 
-  ASSERT_TRUE(m.constructed_types()[1]->IsAlias());
-  auto* alias = m.constructed_types()[1]->AsAlias();
+  ASSERT_TRUE(m.constructed_types()[1]->Is<ast::type::AliasType>());
+  auto* alias = m.constructed_types()[1]->As<ast::type::AliasType>();
   EXPECT_EQ(alias->name(), "B");
   EXPECT_EQ(alias->type(), str);
 }
diff --git a/src/reader/wgsl/parser_impl_type_alias_test.cc b/src/reader/wgsl/parser_impl_type_alias_test.cc
index e224fef..45d02a3 100644
--- a/src/reader/wgsl/parser_impl_type_alias_test.cc
+++ b/src/reader/wgsl/parser_impl_type_alias_test.cc
@@ -36,8 +36,8 @@
   EXPECT_FALSE(t.errored);
   EXPECT_TRUE(t.matched);
   ASSERT_NE(t.value, nullptr);
-  ASSERT_TRUE(t->IsAlias());
-  auto* alias = t->AsAlias();
+  ASSERT_TRUE(t->Is<ast::type::AliasType>());
+  auto* alias = t->As<ast::type::AliasType>();
   ASSERT_TRUE(alias->type()->IsI32());
   ASSERT_EQ(alias->type(), i32);
 }
@@ -53,8 +53,8 @@
   EXPECT_FALSE(t.errored);
   EXPECT_TRUE(t.matched);
   ASSERT_NE(t.value, nullptr);
-  ASSERT_TRUE(t->IsAlias());
-  auto* alias = t->AsAlias();
+  ASSERT_TRUE(t->Is<ast::type::AliasType>());
+  auto* alias = t->As<ast::type::AliasType>();
   EXPECT_EQ(alias->name(), "a");
   ASSERT_TRUE(alias->type()->IsStruct());
 
diff --git a/src/reader/wgsl/parser_impl_type_decl_test.cc b/src/reader/wgsl/parser_impl_type_decl_test.cc
index 50d9bd4..9f9f8e9 100644
--- a/src/reader/wgsl/parser_impl_type_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_type_decl_test.cc
@@ -58,9 +58,9 @@
   EXPECT_FALSE(t.errored);
   ASSERT_NE(t.value, nullptr) << p->error();
   EXPECT_EQ(t.value, alias_type);
-  ASSERT_TRUE(t->IsAlias());
+  ASSERT_TRUE(t->Is<ast::type::AliasType>());
 
-  auto* alias = t->AsAlias();
+  auto* alias = t->As<ast::type::AliasType>();
   EXPECT_EQ(alias->name(), "A");
   EXPECT_EQ(alias->type(), int_type);
 }
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index 2e62109..c321e91 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -212,8 +212,8 @@
                                         const ast::type::Type* ty) {
   make_indent(out);
 
-  if (ty->IsAlias()) {
-    auto* alias = ty->AsAlias();
+  if (ty->Is<ast::type::AliasType>()) {
+    auto* alias = ty->As<ast::type::AliasType>();
     // HLSL typedef is for intrinsic types only. For an alias'd struct,
     // generate a secondary struct with the new name.
     if (alias->type()->IsStruct()) {
@@ -2029,8 +2029,8 @@
 bool GeneratorImpl::EmitType(std::ostream& out,
                              ast::type::Type* type,
                              const std::string& name) {
-  if (type->IsAlias()) {
-    auto* alias = type->AsAlias();
+  if (type->Is<ast::type::AliasType>()) {
+    auto* alias = type->As<ast::type::AliasType>();
     out << namer_.NameFor(alias->name());
   } else if (type->IsArray()) {
     auto* ary = type->AsArray();
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 0f1b2e3..7bfb40c 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -185,8 +185,8 @@
 }
 
 uint32_t GeneratorImpl::calculate_alignment_size(ast::type::Type* type) {
-  if (type->IsAlias()) {
-    return calculate_alignment_size(type->AsAlias()->type());
+  if (type->Is<ast::type::AliasType>()) {
+    return calculate_alignment_size(type->As<ast::type::AliasType>()->type());
   }
   if (type->IsArray()) {
     auto* ary = type->AsArray();
@@ -255,8 +255,8 @@
 bool GeneratorImpl::EmitConstructedType(const ast::type::Type* ty) {
   make_indent();
 
-  if (ty->IsAlias()) {
-    auto* alias = ty->AsAlias();
+  if (ty->Is<ast::type::AliasType>()) {
+    auto* alias = ty->As<ast::type::AliasType>();
 
     out_ << "typedef ";
     if (!EmitType(alias->type(), "")) {
@@ -1787,8 +1787,8 @@
 }
 
 bool GeneratorImpl::EmitType(ast::type::Type* type, const std::string& name) {
-  if (type->IsAlias()) {
-    auto* alias = type->AsAlias();
+  if (type->Is<ast::type::AliasType>()) {
+    auto* alias = type->As<ast::type::AliasType>();
     out_ << namer_.NameFor(alias->name());
   } else if (type->IsArray()) {
     auto* ary = type->AsArray();
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 6e8c932..db90dcd 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -2387,8 +2387,8 @@
   }
 
   // The alias is a wrapper around the subtype, so emit the subtype
-  if (type->IsAlias()) {
-    return GenerateTypeIfNeeded(type->AsAlias()->type());
+  if (type->Is<ast::type::AliasType>()) {
+    return GenerateTypeIfNeeded(type->As<ast::type::AliasType>()->type());
   }
 
   auto val = type_name_to_id_.find(type->type_name());
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index 16dfb9e..7abf216 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -168,8 +168,8 @@
 
 bool GeneratorImpl::EmitConstructedType(const ast::type::Type* ty) {
   make_indent();
-  if (ty->IsAlias()) {
-    auto* alias = ty->AsAlias();
+  if (ty->Is<ast::type::AliasType>()) {
+    auto* alias = ty->As<ast::type::AliasType>();
     out_ << "type " << alias->name() << " = ";
     if (!EmitType(alias->type())) {
       return false;
@@ -410,8 +410,8 @@
     if (!EmitType(ac->type())) {
       return false;
     }
-  } else if (type->IsAlias()) {
-    out_ << type->AsAlias()->name();
+  } else if (type->Is<ast::type::AliasType>()) {
+    out_ << type->As<ast::type::AliasType>()->name();
   } else if (type->IsArray()) {
     auto* ary = type->AsArray();