cleanup: Refactor tests to use ast::Builder helpers

Change-Id: I5bf1dac217c9c6192c0637d98c4a38196d41cbe8
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/36382
Commit-Queue: Ben Clayton <bclayton@google.com>
Auto-Submit: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/writer/msl/generator_impl_case_test.cc b/src/writer/msl/generator_impl_case_test.cc
index 5ab3f25..dd19fcc 100644
--- a/src/writer/msl/generator_impl_case_test.cc
+++ b/src/writer/msl/generator_impl_case_test.cc
@@ -33,13 +33,11 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_Case) {
-  ast::type::I32 i32;
-
   auto* body = create<ast::BlockStatement>(ast::StatementList{
       create<ast::BreakStatement>(),
   });
   ast::CaseSelectorList lit;
-  lit.push_back(create<ast::SintLiteral>(&i32, 5));
+  lit.push_back(create<ast::SintLiteral>(ty.i32, 5));
   auto* c = create<ast::CaseStatement>(lit, body);
 
   gen.increment_indent();
@@ -52,10 +50,8 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_Case_BreaksByDefault) {
-  ast::type::I32 i32;
-
   ast::CaseSelectorList lit;
-  lit.push_back(create<ast::SintLiteral>(&i32, 5));
+  lit.push_back(create<ast::SintLiteral>(ty.i32, 5));
   auto* c = create<ast::CaseStatement>(
       lit, create<ast::BlockStatement>(ast::StatementList{}));
 
@@ -69,13 +65,11 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_Case_WithFallthrough) {
-  ast::type::I32 i32;
-
   auto* body = create<ast::BlockStatement>(ast::StatementList{
       create<ast::FallthroughStatement>(),
   });
   ast::CaseSelectorList lit;
-  lit.push_back(create<ast::SintLiteral>(&i32, 5));
+  lit.push_back(create<ast::SintLiteral>(ty.i32, 5));
   auto* c = create<ast::CaseStatement>(lit, body);
 
   gen.increment_indent();
@@ -88,14 +82,12 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_Case_MultipleSelectors) {
-  ast::type::I32 i32;
-
   auto* body = create<ast::BlockStatement>(ast::StatementList{
       create<ast::BreakStatement>(),
   });
   ast::CaseSelectorList lit;
-  lit.push_back(create<ast::SintLiteral>(&i32, 5));
-  lit.push_back(create<ast::SintLiteral>(&i32, 6));
+  lit.push_back(create<ast::SintLiteral>(ty.i32, 5));
+  lit.push_back(create<ast::SintLiteral>(ty.i32, 6));
   auto* c = create<ast::CaseStatement>(lit, body);
 
   gen.increment_indent();
diff --git a/src/writer/msl/generator_impl_cast_test.cc b/src/writer/msl/generator_impl_cast_test.cc
index 73ae2da..3713b86 100644
--- a/src/writer/msl/generator_impl_cast_test.cc
+++ b/src/writer/msl/generator_impl_cast_test.cc
@@ -31,20 +31,14 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, EmitExpression_Cast_Scalar) {
-  ast::ExpressionList params;
-  params.push_back(Expr("id"));
-
-  auto* cast = create<ast::TypeConstructorExpression>(ty.f32, params);
+  auto* cast = Construct<f32>("id");
 
   ASSERT_TRUE(gen.EmitExpression(cast)) << gen.error();
   EXPECT_EQ(gen.result(), "float(id)");
 }
 
 TEST_F(MslGeneratorImplTest, EmitExpression_Cast_Vector) {
-  ast::ExpressionList params;
-  params.push_back(Expr("id"));
-
-  auto* cast = create<ast::TypeConstructorExpression>(ty.vec3<f32>(), params);
+  auto* cast = vec3<f32>("id");
 
   ASSERT_TRUE(gen.EmitExpression(cast)) << gen.error();
   EXPECT_EQ(gen.result(), "float3(id)");
diff --git a/src/writer/msl/generator_impl_constructor_test.cc b/src/writer/msl/generator_impl_constructor_test.cc
index f1a1b1a..ff82185 100644
--- a/src/writer/msl/generator_impl_constructor_test.cc
+++ b/src/writer/msl/generator_impl_constructor_test.cc
@@ -38,136 +38,76 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Bool) {
-  auto* lit = create<ast::BoolLiteral>(ty.bool_, false);
-  auto* expr = create<ast::ScalarConstructorExpression>(lit);
-
+  auto* expr = Expr(false);
   ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "false");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Int) {
-  auto* lit = create<ast::SintLiteral>(ty.i32, -12345);
-  auto* expr = create<ast::ScalarConstructorExpression>(lit);
-
+  auto* expr = Expr(-12345);
   ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "-12345");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_UInt) {
-  auto* lit = create<ast::UintLiteral>(ty.u32, 56779);
-  auto* expr = create<ast::ScalarConstructorExpression>(lit);
-
+  auto* expr = Expr(56779u);
   ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "56779u");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Float) {
   // Use a number close to 1<<30 but whose decimal representation ends in 0.
-  auto* lit =
-      create<ast::FloatLiteral>(ty.f32, static_cast<float>((1 << 30) - 4));
-  auto* expr = create<ast::ScalarConstructorExpression>(lit);
-
+  auto* expr = Expr(static_cast<float>((1 << 30) - 4));
   ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "1073741824.0f");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Float) {
-  auto* lit = create<ast::FloatLiteral>(ty.f32, -1.2e-5);
-  ast::ExpressionList values;
-  values.push_back(create<ast::ScalarConstructorExpression>(lit));
-
-  auto* expr = create<ast::TypeConstructorExpression>(ty.f32, values);
-
+  auto* expr = Construct<f32>(-1.2e-5f);
   ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "float(-0.000012f)");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Bool) {
-  auto* lit = create<ast::BoolLiteral>(ty.bool_, true);
-  ast::ExpressionList values;
-  values.push_back(create<ast::ScalarConstructorExpression>(lit));
-
-  auto* expr = create<ast::TypeConstructorExpression>(ty.bool_, values);
-
+  auto* expr = Construct<bool>(true);
   ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "bool(true)");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Int) {
-  auto* lit = create<ast::SintLiteral>(ty.i32, -12345);
-  ast::ExpressionList values;
-  values.push_back(create<ast::ScalarConstructorExpression>(lit));
-
-  auto* expr = create<ast::TypeConstructorExpression>(ty.i32, values);
-
+  auto* expr = Construct<i32>(-12345);
   ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "int(-12345)");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Uint) {
-  auto* lit = create<ast::UintLiteral>(ty.u32, 12345);
-  ast::ExpressionList values;
-  values.push_back(create<ast::ScalarConstructorExpression>(lit));
-
-  auto* expr = create<ast::TypeConstructorExpression>(ty.u32, values);
-
+  auto* expr = Construct<u32>(12345u);
   ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "uint(12345u)");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Vec) {
-  ast::type::Vector vec(ty.f32, 3);
-
-  auto* lit1 = create<ast::FloatLiteral>(ty.f32, 1.f);
-  auto* lit2 = create<ast::FloatLiteral>(ty.f32, 2.f);
-  auto* lit3 = create<ast::FloatLiteral>(ty.f32, 3.f);
-  ast::ExpressionList values;
-  values.push_back(create<ast::ScalarConstructorExpression>(lit1));
-  values.push_back(create<ast::ScalarConstructorExpression>(lit2));
-  values.push_back(create<ast::ScalarConstructorExpression>(lit3));
-
-  auto* expr = create<ast::TypeConstructorExpression>(&vec, values);
-
+  auto* expr = vec3<f32>(1.f, 2.f, 3.f);
   ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "float3(1.0f, 2.0f, 3.0f)");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Vec_Empty) {
-  ast::type::Vector vec(ty.f32, 3);
-
-  ast::ExpressionList values;
-  auto* expr = create<ast::TypeConstructorExpression>(&vec, values);
-
+  auto* expr = vec3<f32>();
   ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "float3(0.0f)");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Mat) {
-  ast::type::Matrix mat(ty.f32, 3, 2);  // 3 ROWS, 2 COLUMNS
-  ast::type::Vector vec(ty.f32, 3);
-
-  // WGSL matrix is mat2x3 (it flips for AST, sigh). With a type constructor
-  // of <vec3, vec3>
-
   ast::ExpressionList mat_values;
 
   for (size_t i = 0; i < 2; i++) {
-    auto* lit1 =
-        create<ast::FloatLiteral>(ty.f32, static_cast<float>(1 + (i * 2)));
-    auto* lit2 =
-        create<ast::FloatLiteral>(ty.f32, static_cast<float>(2 + (i * 2)));
-    auto* lit3 =
-        create<ast::FloatLiteral>(ty.f32, static_cast<float>(3 + (i * 2)));
-
-    ast::ExpressionList values;
-    values.push_back(create<ast::ScalarConstructorExpression>(lit1));
-    values.push_back(create<ast::ScalarConstructorExpression>(lit2));
-    values.push_back(create<ast::ScalarConstructorExpression>(lit3));
-
-    mat_values.push_back(create<ast::TypeConstructorExpression>(&vec, values));
+    mat_values.push_back(vec3<f32>(static_cast<float>(1 + (i * 2)),
+                                   static_cast<float>(2 + (i * 2)),
+                                   static_cast<float>(3 + (i * 2))));
   }
 
-  auto* expr = create<ast::TypeConstructorExpression>(&mat, mat_values);
+  auto* expr = Construct(ty.mat2x3<f32>(), mat_values);
   ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
 
   // A matrix of type T with n columns and m rows can also be constructed from
@@ -177,28 +117,17 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Array) {
-  ast::type::Vector vec(ty.f32, 3);
-  ast::type::Array ary(&vec, 3, ast::ArrayDecorationList{});
+  ast::type::Array ary(ty.vec3<f32>(), 3, ast::ArrayDecorationList{});
 
   ast::ExpressionList ary_values;
 
   for (size_t i = 0; i < 3; i++) {
-    auto* lit1 =
-        create<ast::FloatLiteral>(ty.f32, static_cast<float>(1 + (i * 3)));
-    auto* lit2 =
-        create<ast::FloatLiteral>(ty.f32, static_cast<float>(2 + (i * 3)));
-    auto* lit3 =
-        create<ast::FloatLiteral>(ty.f32, static_cast<float>(3 + (i * 3)));
-
-    ast::ExpressionList values;
-    values.push_back(create<ast::ScalarConstructorExpression>(lit1));
-    values.push_back(create<ast::ScalarConstructorExpression>(lit2));
-    values.push_back(create<ast::ScalarConstructorExpression>(lit3));
-
-    ary_values.push_back(create<ast::TypeConstructorExpression>(&vec, values));
+    ary_values.push_back(vec3<f32>(static_cast<float>(1 + (i * 3)),
+                                   static_cast<float>(2 + (i * 3)),
+                                   static_cast<float>(3 + (i * 3))));
   }
 
-  auto* expr = create<ast::TypeConstructorExpression>(&ary, ary_values);
+  auto* expr = Construct(&ary, ary_values);
   ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(),
             "{float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), "
diff --git a/src/writer/msl/generator_impl_function_test.cc b/src/writer/msl/generator_impl_function_test.cc
index 1fec635..7ae2080 100644
--- a/src/writer/msl/generator_impl_function_test.cc
+++ b/src/writer/msl/generator_impl_function_test.cc
@@ -578,8 +578,7 @@
   mod->AddFunction(sub_func);
 
   ast::ExpressionList expr;
-  expr.push_back(create<ast::ScalarConstructorExpression>(
-      create<ast::FloatLiteral>(ty.f32, 1.0f)));
+  expr.push_back(Expr(1.0f));
 
   auto* var = Var("v", ast::StorageClass::kFunction, ty.f32,
                   Call("sub_func", 1.0f), ast::VariableDecorationList{});
@@ -710,8 +709,7 @@
   mod->AddFunction(sub_func);
 
   ast::ExpressionList expr;
-  expr.push_back(create<ast::ScalarConstructorExpression>(
-      create<ast::FloatLiteral>(ty.f32, 1.0f)));
+  expr.push_back(Expr(1.0f));
 
   auto* var = Var("v", ast::StorageClass::kFunction, ty.f32,
                   Call("sub_func", 1.0f), ast::VariableDecorationList{});
@@ -764,15 +762,9 @@
   });
 
   auto body = ast::StatementList{
-      create<ast::AssignmentStatement>(
-          Expr("bar"), create<ast::ScalarConstructorExpression>(
-                           create<ast::FloatLiteral>(ty.f32, 1.f))),
+      create<ast::AssignmentStatement>(Expr("bar"), Expr(1.f)),
       create<ast::IfStatement>(create<ast::BinaryExpression>(
-                                   ast::BinaryOp::kEqual,
-                                   create<ast::ScalarConstructorExpression>(
-                                       create<ast::SintLiteral>(ty.i32, 1)),
-                                   create<ast::ScalarConstructorExpression>(
-                                       create<ast::SintLiteral>(ty.i32, 1))),
+                                   ast::BinaryOp::kEqual, Expr(1), Expr(1)),
                                list, ast::ElseStatementList{}),
       create<ast::ReturnStatement>(),
   };
@@ -825,10 +817,8 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_Function_WithArrayParams) {
-  ast::type::Array ary(ty.f32, 5, ast::ArrayDecorationList{});
-
   ast::VariableList params;
-  params.push_back(Var("a", ast::StorageClass::kNone, &ary));  // decorations
+  params.push_back(Var("a", ast::StorageClass::kNone, ty.array<f32, 5>()));
 
   auto* func = Func("my_func", params, ty.void_,
                     ast::StatementList{
diff --git a/src/writer/msl/generator_impl_import_test.cc b/src/writer/msl/generator_impl_import_test.cc
index ef9132d..b7d97d6 100644
--- a/src/writer/msl/generator_impl_import_test.cc
+++ b/src/writer/msl/generator_impl_import_test.cc
@@ -117,8 +117,8 @@
 TEST_P(MslImportData_DualParam_VectorTest, FloatVector) {
   auto param = GetParam();
 
-  auto* expr = Call(param.name, Construct(ty.vec3<f32>(), 1.f, 2.f, 3.f),
-                    Construct(ty.vec3<f32>(), 4.f, 5.f, 6.f));
+  auto* expr =
+      Call(param.name, vec3<f32>(1.f, 2.f, 3.f), vec3<f32>(4.f, 5.f, 6.f));
   ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
   ASSERT_TRUE(gen.EmitCall(expr)) << gen.error();
   EXPECT_EQ(gen.result(), std::string("metal::") + param.msl_name +
@@ -178,10 +178,7 @@
                                          MslImportData{"clamp", "clamp"}));
 
 TEST_F(MslGeneratorImplTest, MslImportData_Determinant) {
-  ast::type::F32 f32;
-  ast::type::Matrix mat(&f32, 3, 3);
-
-  auto* var = Var("var", ast::StorageClass::kFunction, &mat);
+  auto* var = Var("var", ast::StorageClass::kFunction, ty.mat3x3<f32>());
   mod->AddGlobalVariable(var);
 
   auto* expr = Call("determinant", "var");
diff --git a/src/writer/msl/generator_impl_module_constant_test.cc b/src/writer/msl/generator_impl_module_constant_test.cc
index 87389fb..7e272d6 100644
--- a/src/writer/msl/generator_impl_module_constant_test.cc
+++ b/src/writer/msl/generator_impl_module_constant_test.cc
@@ -35,12 +35,9 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_ModuleConstant) {
-  ast::type::Array ary(ty.f32, 3, ast::ArrayDecorationList{});
   auto* var =
-      Const("pos", ast::StorageClass::kNone, &ary,
-            create<ast::TypeConstructorExpression>(
-                &ary, ast::ExpressionList{Expr(1.f), Expr(2.f), Expr(3.f)}),
-            ast::VariableDecorationList{});
+      Const("pos", ast::StorageClass::kNone, ty.array<f32, 3>(),
+            array<f32, 3>(1.f, 2.f, 3.f), ast::VariableDecorationList{});
 
   ASSERT_TRUE(gen.EmitProgramConstVariable(var)) << gen.error();
   EXPECT_EQ(gen.result(), "constant float pos[3] = {1.0f, 2.0f, 3.0f};\n");
diff --git a/src/writer/msl/generator_impl_test.cc b/src/writer/msl/generator_impl_test.cc
index d9a63d3..b5f4dd1 100644
--- a/src/writer/msl/generator_impl_test.cc
+++ b/src/writer/msl/generator_impl_test.cc
@@ -116,35 +116,27 @@
 }
 
 TEST_F(MslGeneratorImplTest, calculate_alignment_size_array) {
-  ast::type::F32 f32;
-  ast::type::Array ary(&f32, 4, ast::ArrayDecorationList{});
-  EXPECT_EQ(4u * 4u, gen.calculate_alignment_size(&ary));
+  EXPECT_EQ(4u * 4u, gen.calculate_alignment_size(ty.array<f32, 4>()));
 }
 
 TEST_F(MslGeneratorImplTest, calculate_alignment_size_bool) {
-  ast::type::Bool bool_type;
-  EXPECT_EQ(1u, gen.calculate_alignment_size(&bool_type));
+  EXPECT_EQ(1u, gen.calculate_alignment_size(ty.bool_));
 }
 
 TEST_F(MslGeneratorImplTest, calculate_alignment_size_f32) {
-  ast::type::F32 f32;
-  EXPECT_EQ(4u, gen.calculate_alignment_size(&f32));
+  EXPECT_EQ(4u, gen.calculate_alignment_size(ty.f32));
 }
 
 TEST_F(MslGeneratorImplTest, calculate_alignment_size_i32) {
-  ast::type::I32 i32;
-  EXPECT_EQ(4u, gen.calculate_alignment_size(&i32));
+  EXPECT_EQ(4u, gen.calculate_alignment_size(ty.i32));
 }
 
 TEST_F(MslGeneratorImplTest, calculate_alignment_size_matrix) {
-  ast::type::F32 f32;
-  ast::type::Matrix mat(&f32, 3, 2);
-  EXPECT_EQ(4u * 3u * 2u, gen.calculate_alignment_size(&mat));
+  EXPECT_EQ(4u * 3u * 2u, gen.calculate_alignment_size(ty.mat3x2<f32>()));
 }
 
 TEST_F(MslGeneratorImplTest, calculate_alignment_size_pointer) {
-  ast::type::Bool bool_type;
-  ast::type::Pointer ptr(&bool_type, ast::StorageClass::kPrivate);
+  ast::type::Pointer ptr(ty.bool_, ast::StorageClass::kPrivate);
   EXPECT_EQ(0u, gen.calculate_alignment_size(&ptr));
 }
 
@@ -179,8 +171,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, calculate_alignment_size_u32) {
-  ast::type::U32 u32;
-  EXPECT_EQ(4u, gen.calculate_alignment_size(&u32));
+  EXPECT_EQ(4u, gen.calculate_alignment_size(ty.u32));
 }
 
 struct MslVectorSizeData {
@@ -195,8 +186,7 @@
 TEST_P(MslVectorSizeBoolTest, calculate) {
   auto param = GetParam();
 
-  ast::type::Bool bool_type;
-  ast::type::Vector vec(&bool_type, param.elements);
+  ast::type::Vector vec(ty.bool_, param.elements);
   EXPECT_EQ(param.byte_size, gen.calculate_alignment_size(&vec));
 }
 INSTANTIATE_TEST_SUITE_P(MslGeneratorImplTest,
@@ -209,8 +199,7 @@
 TEST_P(MslVectorSizeI32Test, calculate) {
   auto param = GetParam();
 
-  ast::type::I32 i32;
-  ast::type::Vector vec(&i32, param.elements);
+  ast::type::Vector vec(ty.i32, param.elements);
   EXPECT_EQ(param.byte_size, gen.calculate_alignment_size(&vec));
 }
 INSTANTIATE_TEST_SUITE_P(MslGeneratorImplTest,
@@ -223,8 +212,7 @@
 TEST_P(MslVectorSizeU32Test, calculate) {
   auto param = GetParam();
 
-  ast::type::U32 u32;
-  ast::type::Vector vec(&u32, param.elements);
+  ast::type::Vector vec(ty.u32, param.elements);
   EXPECT_EQ(param.byte_size, gen.calculate_alignment_size(&vec));
 }
 INSTANTIATE_TEST_SUITE_P(MslGeneratorImplTest,
@@ -237,8 +225,7 @@
 TEST_P(MslVectorSizeF32Test, calculate) {
   auto param = GetParam();
 
-  ast::type::F32 f32;
-  ast::type::Vector vec(&f32, param.elements);
+  ast::type::Vector vec(ty.f32, param.elements);
   EXPECT_EQ(param.byte_size, gen.calculate_alignment_size(&vec));
 }
 INSTANTIATE_TEST_SUITE_P(MslGeneratorImplTest,
diff --git a/src/writer/msl/generator_impl_type_test.cc b/src/writer/msl/generator_impl_type_test.cc
index 29a44aa..8f50096 100644
--- a/src/writer/msl/generator_impl_type_test.cc
+++ b/src/writer/msl/generator_impl_type_test.cc
@@ -59,108 +59,78 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Array) {
-  ast::type::Bool b;
-  ast::type::Array a(&b, 4, ast::ArrayDecorationList{});
-
-  ASSERT_TRUE(gen.EmitType(&a, "ary")) << gen.error();
+  ASSERT_TRUE(gen.EmitType(ty.array<bool, 4>(), "ary")) << gen.error();
   EXPECT_EQ(gen.result(), "bool ary[4]");
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_ArrayOfArray) {
-  ast::type::Bool b;
-  ast::type::Array a(&b, 4, ast::ArrayDecorationList{});
-  ast::type::Array c(&a, 5, ast::ArrayDecorationList{});
-
-  ASSERT_TRUE(gen.EmitType(&c, "ary")) << gen.error();
+  auto* a = ty.array<bool, 4>();
+  auto* b = ty.array(a, 5);
+  ASSERT_TRUE(gen.EmitType(b, "ary")) << gen.error();
   EXPECT_EQ(gen.result(), "bool ary[5][4]");
 }
 
 // TODO(dsinclair): Is this possible? What order should it output in?
 TEST_F(MslGeneratorImplTest, DISABLED_EmitType_ArrayOfArrayOfRuntimeArray) {
-  ast::type::Bool b;
-  ast::type::Array a(&b, 4, ast::ArrayDecorationList{});
-  ast::type::Array c(&a, 5, ast::ArrayDecorationList{});
-  ast::type::Array d(&c, 0, ast::ArrayDecorationList{});
-
-  ASSERT_TRUE(gen.EmitType(&c, "ary")) << gen.error();
+  auto* a = ty.array<bool, 4>();
+  auto* b = ty.array(a, 5);
+  auto* c = ty.array(b, 0);
+  ASSERT_TRUE(gen.EmitType(c, "ary")) << gen.error();
   EXPECT_EQ(gen.result(), "bool ary[5][4][1]");
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_ArrayOfArrayOfArray) {
-  ast::type::Bool b;
-  ast::type::Array a(&b, 4, ast::ArrayDecorationList{});
-  ast::type::Array c(&a, 5, ast::ArrayDecorationList{});
-  ast::type::Array d(&c, 6, ast::ArrayDecorationList{});
-
-  ASSERT_TRUE(gen.EmitType(&d, "ary")) << gen.error();
+  auto* a = ty.array<bool, 4>();
+  auto* b = ty.array(a, 5);
+  auto* c = ty.array(b, 6);
+  ASSERT_TRUE(gen.EmitType(c, "ary")) << gen.error();
   EXPECT_EQ(gen.result(), "bool ary[6][5][4]");
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Array_NameCollision) {
-  ast::type::Bool b;
-  ast::type::Array a(&b, 4, ast::ArrayDecorationList{});
-
-  ASSERT_TRUE(gen.EmitType(&a, "bool")) << gen.error();
+  ASSERT_TRUE(gen.EmitType(ty.array<bool, 4>(), "bool")) << gen.error();
   EXPECT_EQ(gen.result(), "bool bool_tint_0[4]");
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Array_WithoutName) {
-  ast::type::Bool b;
-  ast::type::Array a(&b, 4, ast::ArrayDecorationList{});
-
-  ASSERT_TRUE(gen.EmitType(&a, "")) << gen.error();
+  ASSERT_TRUE(gen.EmitType(ty.array<bool, 4>(), "")) << gen.error();
   EXPECT_EQ(gen.result(), "bool[4]");
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_RuntimeArray) {
-  ast::type::Bool b;
-  ast::type::Array a(&b, 0, ast::ArrayDecorationList{});
-
-  ASSERT_TRUE(gen.EmitType(&a, "ary")) << gen.error();
+  ASSERT_TRUE(gen.EmitType(ty.array<bool, 1>(), "ary")) << gen.error();
   EXPECT_EQ(gen.result(), "bool ary[1]");
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_RuntimeArray_NameCollision) {
-  ast::type::Bool b;
-  ast::type::Array a(&b, 0, ast::ArrayDecorationList{});
-
-  ASSERT_TRUE(gen.EmitType(&a, "discard_fragment")) << gen.error();
+  ASSERT_TRUE(gen.EmitType(ty.array<bool, 1>(), "discard_fragment"))
+      << gen.error();
   EXPECT_EQ(gen.result(), "bool discard_fragment_tint_0[1]");
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Bool) {
-  ast::type::Bool b;
-
-  ASSERT_TRUE(gen.EmitType(&b, "")) << gen.error();
+  ASSERT_TRUE(gen.EmitType(ty.bool_, "")) << gen.error();
   EXPECT_EQ(gen.result(), "bool");
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_F32) {
-  ast::type::F32 f32;
-
-  ASSERT_TRUE(gen.EmitType(&f32, "")) << gen.error();
+  ASSERT_TRUE(gen.EmitType(ty.f32, "")) << gen.error();
   EXPECT_EQ(gen.result(), "float");
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_I32) {
-  ast::type::I32 i32;
-
-  ASSERT_TRUE(gen.EmitType(&i32, "")) << gen.error();
+  ASSERT_TRUE(gen.EmitType(ty.i32, "")) << gen.error();
   EXPECT_EQ(gen.result(), "int");
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Matrix) {
-  ast::type::F32 f32;
-  ast::type::Matrix m(&f32, 3, 2);
-
-  ASSERT_TRUE(gen.EmitType(&m, "")) << gen.error();
+  ASSERT_TRUE(gen.EmitType(ty.mat2x3<f32>(), "")) << gen.error();
   EXPECT_EQ(gen.result(), "float2x3");
 }
 
 // TODO(dsinclair): How to annotate as workgroup?
 TEST_F(MslGeneratorImplTest, DISABLED_EmitType_Pointer) {
-  ast::type::F32 f32;
-  ast::type::Pointer p(&f32, ast::StorageClass::kWorkgroup);
+  ast::type::Pointer p(ty.f32, ast::StorageClass::kWorkgroup);
 
   ASSERT_TRUE(gen.EmitType(&p, "")) << gen.error();
   EXPECT_EQ(gen.result(), "float*");
@@ -247,24 +217,17 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_U32) {
-  ast::type::U32 u32;
-
-  ASSERT_TRUE(gen.EmitType(&u32, "")) << gen.error();
+  ASSERT_TRUE(gen.EmitType(ty.u32, "")) << gen.error();
   EXPECT_EQ(gen.result(), "uint");
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Vector) {
-  ast::type::F32 f32;
-  ast::type::Vector v(&f32, 3);
-
-  ASSERT_TRUE(gen.EmitType(&v, "")) << gen.error();
+  ASSERT_TRUE(gen.EmitType(ty.vec3<f32>(), "")) << gen.error();
   EXPECT_EQ(gen.result(), "float3");
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Void) {
-  ast::type::Void v;
-
-  ASSERT_TRUE(gen.EmitType(&v, "")) << gen.error();
+  ASSERT_TRUE(gen.EmitType(ty.void_, "")) << gen.error();
   EXPECT_EQ(gen.result(), "void");
 }
 
@@ -324,8 +287,7 @@
 TEST_P(MslSampledtexturesTest, Emit) {
   auto params = GetParam();
 
-  ast::type::F32 f32;
-  ast::type::SampledTexture s(params.dim, &f32);
+  ast::type::SampledTexture s(params.dim, ty.f32);
 
   ASSERT_TRUE(gen.EmitType(&s, "")) << gen.error();
   EXPECT_EQ(gen.result(), params.result);
@@ -350,8 +312,7 @@
                         "texturecube_array<float, access::sample>"}));
 
 TEST_F(MslGeneratorImplTest, Emit_TypeMultisampledTexture) {
-  ast::type::U32 u32;
-  ast::type::MultisampledTexture s(ast::type::TextureDimension::k2d, &u32);
+  ast::type::MultisampledTexture s(ast::type::TextureDimension::k2d, ty.u32);
 
   ASSERT_TRUE(gen.EmitType(&s, "")) << gen.error();
   EXPECT_EQ(gen.result(), "texture2d_ms<uint, access::sample>");
diff --git a/src/writer/msl/generator_impl_variable_decl_statement_test.cc b/src/writer/msl/generator_impl_variable_decl_statement_test.cc
index 0a89380..777bb32 100644
--- a/src/writer/msl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/msl/generator_impl_variable_decl_statement_test.cc
@@ -131,9 +131,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Initializer_ZeroVec) {
-  ast::ExpressionList values;
-  auto* zero_vec =
-      create<ast::TypeConstructorExpression>(ty.vec3<f32>(), values);
+  auto* zero_vec = vec3<f32>();
 
   auto* var = Var("a", ast::StorageClass::kNone, ty.vec3<f32>(), zero_vec,
                   ast::VariableDecorationList{});