sem: Rename methods of sem::Pointer and Reference

Rename:
* type() to StoreType()
* storage_class() to StorageClass()

Move away from snake_case methods in the semantic namespace.
Try to avoid generic 'type()' method names.

Also add an assertion to detect doubly nested references (these are
invalid).

Bug: tint:727
Change-Id: I975a3f1e5fbed7947cc2fc156fee892b282c63de
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/51220
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: David Neto <dneto@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/intrinsic_table.cc b/src/intrinsic_table.cc
index a638a1d..802034f 100644
--- a/src/intrinsic_table.cc
+++ b/src/intrinsic_table.cc
@@ -370,7 +370,7 @@
 
   bool Match(MatchState& state, const sem::Type* ty) const override {
     if (auto* ptr = ty->As<sem::Pointer>()) {
-      return element_builder_->Match(state, ptr->type());
+      return element_builder_->Match(state, ptr->StoreType());
     }
     return false;
   }
@@ -1396,7 +1396,7 @@
       if (!parameters[i].matcher->ExpectsPointer()) {
         // Argument is a pointer, but the matcher isn't expecting one.
         // Perform an implicit dereference.
-        arg_ty = ptr->type();
+        arg_ty = ptr->StoreType();
       }
     }
     if (parameters[i].matcher->Match(matcher_state, arg_ty)) {
diff --git a/src/resolver/resolver.cc b/src/resolver/resolver.cc
index b303548..67b0734 100644
--- a/src/resolver/resolver.cc
+++ b/src/resolver/resolver.cc
@@ -1542,7 +1542,7 @@
 
   // If we're extracting from a pointer, we return a pointer.
   if (auto* ptr = res->As<sem::Pointer>()) {
-    ret = builder_->create<sem::Pointer>(ret, ptr->storage_class());
+    ret = builder_->create<sem::Pointer>(ret, ptr->StorageClass());
   } else if (auto* arr = parent_type->As<sem::Array>()) {
     if (!arr->ElemType()->is_scalar()) {
       // If we extract a non-scalar from an array then we also get a pointer. We
@@ -1906,7 +1906,7 @@
 
     // If we're extracting from a pointer, we return a pointer.
     if (auto* ptr = res->As<sem::Pointer>()) {
-      ret = builder_->create<sem::Pointer>(ret, ptr->storage_class());
+      ret = builder_->create<sem::Pointer>(ret, ptr->StorageClass());
     }
 
     builder_->Sem().Add(expr, builder_->create<sem::StructMemberAccess>(
@@ -1969,7 +1969,7 @@
       ret = vec->type();
       // If we're extracting from a pointer, we return a pointer.
       if (auto* ptr = res->As<sem::Pointer>()) {
-        ret = builder_->create<sem::Pointer>(ret, ptr->storage_class());
+        ret = builder_->create<sem::Pointer>(ret, ptr->StorageClass());
       }
     } else {
       // The vector will have a number of components equal to the length of
diff --git a/src/resolver/resolver_test.cc b/src/resolver/resolver_test.cc
index 2c00171..330492e 100644
--- a/src/resolver/resolver_test.cc
+++ b/src/resolver/resolver_test.cc
@@ -400,7 +400,7 @@
   ASSERT_TRUE(TypeOf(acc)->Is<sem::Pointer>());
 
   auto* ptr = TypeOf(acc)->As<sem::Pointer>();
-  EXPECT_TRUE(ptr->type()->Is<sem::F32>());
+  EXPECT_TRUE(ptr->StoreType()->Is<sem::F32>());
 }
 
 TEST_F(ResolverTest, Expr_ArrayAccessor_Alias_Array) {
@@ -418,7 +418,7 @@
   ASSERT_TRUE(TypeOf(acc)->Is<sem::Pointer>());
 
   auto* ptr = TypeOf(acc)->As<sem::Pointer>();
-  EXPECT_TRUE(ptr->type()->Is<sem::F32>());
+  EXPECT_TRUE(ptr->StoreType()->Is<sem::F32>());
 }
 
 TEST_F(ResolverTest, Expr_ArrayAccessor_Array_Constant) {
@@ -445,8 +445,8 @@
   ASSERT_TRUE(TypeOf(acc)->Is<sem::Pointer>());
 
   auto* ptr = TypeOf(acc)->As<sem::Pointer>();
-  ASSERT_TRUE(ptr->type()->Is<sem::Vector>());
-  EXPECT_EQ(ptr->type()->As<sem::Vector>()->size(), 3u);
+  ASSERT_TRUE(ptr->StoreType()->Is<sem::Vector>());
+  EXPECT_EQ(ptr->StoreType()->As<sem::Vector>()->size(), 3u);
 }
 
 TEST_F(ResolverTest, Expr_ArrayAccessor_Matrix_BothDimensions) {
@@ -461,7 +461,7 @@
   ASSERT_TRUE(TypeOf(acc)->Is<sem::Pointer>());
 
   auto* ptr = TypeOf(acc)->As<sem::Pointer>();
-  EXPECT_TRUE(ptr->type()->Is<sem::F32>());
+  EXPECT_TRUE(ptr->StoreType()->Is<sem::F32>());
 }
 
 TEST_F(ResolverTest, Expr_ArrayAccessor_Vector) {
@@ -476,7 +476,7 @@
   ASSERT_TRUE(TypeOf(acc)->Is<sem::Pointer>());
 
   auto* ptr = TypeOf(acc)->As<sem::Pointer>();
-  EXPECT_TRUE(ptr->type()->Is<sem::F32>());
+  EXPECT_TRUE(ptr->StoreType()->Is<sem::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Bitcast) {
@@ -610,7 +610,7 @@
 
   ASSERT_NE(TypeOf(ident), nullptr);
   EXPECT_TRUE(TypeOf(ident)->Is<sem::Pointer>());
-  EXPECT_TRUE(TypeOf(ident)->As<sem::Pointer>()->type()->Is<sem::F32>());
+  EXPECT_TRUE(TypeOf(ident)->As<sem::Pointer>()->StoreType()->Is<sem::F32>());
   EXPECT_TRUE(CheckVarUsers(my_var, {ident}));
   ASSERT_NE(VarOf(ident), nullptr);
   EXPECT_EQ(VarOf(ident)->Declaration(), my_var);
@@ -675,11 +675,13 @@
 
   ASSERT_NE(TypeOf(my_var_a), nullptr);
   EXPECT_TRUE(TypeOf(my_var_a)->Is<sem::Pointer>());
-  EXPECT_TRUE(TypeOf(my_var_a)->As<sem::Pointer>()->type()->Is<sem::F32>());
+  EXPECT_TRUE(
+      TypeOf(my_var_a)->As<sem::Pointer>()->StoreType()->Is<sem::F32>());
   EXPECT_EQ(StmtOf(my_var_a), assign);
   ASSERT_NE(TypeOf(my_var_b), nullptr);
   EXPECT_TRUE(TypeOf(my_var_b)->Is<sem::Pointer>());
-  EXPECT_TRUE(TypeOf(my_var_b)->As<sem::Pointer>()->type()->Is<sem::F32>());
+  EXPECT_TRUE(
+      TypeOf(my_var_b)->As<sem::Pointer>()->StoreType()->Is<sem::F32>());
   EXPECT_EQ(StmtOf(my_var_b), assign);
   EXPECT_TRUE(CheckVarUsers(var, {my_var_a, my_var_b}));
   ASSERT_NE(VarOf(my_var_a), nullptr);
@@ -704,11 +706,13 @@
 
   ASSERT_NE(TypeOf(my_var_a), nullptr);
   EXPECT_TRUE(TypeOf(my_var_a)->Is<sem::Pointer>());
-  EXPECT_TRUE(TypeOf(my_var_a)->As<sem::Pointer>()->type()->Is<sem::F32>());
+  EXPECT_TRUE(
+      TypeOf(my_var_a)->As<sem::Pointer>()->StoreType()->Is<sem::F32>());
   EXPECT_EQ(StmtOf(my_var_a), assign);
   ASSERT_NE(TypeOf(my_var_b), nullptr);
   EXPECT_TRUE(TypeOf(my_var_b)->Is<sem::Pointer>());
-  EXPECT_TRUE(TypeOf(my_var_b)->As<sem::Pointer>()->type()->Is<sem::F32>());
+  EXPECT_TRUE(
+      TypeOf(my_var_b)->As<sem::Pointer>()->StoreType()->Is<sem::F32>());
   EXPECT_EQ(StmtOf(my_var_b), assign);
 }
 
@@ -894,7 +898,7 @@
   ASSERT_TRUE(TypeOf(mem)->Is<sem::Pointer>());
 
   auto* ptr = TypeOf(mem)->As<sem::Pointer>();
-  EXPECT_TRUE(ptr->type()->Is<sem::F32>());
+  EXPECT_TRUE(ptr->StoreType()->Is<sem::F32>());
   auto* sma = Sem().Get(mem)->As<sem::StructMemberAccess>();
   ASSERT_NE(sma, nullptr);
   EXPECT_EQ(sma->Member()->Type(), ty.f32());
@@ -919,7 +923,7 @@
   ASSERT_TRUE(TypeOf(mem)->Is<sem::Pointer>());
 
   auto* ptr = TypeOf(mem)->As<sem::Pointer>();
-  EXPECT_TRUE(ptr->type()->Is<sem::F32>());
+  EXPECT_TRUE(ptr->StoreType()->Is<sem::F32>());
   auto* sma = Sem().Get(mem)->As<sem::StructMemberAccess>();
   ASSERT_NE(sma, nullptr);
   EXPECT_EQ(sma->Member()->Type(), ty.f32());
@@ -955,7 +959,7 @@
   ASSERT_TRUE(TypeOf(mem)->Is<sem::Pointer>());
 
   auto* ptr = TypeOf(mem)->As<sem::Pointer>();
-  ASSERT_TRUE(ptr->type()->Is<sem::F32>());
+  ASSERT_TRUE(ptr->StoreType()->Is<sem::F32>());
   ASSERT_TRUE(Sem().Get(mem)->Is<sem::Swizzle>());
   EXPECT_THAT(Sem().Get(mem)->As<sem::Swizzle>()->Indices(), ElementsAre(2));
 }
diff --git a/src/sem/pointer_type.h b/src/sem/pointer_type.h
index 929853c..adcb127 100644
--- a/src/sem/pointer_type.h
+++ b/src/sem/pointer_type.h
@@ -35,9 +35,9 @@
   ~Pointer() override;
 
   /// @returns the pointee type
-  const Type* type() const { return subtype_; }
+  const Type* StoreType() const { return subtype_; }
   /// @returns the storage class of the pointer
-  ast::StorageClass storage_class() const { return storage_class_; }
+  ast::StorageClass StorageClass() const { return storage_class_; }
 
   /// @returns the name for this type
   std::string type_name() const override;
diff --git a/src/sem/pointer_type_test.cc b/src/sem/pointer_type_test.cc
index a45eb57..441a96f 100644
--- a/src/sem/pointer_type_test.cc
+++ b/src/sem/pointer_type_test.cc
@@ -23,8 +23,8 @@
 
 TEST_F(PointerTest, Creation) {
   auto* r = create<Pointer>(create<I32>(), ast::StorageClass::kStorage);
-  EXPECT_TRUE(r->type()->Is<sem::I32>());
-  EXPECT_EQ(r->storage_class(), ast::StorageClass::kStorage);
+  EXPECT_TRUE(r->StoreType()->Is<sem::I32>());
+  EXPECT_EQ(r->StorageClass(), ast::StorageClass::kStorage);
 }
 
 TEST_F(PointerTest, TypeName) {
diff --git a/src/sem/reference_type.cc b/src/sem/reference_type.cc
index 8e4c405..1c8ee01 100644
--- a/src/sem/reference_type.cc
+++ b/src/sem/reference_type.cc
@@ -22,7 +22,9 @@
 namespace sem {
 
 Reference::Reference(const Type* subtype, ast::StorageClass storage_class)
-    : subtype_(subtype), storage_class_(storage_class) {}
+    : subtype_(subtype), storage_class_(storage_class) {
+  TINT_ASSERT(!subtype->Is<Reference>());
+}
 
 std::string Reference::type_name() const {
   std::ostringstream out;
diff --git a/src/sem/reference_type.h b/src/sem/reference_type.h
index b86112a..0d9afed 100644
--- a/src/sem/reference_type.h
+++ b/src/sem/reference_type.h
@@ -35,9 +35,9 @@
   ~Reference() override;
 
   /// @returns the pointee type
-  const Type* type() const { return subtype_; }
+  const Type* StoreType() const { return subtype_; }
   /// @returns the storage class of the reference
-  ast::StorageClass storage_class() const { return storage_class_; }
+  ast::StorageClass StorageClass() const { return storage_class_; }
 
   /// @returns the name for this type
   std::string type_name() const override;
diff --git a/src/sem/reference_type_test.cc b/src/sem/reference_type_test.cc
index bc890fa..9084593 100644
--- a/src/sem/reference_type_test.cc
+++ b/src/sem/reference_type_test.cc
@@ -23,8 +23,8 @@
 
 TEST_F(ReferenceTest, Creation) {
   auto* r = create<Reference>(create<I32>(), ast::StorageClass::kStorage);
-  EXPECT_TRUE(r->type()->Is<sem::I32>());
-  EXPECT_EQ(r->storage_class(), ast::StorageClass::kStorage);
+  EXPECT_TRUE(r->StoreType()->Is<sem::I32>());
+  EXPECT_EQ(r->StorageClass(), ast::StorageClass::kStorage);
 }
 
 TEST_F(ReferenceTest, TypeName) {
diff --git a/src/sem/type.cc b/src/sem/type.cc
index 7e80396..1f7ffca 100644
--- a/src/sem/type.cc
+++ b/src/sem/type.cc
@@ -38,7 +38,7 @@
 const Type* Type::UnwrapPtr() const {
   auto* type = this;
   while (auto* ptr = type->As<sem::Pointer>()) {
-    type = ptr->type();
+    type = ptr->StoreType();
   }
   return type;
 }
@@ -53,7 +53,7 @@
   auto* type = this;
   while (true) {
     if (auto* ptr = type->As<sem::Pointer>()) {
-      type = ptr->type();
+      type = ptr->StoreType();
     } else {
       break;
     }
diff --git a/src/transform/decompose_storage_access.cc b/src/transform/decompose_storage_access.cc
index eb4cdbc..ab256a2 100644
--- a/src/transform/decompose_storage_access.cc
+++ b/src/transform/decompose_storage_access.cc
@@ -334,7 +334,7 @@
 const ast::NamedType* ConstructedTypeOf(const sem::Type* ty) {
   while (true) {
     if (auto* ptr = ty->As<sem::Pointer>()) {
-      ty = ptr->type();
+      ty = ptr->StoreType();
       continue;
     }
     if (auto* str = ty->As<sem::Struct>()) {
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index aa47e1f..08255ae 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -1912,7 +1912,7 @@
     out_ << mat->columns() << "x" << mat->rows();
   } else if (auto* ptr = type->As<sem::Pointer>()) {
     // TODO(dsinclair): Storage class?
-    if (!EmitType(ptr->type(), "")) {
+    if (!EmitType(ptr->StoreType(), "")) {
       return false;
     }
     out_ << "*";
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index d3ca53c..9c2cf36 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -3131,12 +3131,12 @@
 
 bool Builder::GeneratePointerType(const sem::Pointer* ptr,
                                   const Operand& result) {
-  auto pointee_id = GenerateTypeIfNeeded(ptr->type());
+  auto pointee_id = GenerateTypeIfNeeded(ptr->StoreType());
   if (pointee_id == 0) {
     return false;
   }
 
-  auto stg_class = ConvertStorageClass(ptr->storage_class());
+  auto stg_class = ConvertStorageClass(ptr->StorageClass());
   if (stg_class == SpvStorageClassMax) {
     error_ = "invalid storage class for pointer";
     return false;