Remove all Source{} smell from tests

Switch all remaining AST stack allocations in tests to using create<T>() which will automatically inject the current Source as the first parameter.

Most remaining uses of Source{} in the codebase are places where we need to fix.

Bug: tint:396
Change-Id: I24655800b50d6ad52e682a7339022972e9b354d9
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/36380
Commit-Queue: Ben Clayton <bclayton@google.com>
Commit-Queue: David Neto <dneto@google.com>
Auto-Submit: Ben Clayton <bclayton@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/reader/wgsl/parser_impl_test_helper.h b/src/reader/wgsl/parser_impl_test_helper.h
index 1c65852..184eddd 100644
--- a/src/reader/wgsl/parser_impl_test_helper.h
+++ b/src/reader/wgsl/parser_impl_test_helper.h
@@ -21,6 +21,7 @@
 #include <vector>
 
 #include "gtest/gtest.h"
+#include "src/ast/builder.h"
 #include "src/reader/wgsl/parser_impl.h"
 
 namespace tint {
@@ -28,7 +29,7 @@
 namespace wgsl {
 
 /// WGSL Parser test class
-class ParserImplTest : public testing::Test {
+class ParserImplTest : public testing::Test, public ast::BuilderWithModule {
  public:
   /// Constructor
   ParserImplTest();
@@ -50,7 +51,8 @@
 
 /// WGSL Parser test class with param
 template <typename T>
-class ParserImplTestWithParam : public testing::TestWithParam<T> {
+class ParserImplTestWithParam : public testing::TestWithParam<T>,
+                                public ast::BuilderWithModule {
  public:
   /// Constructor
   ParserImplTestWithParam() = default;
diff --git a/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc b/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
index 5a8c7d3..0e57c1d 100644
--- a/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
@@ -83,23 +83,20 @@
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_ParsesWithAccessDeco_Read) {
-  ast::type::I32 i32;
-
   auto p = parser("my_var : [[access(read)]] S");
 
-  ast::StructMember mem(Source{}, p->get_module().RegisterSymbol("a"), "a",
-                        &i32, ast::StructMemberDecorationList{});
+  auto* mem = Member("a", ty.i32, ast::StructMemberDecorationList{});
   ast::StructMemberList members;
-  members.push_back(&mem);
+  members.push_back(mem);
 
-  ast::StructBlockDecoration block_deco(Source{});
+  auto* block_deco = create<ast::StructBlockDecoration>();
   ast::StructDecorationList decos;
-  decos.push_back(&block_deco);
+  decos.push_back(block_deco);
 
-  ast::Struct str(Source{}, members, decos);
-  ast::type::Struct s(p->get_module().RegisterSymbol("S"), "S", &str);
+  auto* str = create<ast::Struct>(members, decos);
+  auto* s = ty.struct_("S", str);
 
-  p->register_constructed("S", &s);
+  p->register_constructed("S", s);
 
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_FALSE(p->has_error()) << p->error();
@@ -111,23 +108,20 @@
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_ParsesWithAccessDeco_ReadWrite) {
-  ast::type::I32 i32;
-
   auto p = parser("my_var : [[access(read_write)]] S");
 
-  ast::StructMember mem(Source{}, p->get_module().RegisterSymbol("a"), "a",
-                        &i32, ast::StructMemberDecorationList{});
+  auto* mem = Member("a", ty.i32, ast::StructMemberDecorationList{});
   ast::StructMemberList members;
-  members.push_back(&mem);
+  members.push_back(mem);
 
-  ast::StructBlockDecoration block_deco(Source{});
+  auto* block_deco = create<ast::StructBlockDecoration>();
   ast::StructDecorationList decos;
-  decos.push_back(&block_deco);
+  decos.push_back(block_deco);
 
-  ast::Struct str(Source{}, members, decos);
-  ast::type::Struct s(p->get_module().RegisterSymbol("S"), "S", &str);
+  auto* str = create<ast::Struct>(members, decos);
+  auto* s = ty.struct_("S", str);
 
-  p->register_constructed("S", &s);
+  p->register_constructed("S", s);
 
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_FALSE(p->has_error()) << p->error();
@@ -139,23 +133,20 @@
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_MultipleAccessDecoFail) {
-  ast::type::I32 i32;
-
   auto p = parser("my_var : [[access(read), access(read_write)]] S");
 
-  ast::StructMember mem(Source{}, p->get_module().RegisterSymbol("a"), "a",
-                        &i32, ast::StructMemberDecorationList{});
+  auto* mem = Member("a", ty.i32, ast::StructMemberDecorationList{});
   ast::StructMemberList members;
-  members.push_back(&mem);
+  members.push_back(mem);
 
-  ast::StructBlockDecoration block_deco(Source{});
+  auto* block_deco = create<ast::StructBlockDecoration>();
   ast::StructDecorationList decos;
-  decos.push_back(&block_deco);
+  decos.push_back(block_deco);
 
-  ast::Struct str(Source{}, members, decos);
-  ast::type::Struct s(p->get_module().RegisterSymbol("S"), "S", &str);
+  auto* str = create<ast::Struct>(members, decos);
+  auto* s = ty.struct_("S", str);
 
-  p->register_constructed("S", &s);
+  p->register_constructed("S", s);
 
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_TRUE(p->has_error());
@@ -164,23 +155,20 @@
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_MultipleAccessDeco_MultiBlock_Fail) {
-  ast::type::I32 i32;
-
   auto p = parser("my_var : [[access(read)]][[access(read_write)]] S");
 
-  ast::StructMember mem(Source{}, p->get_module().RegisterSymbol("a"), "a",
-                        &i32, ast::StructMemberDecorationList{});
+  auto* mem = Member("a", ty.i32, ast::StructMemberDecorationList{});
   ast::StructMemberList members;
-  members.push_back(&mem);
+  members.push_back(mem);
 
-  ast::StructBlockDecoration block_deco(Source{});
+  auto* block_deco = create<ast::StructBlockDecoration>();
   ast::StructDecorationList decos;
-  decos.push_back(&block_deco);
+  decos.push_back(block_deco);
 
-  ast::Struct str(Source{}, members, decos);
-  ast::type::Struct s(p->get_module().RegisterSymbol("S"), "S", &str);
+  auto* str = create<ast::Struct>(members, decos);
+  auto* s = ty.struct_("S", str);
 
-  p->register_constructed("S", &s);
+  p->register_constructed("S", s);
 
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_TRUE(p->has_error());
@@ -205,23 +193,20 @@
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_NonAccessDecoFail) {
-  ast::type::I32 i32;
-
   auto p = parser("my_var : [[stride(1)]] S");
 
-  ast::StructMember mem(Source{}, p->get_module().RegisterSymbol("a"), "a",
-                        &i32, ast::StructMemberDecorationList{});
+  auto* mem = Member("a", ty.i32, ast::StructMemberDecorationList{});
   ast::StructMemberList members;
-  members.push_back(&mem);
+  members.push_back(mem);
 
-  ast::StructBlockDecoration block_deco(Source{});
+  auto* block_deco = create<ast::StructBlockDecoration>();
   ast::StructDecorationList decos;
-  decos.push_back(&block_deco);
+  decos.push_back(block_deco);
 
-  ast::Struct str(Source{}, members, decos);
-  ast::type::Struct s(p->get_module().RegisterSymbol("S"), "S", &str);
+  auto* str = create<ast::Struct>(members, decos);
+  auto* s = ty.struct_("S", str);
 
-  p->register_constructed("S", &s);
+  p->register_constructed("S", s);
 
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_TRUE(p->has_error());
diff --git a/src/writer/msl/generator_impl_assign_test.cc b/src/writer/msl/generator_impl_assign_test.cc
index 5a723cf..6f7c70f 100644
--- a/src/writer/msl/generator_impl_assign_test.cc
+++ b/src/writer/msl/generator_impl_assign_test.cc
@@ -30,10 +30,10 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_Assign) {
-  ast::AssignmentStatement assign(Source{}, Expr("lhs"), Expr("rhs"));
+  auto* assign = create<ast::AssignmentStatement>(Expr("lhs"), Expr("rhs"));
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&assign)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(assign)) << gen.error();
   EXPECT_EQ(gen.result(), "  lhs = rhs;\n");
 }
 
diff --git a/src/writer/msl/generator_impl_binary_test.cc b/src/writer/msl/generator_impl_binary_test.cc
index e85113c..b1b6ed0 100644
--- a/src/writer/msl/generator_impl_binary_test.cc
+++ b/src/writer/msl/generator_impl_binary_test.cc
@@ -38,8 +38,9 @@
 TEST_P(MslBinaryTest, Emit) {
   auto params = GetParam();
 
-  ast::BinaryExpression expr(Source{}, params.op, Expr("left"), Expr("right"));
-  ASSERT_TRUE(gen.EmitExpression(&expr)) << gen.error();
+  auto* expr =
+      create<ast::BinaryExpression>(params.op, Expr("left"), Expr("right"));
+  ASSERT_TRUE(gen.EmitExpression(expr)) << gen.error();
   EXPECT_EQ(gen.result(), params.result);
 }
 INSTANTIATE_TEST_SUITE_P(
diff --git a/src/writer/msl/generator_impl_bitcast_test.cc b/src/writer/msl/generator_impl_bitcast_test.cc
index 04cf30d..de56fd8 100644
--- a/src/writer/msl/generator_impl_bitcast_test.cc
+++ b/src/writer/msl/generator_impl_bitcast_test.cc
@@ -30,8 +30,8 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, EmitExpression_Bitcast) {
-  ast::BitcastExpression bitcast(Source{}, ty.f32, Expr("id"));
-  ASSERT_TRUE(gen.EmitExpression(&bitcast)) << gen.error();
+  auto* bitcast = create<ast::BitcastExpression>(ty.f32, Expr("id"));
+  ASSERT_TRUE(gen.EmitExpression(bitcast)) << gen.error();
   EXPECT_EQ(gen.result(), "as_type<float>(id)");
 }
 
diff --git a/src/writer/msl/generator_impl_block_test.cc b/src/writer/msl/generator_impl_block_test.cc
index f50bb3e..b355ed2 100644
--- a/src/writer/msl/generator_impl_block_test.cc
+++ b/src/writer/msl/generator_impl_block_test.cc
@@ -28,12 +28,12 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_Block) {
-  ast::BlockStatement b(Source{}, ast::StatementList{
-                                      create<ast::DiscardStatement>(Source{}),
-                                  });
+  auto* b = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::DiscardStatement>(),
+  });
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&b)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(b)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  {
     discard_fragment();
   }
@@ -41,12 +41,12 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_Block_WithoutNewline) {
-  ast::BlockStatement b(Source{}, ast::StatementList{
-                                      create<ast::DiscardStatement>(Source{}),
-                                  });
+  auto* b = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::DiscardStatement>(),
+  });
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitBlock(&b)) << gen.error();
+  ASSERT_TRUE(gen.EmitBlock(b)) << gen.error();
   EXPECT_EQ(gen.result(), R"({
     discard_fragment();
   })");
diff --git a/src/writer/msl/generator_impl_break_test.cc b/src/writer/msl/generator_impl_break_test.cc
index 1860910..b0a6410 100644
--- a/src/writer/msl/generator_impl_break_test.cc
+++ b/src/writer/msl/generator_impl_break_test.cc
@@ -29,11 +29,11 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_Break) {
-  ast::BreakStatement b(Source{});
+  auto* b = create<ast::BreakStatement>();
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&b)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(b)) << gen.error();
   EXPECT_EQ(gen.result(), "  break;\n");
 }
 
diff --git a/src/writer/msl/generator_impl_call_test.cc b/src/writer/msl/generator_impl_call_test.cc
index 2c96829..3b7c9ed 100644
--- a/src/writer/msl/generator_impl_call_test.cc
+++ b/src/writer/msl/generator_impl_call_test.cc
@@ -57,10 +57,10 @@
                     ast::StatementList{}, ast::FunctionDecorationList{});
   mod->AddFunction(func);
 
-  ast::CallStatement expr(Source{}, call);
+  auto* expr = create<ast::CallStatement>(call);
 
   gen.increment_indent();
-  ASSERT_TRUE(gen.EmitStatement(&expr)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "  my_func(param1, param2);\n");
 }
 
diff --git a/src/writer/msl/generator_impl_case_test.cc b/src/writer/msl/generator_impl_case_test.cc
index cf868c8..5ab3f25 100644
--- a/src/writer/msl/generator_impl_case_test.cc
+++ b/src/writer/msl/generator_impl_case_test.cc
@@ -35,17 +35,16 @@
 TEST_F(MslGeneratorImplTest, Emit_Case) {
   ast::type::I32 i32;
 
-  auto* body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{
-                    create<ast::BreakStatement>(Source{}),
-                });
+  auto* body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::BreakStatement>(),
+  });
   ast::CaseSelectorList lit;
-  lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
-  ast::CaseStatement c(Source{}, lit, body);
+  lit.push_back(create<ast::SintLiteral>(&i32, 5));
+  auto* c = create<ast::CaseStatement>(lit, body);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitCase(&c)) << gen.error();
+  ASSERT_TRUE(gen.EmitCase(c)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  case 5: {
     break;
   }
@@ -56,14 +55,13 @@
   ast::type::I32 i32;
 
   ast::CaseSelectorList lit;
-  lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
-  ast::CaseStatement c(
-      Source{}, lit,
-      create<ast::BlockStatement>(Source{}, ast::StatementList{}));
+  lit.push_back(create<ast::SintLiteral>(&i32, 5));
+  auto* c = create<ast::CaseStatement>(
+      lit, create<ast::BlockStatement>(ast::StatementList{}));
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitCase(&c)) << gen.error();
+  ASSERT_TRUE(gen.EmitCase(c)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  case 5: {
     break;
   }
@@ -73,17 +71,16 @@
 TEST_F(MslGeneratorImplTest, Emit_Case_WithFallthrough) {
   ast::type::I32 i32;
 
-  auto* body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{
-                    create<ast::FallthroughStatement>(Source{}),
-                });
+  auto* body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::FallthroughStatement>(),
+  });
   ast::CaseSelectorList lit;
-  lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
-  ast::CaseStatement c(Source{}, lit, body);
+  lit.push_back(create<ast::SintLiteral>(&i32, 5));
+  auto* c = create<ast::CaseStatement>(lit, body);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitCase(&c)) << gen.error();
+  ASSERT_TRUE(gen.EmitCase(c)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  case 5: {
     /* fallthrough */
   }
@@ -93,18 +90,17 @@
 TEST_F(MslGeneratorImplTest, Emit_Case_MultipleSelectors) {
   ast::type::I32 i32;
 
-  auto* body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{
-                    create<ast::BreakStatement>(Source{}),
-                });
+  auto* body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::BreakStatement>(),
+  });
   ast::CaseSelectorList lit;
-  lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
-  lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 6));
-  ast::CaseStatement c(Source{}, lit, body);
+  lit.push_back(create<ast::SintLiteral>(&i32, 5));
+  lit.push_back(create<ast::SintLiteral>(&i32, 6));
+  auto* c = create<ast::CaseStatement>(lit, body);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitCase(&c)) << gen.error();
+  ASSERT_TRUE(gen.EmitCase(c)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  case 5:
   case 6: {
     break;
@@ -113,15 +109,14 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_Case_Default) {
-  auto* body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{
-                    create<ast::BreakStatement>(Source{}),
-                });
-  ast::CaseStatement c(Source{}, ast::CaseSelectorList{}, body);
+  auto* body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::BreakStatement>(),
+  });
+  auto* c = create<ast::CaseStatement>(ast::CaseSelectorList{}, body);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitCase(&c)) << gen.error();
+  ASSERT_TRUE(gen.EmitCase(c)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  default: {
     break;
   }
diff --git a/src/writer/msl/generator_impl_cast_test.cc b/src/writer/msl/generator_impl_cast_test.cc
index 9280ed0..73ae2da 100644
--- a/src/writer/msl/generator_impl_cast_test.cc
+++ b/src/writer/msl/generator_impl_cast_test.cc
@@ -34,9 +34,9 @@
   ast::ExpressionList params;
   params.push_back(Expr("id"));
 
-  ast::TypeConstructorExpression cast(Source{}, ty.f32, params);
+  auto* cast = create<ast::TypeConstructorExpression>(ty.f32, params);
 
-  ASSERT_TRUE(gen.EmitExpression(&cast)) << gen.error();
+  ASSERT_TRUE(gen.EmitExpression(cast)) << gen.error();
   EXPECT_EQ(gen.result(), "float(id)");
 }
 
@@ -44,9 +44,9 @@
   ast::ExpressionList params;
   params.push_back(Expr("id"));
 
-  ast::TypeConstructorExpression cast(Source{}, ty.vec3<f32>(), params);
+  auto* cast = create<ast::TypeConstructorExpression>(ty.vec3<f32>(), params);
 
-  ASSERT_TRUE(gen.EmitExpression(&cast)) << gen.error();
+  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 34cebed..f1a1b1a 100644
--- a/src/writer/msl/generator_impl_constructor_test.cc
+++ b/src/writer/msl/generator_impl_constructor_test.cc
@@ -38,128 +38,113 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Bool) {
-  ast::type::Bool bool_type;
-  auto* lit = create<ast::BoolLiteral>(Source{}, &bool_type, false);
-  ast::ScalarConstructorExpression expr(Source{}, lit);
+  auto* lit = create<ast::BoolLiteral>(ty.bool_, false);
+  auto* expr = create<ast::ScalarConstructorExpression>(lit);
 
-  ASSERT_TRUE(gen.EmitConstructor(&expr)) << gen.error();
+  ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "false");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Int) {
-  ast::type::I32 i32;
-  auto* lit = create<ast::SintLiteral>(Source{}, &i32, -12345);
-  ast::ScalarConstructorExpression expr(Source{}, lit);
+  auto* lit = create<ast::SintLiteral>(ty.i32, -12345);
+  auto* expr = create<ast::ScalarConstructorExpression>(lit);
 
-  ASSERT_TRUE(gen.EmitConstructor(&expr)) << gen.error();
+  ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "-12345");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_UInt) {
-  ast::type::U32 u32;
-  auto* lit = create<ast::UintLiteral>(Source{}, &u32, 56779);
-  ast::ScalarConstructorExpression expr(Source{}, lit);
+  auto* lit = create<ast::UintLiteral>(ty.u32, 56779);
+  auto* expr = create<ast::ScalarConstructorExpression>(lit);
 
-  ASSERT_TRUE(gen.EmitConstructor(&expr)) << gen.error();
+  ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "56779u");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Float) {
-  ast::type::F32 f32;
   // Use a number close to 1<<30 but whose decimal representation ends in 0.
-  auto* lit = create<ast::FloatLiteral>(Source{}, &f32,
-                                        static_cast<float>((1 << 30) - 4));
-  ast::ScalarConstructorExpression expr(Source{}, lit);
+  auto* lit =
+      create<ast::FloatLiteral>(ty.f32, static_cast<float>((1 << 30) - 4));
+  auto* expr = create<ast::ScalarConstructorExpression>(lit);
 
-  ASSERT_TRUE(gen.EmitConstructor(&expr)) << gen.error();
+  ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "1073741824.0f");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Float) {
-  ast::type::F32 f32;
-
-  auto* lit = create<ast::FloatLiteral>(Source{}, &f32, -1.2e-5);
+  auto* lit = create<ast::FloatLiteral>(ty.f32, -1.2e-5);
   ast::ExpressionList values;
-  values.push_back(create<ast::ScalarConstructorExpression>(Source{}, lit));
+  values.push_back(create<ast::ScalarConstructorExpression>(lit));
 
-  ast::TypeConstructorExpression expr(Source{}, &f32, values);
+  auto* expr = create<ast::TypeConstructorExpression>(ty.f32, values);
 
-  ASSERT_TRUE(gen.EmitConstructor(&expr)) << gen.error();
+  ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "float(-0.000012f)");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Bool) {
-  ast::type::Bool b;
-
-  auto* lit = create<ast::BoolLiteral>(Source{}, &b, true);
+  auto* lit = create<ast::BoolLiteral>(ty.bool_, true);
   ast::ExpressionList values;
-  values.push_back(create<ast::ScalarConstructorExpression>(Source{}, lit));
+  values.push_back(create<ast::ScalarConstructorExpression>(lit));
 
-  ast::TypeConstructorExpression expr(Source{}, &b, values);
+  auto* expr = create<ast::TypeConstructorExpression>(ty.bool_, values);
 
-  ASSERT_TRUE(gen.EmitConstructor(&expr)) << gen.error();
+  ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "bool(true)");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Int) {
-  ast::type::I32 i32;
-
-  auto* lit = create<ast::SintLiteral>(Source{}, &i32, -12345);
+  auto* lit = create<ast::SintLiteral>(ty.i32, -12345);
   ast::ExpressionList values;
-  values.push_back(create<ast::ScalarConstructorExpression>(Source{}, lit));
+  values.push_back(create<ast::ScalarConstructorExpression>(lit));
 
-  ast::TypeConstructorExpression expr(Source{}, &i32, values);
+  auto* expr = create<ast::TypeConstructorExpression>(ty.i32, values);
 
-  ASSERT_TRUE(gen.EmitConstructor(&expr)) << gen.error();
+  ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "int(-12345)");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Uint) {
-  ast::type::U32 u32;
-
-  auto* lit = create<ast::UintLiteral>(Source{}, &u32, 12345);
+  auto* lit = create<ast::UintLiteral>(ty.u32, 12345);
   ast::ExpressionList values;
-  values.push_back(create<ast::ScalarConstructorExpression>(Source{}, lit));
+  values.push_back(create<ast::ScalarConstructorExpression>(lit));
 
-  ast::TypeConstructorExpression expr(Source{}, &u32, values);
+  auto* expr = create<ast::TypeConstructorExpression>(ty.u32, values);
 
-  ASSERT_TRUE(gen.EmitConstructor(&expr)) << gen.error();
+  ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "uint(12345u)");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Vec) {
-  ast::type::F32 f32;
-  ast::type::Vector vec(&f32, 3);
+  ast::type::Vector vec(ty.f32, 3);
 
-  auto* lit1 = create<ast::FloatLiteral>(Source{}, &f32, 1.f);
-  auto* lit2 = create<ast::FloatLiteral>(Source{}, &f32, 2.f);
-  auto* lit3 = create<ast::FloatLiteral>(Source{}, &f32, 3.f);
+  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>(Source{}, lit1));
-  values.push_back(create<ast::ScalarConstructorExpression>(Source{}, lit2));
-  values.push_back(create<ast::ScalarConstructorExpression>(Source{}, lit3));
+  values.push_back(create<ast::ScalarConstructorExpression>(lit1));
+  values.push_back(create<ast::ScalarConstructorExpression>(lit2));
+  values.push_back(create<ast::ScalarConstructorExpression>(lit3));
 
-  ast::TypeConstructorExpression expr(Source{}, &vec, values);
+  auto* expr = create<ast::TypeConstructorExpression>(&vec, values);
 
-  ASSERT_TRUE(gen.EmitConstructor(&expr)) << gen.error();
+  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::F32 f32;
-  ast::type::Vector vec(&f32, 3);
+  ast::type::Vector vec(ty.f32, 3);
 
   ast::ExpressionList values;
-  ast::TypeConstructorExpression expr(Source{}, &vec, values);
+  auto* expr = create<ast::TypeConstructorExpression>(&vec, values);
 
-  ASSERT_TRUE(gen.EmitConstructor(&expr)) << gen.error();
+  ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
   EXPECT_EQ(gen.result(), "float3(0.0f)");
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Mat) {
-  ast::type::F32 f32;
-  ast::type::Matrix mat(&f32, 3, 2);  // 3 ROWS, 2 COLUMNS
-  ast::type::Vector vec(&f32, 3);
+  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>
@@ -167,24 +152,23 @@
   ast::ExpressionList mat_values;
 
   for (size_t i = 0; i < 2; i++) {
-    auto* lit1 = create<ast::FloatLiteral>(Source{}, &f32,
-                                           static_cast<float>(1 + (i * 2)));
-    auto* lit2 = create<ast::FloatLiteral>(Source{}, &f32,
-                                           static_cast<float>(2 + (i * 2)));
-    auto* lit3 = create<ast::FloatLiteral>(Source{}, &f32,
-                                           static_cast<float>(3 + (i * 2)));
+    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>(Source{}, lit1));
-    values.push_back(create<ast::ScalarConstructorExpression>(Source{}, lit2));
-    values.push_back(create<ast::ScalarConstructorExpression>(Source{}, lit3));
+    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>(Source{}, &vec, values));
+    mat_values.push_back(create<ast::TypeConstructorExpression>(&vec, values));
   }
 
-  ast::TypeConstructorExpression expr(Source{}, &mat, mat_values);
-  ASSERT_TRUE(gen.EmitConstructor(&expr)) << gen.error();
+  auto* expr = create<ast::TypeConstructorExpression>(&mat, 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
   // n vectors of type T with m components.
@@ -193,31 +177,29 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Array) {
-  ast::type::F32 f32;
-  ast::type::Vector vec(&f32, 3);
+  ast::type::Vector vec(ty.f32, 3);
   ast::type::Array ary(&vec, 3, ast::ArrayDecorationList{});
 
   ast::ExpressionList ary_values;
 
   for (size_t i = 0; i < 3; i++) {
-    auto* lit1 = create<ast::FloatLiteral>(Source{}, &f32,
-                                           static_cast<float>(1 + (i * 3)));
-    auto* lit2 = create<ast::FloatLiteral>(Source{}, &f32,
-                                           static_cast<float>(2 + (i * 3)));
-    auto* lit3 = create<ast::FloatLiteral>(Source{}, &f32,
-                                           static_cast<float>(3 + (i * 3)));
+    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>(Source{}, lit1));
-    values.push_back(create<ast::ScalarConstructorExpression>(Source{}, lit2));
-    values.push_back(create<ast::ScalarConstructorExpression>(Source{}, lit3));
+    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>(Source{}, &vec, values));
+    ary_values.push_back(create<ast::TypeConstructorExpression>(&vec, values));
   }
 
-  ast::TypeConstructorExpression expr(Source{}, &ary, ary_values);
-  ASSERT_TRUE(gen.EmitConstructor(&expr)) << gen.error();
+  auto* expr = create<ast::TypeConstructorExpression>(&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), "
             "float3(7.0f, 8.0f, 9.0f)}");
diff --git a/src/writer/msl/generator_impl_continue_test.cc b/src/writer/msl/generator_impl_continue_test.cc
index 2edb073..12719b4 100644
--- a/src/writer/msl/generator_impl_continue_test.cc
+++ b/src/writer/msl/generator_impl_continue_test.cc
@@ -29,11 +29,11 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_Continue) {
-  ast::ContinueStatement c(Source{});
+  auto* c = create<ast::ContinueStatement>();
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&c)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(c)) << gen.error();
   EXPECT_EQ(gen.result(), "  continue;\n");
 }
 
diff --git a/src/writer/msl/generator_impl_discard_test.cc b/src/writer/msl/generator_impl_discard_test.cc
index 1aefa7d..0349acf 100644
--- a/src/writer/msl/generator_impl_discard_test.cc
+++ b/src/writer/msl/generator_impl_discard_test.cc
@@ -26,11 +26,11 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_Discard) {
-  ast::DiscardStatement stmt(Source{});
+  auto* stmt = create<ast::DiscardStatement>();
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&stmt)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
   EXPECT_EQ(gen.result(), "  discard_fragment();\n");
 }
 
diff --git a/src/writer/msl/generator_impl_function_entry_point_data_test.cc b/src/writer/msl/generator_impl_function_entry_point_data_test.cc
index 7828fdd..461035b 100644
--- a/src/writer/msl/generator_impl_function_entry_point_data_test.cc
+++ b/src/writer/msl/generator_impl_function_entry_point_data_test.cc
@@ -65,11 +65,11 @@
       create<ast::AssignmentStatement>(Expr("foo"), Expr("foo")),
       create<ast::AssignmentStatement>(Expr("bar"), Expr("bar")),
   };
-  auto* func = Func(
-      "vtx_main", ast::VariableList{}, ty.f32, body,
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
-      });
+  auto* func =
+      Func("vtx_main", ast::VariableList{}, ty.f32, body,
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kVertex),
+           });
 
   mod->AddFunction(func);
 
@@ -111,11 +111,11 @@
       create<ast::AssignmentStatement>(Expr("foo"), Expr("foo")),
       create<ast::AssignmentStatement>(Expr("bar"), Expr("bar")),
   };
-  auto* func = Func(
-      "vtx_main", ast::VariableList{}, ty.f32, body,
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
-      });
+  auto* func =
+      Func("vtx_main", ast::VariableList{}, ty.f32, body,
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kVertex),
+           });
 
   mod->AddFunction(func);
 
@@ -157,11 +157,11 @@
       create<ast::AssignmentStatement>(Expr("foo"), Expr("foo")),
       create<ast::AssignmentStatement>(Expr("bar"), Expr("bar")),
   };
-  auto* func = Func(
-      "main", ast::VariableList{}, ty.f32, body,
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
-      });
+  auto* func =
+      Func("main", ast::VariableList{}, ty.f32, body,
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kFragment),
+           });
 
   mod->AddFunction(func);
 
@@ -203,11 +203,11 @@
       create<ast::AssignmentStatement>(Expr("foo"), Expr("foo")),
       create<ast::AssignmentStatement>(Expr("bar"), Expr("bar")),
   };
-  auto* func = Func(
-      "main", ast::VariableList{}, ty.f32, body,
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
-      });
+  auto* func =
+      Func("main", ast::VariableList{}, ty.f32, body,
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kFragment),
+           });
 
   mod->AddFunction(func);
 
@@ -246,11 +246,11 @@
       create<ast::AssignmentStatement>(Expr("foo"), Expr("foo")),
       create<ast::AssignmentStatement>(Expr("bar"), Expr("bar")),
   };
-  auto* func = Func(
-      "main", ast::VariableList{}, ty.f32, body,
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
-      });
+  auto* func =
+      Func("main", ast::VariableList{}, ty.f32, body,
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kCompute),
+           });
 
   mod->AddFunction(func);
 
@@ -284,11 +284,11 @@
       create<ast::AssignmentStatement>(Expr("foo"), Expr("foo")),
       create<ast::AssignmentStatement>(Expr("bar"), Expr("bar")),
   };
-  auto* func = Func(
-      "main", ast::VariableList{}, ty.f32, body,
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
-      });
+  auto* func =
+      Func("main", ast::VariableList{}, ty.f32, body,
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kCompute),
+           });
 
   mod->AddFunction(func);
 
@@ -327,11 +327,11 @@
 
   auto body = ast::StatementList{create<ast::AssignmentStatement>(
       Expr("depth"), MemberAccessor("coord", "x"))};
-  auto* func = Func(
-      "main", ast::VariableList{}, ty.void_, body,
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
-      });
+  auto* func =
+      Func("main", ast::VariableList{}, ty.void_, body,
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kFragment),
+           });
 
   mod->AddFunction(func);
 
diff --git a/src/writer/msl/generator_impl_if_test.cc b/src/writer/msl/generator_impl_if_test.cc
index e764782..7a42ac0 100644
--- a/src/writer/msl/generator_impl_if_test.cc
+++ b/src/writer/msl/generator_impl_if_test.cc
@@ -33,11 +33,11 @@
   auto* body = create<ast::BlockStatement>(ast::StatementList{
       create<ast::ReturnStatement>(),
   });
-  ast::IfStatement i(Source{}, cond, body, ast::ElseStatementList{});
+  auto* i = create<ast::IfStatement>(cond, body, ast::ElseStatementList{});
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&i)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(i)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  if (cond) {
     return;
   }
@@ -54,12 +54,15 @@
   auto* body = create<ast::BlockStatement>(ast::StatementList{
       create<ast::ReturnStatement>(),
   });
-  ast::IfStatement i(Source{}, cond, body,
-                     {create<ast::ElseStatement>(else_cond, else_body)});
+  auto* i = create<ast::IfStatement>(
+      cond, body,
+      ast::ElseStatementList{
+          create<ast::ElseStatement>(else_cond, else_body),
+      });
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&i)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(i)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  if (cond) {
     return;
   } else if (else_cond) {
@@ -77,12 +80,15 @@
   auto* body = create<ast::BlockStatement>(ast::StatementList{
       create<ast::ReturnStatement>(),
   });
-  ast::IfStatement i(Source{}, cond, body,
-                     {create<ast::ElseStatement>(nullptr, else_body)});
+  auto* i = create<ast::IfStatement>(
+      cond, body,
+      ast::ElseStatementList{
+          create<ast::ElseStatement>(nullptr, else_body),
+      });
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&i)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(i)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  if (cond) {
     return;
   } else {
@@ -94,30 +100,28 @@
 TEST_F(MslGeneratorImplTest, Emit_IfWithMultiple) {
   auto* else_cond = Expr("else_cond");
 
-  auto* else_body =
-      create<ast::BlockStatement>(Source{}, ast::StatementList{
-                                                create<ast::ReturnStatement>(),
-                                            });
+  auto* else_body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::ReturnStatement>(),
+  });
 
-  auto* else_body_2 =
-      create<ast::BlockStatement>(Source{}, ast::StatementList{
-                                                create<ast::ReturnStatement>(),
-                                            });
+  auto* else_body_2 = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::ReturnStatement>(),
+  });
 
   auto* cond = Expr("cond");
-  auto* body =
-      create<ast::BlockStatement>(Source{}, ast::StatementList{
-                                                create<ast::ReturnStatement>(),
-                                            });
-  ast::IfStatement i(Source{}, cond, body,
-                     {
-                         create<ast::ElseStatement>(else_cond, else_body),
-                         create<ast::ElseStatement>(nullptr, else_body_2),
-                     });
+  auto* body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::ReturnStatement>(),
+  });
+  auto* i = create<ast::IfStatement>(
+      cond, body,
+      ast::ElseStatementList{
+          create<ast::ElseStatement>(else_cond, else_body),
+          create<ast::ElseStatement>(nullptr, else_body_2),
+      });
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&i)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(i)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  if (cond) {
     return;
   } else if (else_cond) {
diff --git a/src/writer/msl/generator_impl_loop_test.cc b/src/writer/msl/generator_impl_loop_test.cc
index 68e7fe2..76e8a3e 100644
--- a/src/writer/msl/generator_impl_loop_test.cc
+++ b/src/writer/msl/generator_impl_loop_test.cc
@@ -39,11 +39,11 @@
   auto* body = create<ast::BlockStatement>(ast::StatementList{
       create<ast::DiscardStatement>(),
   });
-  ast::LoopStatement l(Source{}, body, {});
+  auto* l = create<ast::LoopStatement>(body, nullptr);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&l)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(l)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  for(;;) {
     discard_fragment();
   }
@@ -57,11 +57,11 @@
   auto* continuing = create<ast::BlockStatement>(ast::StatementList{
       create<ast::ReturnStatement>(),
   });
-  ast::LoopStatement l(Source{}, body, continuing);
+  auto* l = create<ast::LoopStatement>(body, continuing);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&l)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(l)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  {
     bool tint_msl_is_first_1 = true;
     for(;;) {
@@ -93,11 +93,11 @@
       create<ast::AssignmentStatement>(Expr("lhs"), Expr("rhs")),
   });
 
-  ast::LoopStatement outer(Source{}, body, continuing);
+  auto* outer = create<ast::LoopStatement>(body, continuing);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&outer)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(outer)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  {
     bool tint_msl_is_first_1 = true;
     for(;;) {
@@ -157,9 +157,9 @@
   });
   gen.increment_indent();
 
-  ast::LoopStatement outer(Source{}, body, continuing);
+  auto* outer = create<ast::LoopStatement>(body, continuing);
 
-  ASSERT_TRUE(gen.EmitStatement(&outer)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(outer)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  {
     bool tint_msl_is_first_1 = true;
     float lhs;
diff --git a/src/writer/msl/generator_impl_module_constant_test.cc b/src/writer/msl/generator_impl_module_constant_test.cc
index 56d1fc1..87389fb 100644
--- a/src/writer/msl/generator_impl_module_constant_test.cc
+++ b/src/writer/msl/generator_impl_module_constant_test.cc
@@ -36,11 +36,11 @@
 
 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>(
-          Source{}, &ary, ast::ExpressionList{Expr(1.f), Expr(2.f), Expr(3.f)}),
-      ast::VariableDecorationList{});
+  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{});
 
   ASSERT_TRUE(gen.EmitProgramConstVariable(var)) << gen.error();
   EXPECT_EQ(gen.result(), "constant float pos[3] = {1.0f, 2.0f, 3.0f};\n");
@@ -49,7 +49,7 @@
 TEST_F(MslGeneratorImplTest, Emit_SpecConstant) {
   auto* var = Const("pos", ast::StorageClass::kNone, ty.f32, Expr(3.f),
                     ast::VariableDecorationList{
-                        create<ast::ConstantIdDecoration>(Source{}, 23),
+                        create<ast::ConstantIdDecoration>(23),
                     });
 
   ASSERT_TRUE(gen.EmitProgramConstVariable(var)) << gen.error();
diff --git a/src/writer/msl/generator_impl_return_test.cc b/src/writer/msl/generator_impl_return_test.cc
index 8d1f7ad..e017d6a 100644
--- a/src/writer/msl/generator_impl_return_test.cc
+++ b/src/writer/msl/generator_impl_return_test.cc
@@ -30,18 +30,18 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_Return) {
-  ast::ReturnStatement r(Source{});
+  auto* r = create<ast::ReturnStatement>();
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&r)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(r)) << gen.error();
   EXPECT_EQ(gen.result(), "  return;\n");
 }
 
 TEST_F(MslGeneratorImplTest, Emit_ReturnWithValue) {
-  ast::ReturnStatement r(Source{}, Expr("expr"));
+  auto* r = create<ast::ReturnStatement>(Expr("expr"));
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&r)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(r)) << gen.error();
   EXPECT_EQ(gen.result(), "  return expr;\n");
 }
 
diff --git a/src/writer/msl/generator_impl_switch_test.cc b/src/writer/msl/generator_impl_switch_test.cc
index 60b28b6..c67822a 100644
--- a/src/writer/msl/generator_impl_switch_test.cc
+++ b/src/writer/msl/generator_impl_switch_test.cc
@@ -51,10 +51,10 @@
   body.push_back(case_stmt);
   body.push_back(def);
 
-  ast::SwitchStatement s(Source{}, Expr("cond"), body);
+  auto* s = create<ast::SwitchStatement>(Expr("cond"), body);
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&s)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(s)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  switch(cond) {
     case 5: {
       break;
diff --git a/src/writer/msl/generator_impl_unary_op_test.cc b/src/writer/msl/generator_impl_unary_op_test.cc
index 991a156..c93bee2 100644
--- a/src/writer/msl/generator_impl_unary_op_test.cc
+++ b/src/writer/msl/generator_impl_unary_op_test.cc
@@ -38,8 +38,8 @@
 using MslUnaryOpTest = TestParamHelper<UnaryOpData>;
 TEST_P(MslUnaryOpTest, Emit) {
   auto params = GetParam();
-  ast::UnaryOpExpression op(Source{}, params.op, Expr("expr"));
-  ASSERT_TRUE(gen.EmitExpression(&op)) << gen.error();
+  auto* op = create<ast::UnaryOpExpression>(params.op, Expr("expr"));
+  ASSERT_TRUE(gen.EmitExpression(op)) << gen.error();
   EXPECT_EQ(gen.result(), std::string(params.name) + "(expr)");
 }
 INSTANTIATE_TEST_SUITE_P(MslGeneratorImplTest,
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 ad0d1de..0a89380 100644
--- a/src/writer/msl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/msl/generator_impl_variable_decl_statement_test.cc
@@ -42,21 +42,21 @@
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement) {
   auto* var = Var("a", ast::StorageClass::kNone, ty.f32);
-  ast::VariableDeclStatement stmt(Source{}, var);
+  auto* stmt = create<ast::VariableDeclStatement>(var);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&stmt)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
   EXPECT_EQ(gen.result(), "  float a = 0.0f;\n");
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Const) {
   auto* var = Const("a", ast::StorageClass::kNone, ty.f32);
-  ast::VariableDeclStatement stmt(Source{}, var);
+  auto* stmt = create<ast::VariableDeclStatement>(var);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&stmt)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
   EXPECT_EQ(gen.result(), "  const float a = 0.0f;\n");
 }
 
@@ -64,11 +64,11 @@
   ast::type::Array ary(ty.f32, 5, ast::ArrayDecorationList{});
 
   auto* var = Var("a", ast::StorageClass::kNone, &ary);
-  ast::VariableDeclStatement stmt(Source{}, var);
+  auto* stmt = create<ast::VariableDeclStatement>(var);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&stmt)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
   EXPECT_EQ(gen.result(), "  float a[5] = {0.0f};\n");
 }
 
@@ -80,52 +80,52 @@
 
   auto* s = ty.struct_("S", str);
   auto* var = Var("a", ast::StorageClass::kNone, s);
-  ast::VariableDeclStatement stmt(Source{}, var);
+  auto* stmt = create<ast::VariableDeclStatement>(var);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&stmt)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  S a = {};
 )");
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Vector) {
   auto* var = Var("a", ast::StorageClass::kFunction, ty.vec2<f32>());
-  ast::VariableDeclStatement stmt(Source{}, var);
+  auto* stmt = create<ast::VariableDeclStatement>(var);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&stmt)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
   EXPECT_EQ(gen.result(), "  float2 a = 0.0f;\n");
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Matrix) {
   auto* var = Var("a", ast::StorageClass::kFunction, ty.mat3x2<f32>());
 
-  ast::VariableDeclStatement stmt(Source{}, var);
+  auto* stmt = create<ast::VariableDeclStatement>(var);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&stmt)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
   EXPECT_EQ(gen.result(), "  float3x2 a = 0.0f;\n");
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Private) {
   auto* var = Var("a", ast::StorageClass::kPrivate, ty.f32);
-  ast::VariableDeclStatement stmt(Source{}, var);
+  auto* stmt = create<ast::VariableDeclStatement>(var);
 
   gen.increment_indent();
 
-  ASSERT_TRUE(gen.EmitStatement(&stmt)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
   EXPECT_EQ(gen.result(), "  float a = 0.0f;\n");
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Initializer_Private) {
   auto* var = Var("a", ast::StorageClass::kNone, ty.f32, Expr("initializer"),
                   ast::VariableDecorationList{});
-  ast::VariableDeclStatement stmt(Source{}, var);
+  auto* stmt = create<ast::VariableDeclStatement>(var);
 
-  ASSERT_TRUE(gen.EmitStatement(&stmt)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
   EXPECT_EQ(gen.result(), R"(float a = initializer;
 )");
 }
@@ -133,13 +133,13 @@
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Initializer_ZeroVec) {
   ast::ExpressionList values;
   auto* zero_vec =
-      create<ast::TypeConstructorExpression>(Source{}, ty.vec3<f32>(), values);
+      create<ast::TypeConstructorExpression>(ty.vec3<f32>(), values);
 
   auto* var = Var("a", ast::StorageClass::kNone, ty.vec3<f32>(), zero_vec,
                   ast::VariableDecorationList{});
-  ast::VariableDeclStatement stmt(Source{}, var);
+  auto* stmt = create<ast::VariableDeclStatement>(var);
 
-  ASSERT_TRUE(gen.EmitStatement(&stmt)) << gen.error();
+  ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
   EXPECT_EQ(gen.result(), R"(float3 a = float3(0.0f);
 )");
 }
diff --git a/src/writer/spirv/builder_assign_test.cc b/src/writer/spirv/builder_assign_test.cc
index 70bb77e..97b744a 100644
--- a/src/writer/spirv/builder_assign_test.cc
+++ b/src/writer/spirv/builder_assign_test.cc
@@ -44,16 +44,16 @@
 TEST_F(BuilderTest, Assign_Var) {
   auto* v = Var("var", ast::StorageClass::kOutput, ty.f32);
 
-  ast::AssignmentStatement assign(Source{}, Expr("var"), Expr(1.f));
+  auto* assign = create<ast::AssignmentStatement>(Expr("var"), Expr(1.f));
   td.RegisterVariableForTesting(v);
 
-  ASSERT_TRUE(td.DetermineResultType(&assign)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(assign)) << td.error();
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_TRUE(b.GenerateAssignStatement(&assign)) << b.error();
+  EXPECT_TRUE(b.GenerateAssignStatement(assign)) << b.error();
   EXPECT_FALSE(b.has_error());
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
@@ -70,15 +70,15 @@
 TEST_F(BuilderTest, Assign_Var_OutsideFunction_IsError) {
   auto* v = Var("var", ast::StorageClass::kOutput, ty.f32);
 
-  ast::AssignmentStatement assign(Source{}, Expr("var"), Expr(1.f));
+  auto* assign = create<ast::AssignmentStatement>(Expr("var"), Expr(1.f));
   td.RegisterVariableForTesting(v);
 
-  ASSERT_TRUE(td.DetermineResultType(&assign)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(assign)) << td.error();
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_FALSE(b.GenerateAssignStatement(&assign)) << b.error();
+  EXPECT_FALSE(b.GenerateAssignStatement(assign)) << b.error();
   EXPECT_TRUE(b.has_error());
   EXPECT_EQ(
       b.error(),
@@ -88,19 +88,19 @@
 TEST_F(BuilderTest, Assign_Var_ZeroConstructor) {
   auto* v = Var("var", ast::StorageClass::kOutput, ty.vec3<f32>());
 
-  auto* val = create<ast::TypeConstructorExpression>(Source{}, ty.vec3<f32>(),
+  auto* val = create<ast::TypeConstructorExpression>(ty.vec3<f32>(),
                                                      ast::ExpressionList{});
-  ast::AssignmentStatement assign(Source{}, Expr("var"), val);
+  auto* assign = create<ast::AssignmentStatement>(Expr("var"), val);
 
   td.RegisterVariableForTesting(v);
 
-  ASSERT_TRUE(td.DetermineResultType(&assign)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(assign)) << td.error();
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_TRUE(b.GenerateAssignStatement(&assign)) << b.error();
+  EXPECT_TRUE(b.GenerateAssignStatement(assign)) << b.error();
   EXPECT_FALSE(b.has_error());
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeFloat 32
@@ -116,22 +116,22 @@
 
 TEST_F(BuilderTest, Assign_Var_Complex_ConstructorWithExtract) {
   auto* first = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec2<f32>(), ast::ExpressionList{Expr(1.f), Expr(2.f)});
+      ty.vec2<f32>(), ast::ExpressionList{Expr(1.f), Expr(2.f)});
 
   auto* init = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(), ast::ExpressionList{first, Expr(3.f)});
+      ty.vec3<f32>(), ast::ExpressionList{first, Expr(3.f)});
 
   auto* v = Var("var", ast::StorageClass::kOutput, ty.vec3<f32>());
-  ast::AssignmentStatement assign(Source{}, Expr("var"), init);
+  auto* assign = create<ast::AssignmentStatement>(Expr("var"), init);
 
   td.RegisterVariableForTesting(v);
-  ASSERT_TRUE(td.DetermineResultType(&assign)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(assign)) << td.error();
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_TRUE(b.GenerateAssignStatement(&assign)) << b.error();
+  EXPECT_TRUE(b.GenerateAssignStatement(assign)) << b.error();
   EXPECT_FALSE(b.has_error());
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeFloat 32
@@ -155,20 +155,19 @@
 
 TEST_F(BuilderTest, Assign_Var_Complex_Constructor) {
   auto* init = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(),
-      ast::ExpressionList{Expr(1.f), Expr(2.f), Expr(3.f)});
+      ty.vec3<f32>(), ast::ExpressionList{Expr(1.f), Expr(2.f), Expr(3.f)});
 
   auto* v = Var("var", ast::StorageClass::kOutput, ty.vec3<f32>());
-  ast::AssignmentStatement assign(Source{}, Expr("var"), init);
+  auto* assign = create<ast::AssignmentStatement>(Expr("var"), init);
 
   td.RegisterVariableForTesting(v);
-  ASSERT_TRUE(td.DetermineResultType(&assign)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(assign)) << td.error();
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_TRUE(b.GenerateAssignStatement(&assign)) << b.error();
+  EXPECT_TRUE(b.GenerateAssignStatement(assign)) << b.error();
   EXPECT_FALSE(b.has_error());
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeFloat 32
@@ -200,17 +199,17 @@
   auto* s_type = ty.struct_("my_struct", s);
   auto* v = Var("ident", ast::StorageClass::kFunction, s_type);
 
-  ast::AssignmentStatement assign(Source{}, MemberAccessor("ident", "b"),
-                                  Expr(4.f));
+  auto* assign =
+      create<ast::AssignmentStatement>(MemberAccessor("ident", "b"), Expr(4.f));
   td.RegisterVariableForTesting(v);
 
-  ASSERT_TRUE(td.DetermineResultType(&assign)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(assign)) << td.error();
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_TRUE(b.GenerateAssignStatement(&assign)) << b.error();
+  EXPECT_TRUE(b.GenerateAssignStatement(assign)) << b.error();
   EXPECT_FALSE(b.has_error());
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeFloat 32
@@ -233,19 +232,18 @@
   auto* v = Var("var", ast::StorageClass::kOutput, ty.vec3<f32>());
 
   auto* val = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(),
-      ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
+      ty.vec3<f32>(), ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
 
-  ast::AssignmentStatement assign(Source{}, Expr("var"), val);
+  auto* assign = create<ast::AssignmentStatement>(Expr("var"), val);
   td.RegisterVariableForTesting(v);
 
-  ASSERT_TRUE(td.DetermineResultType(&assign)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(assign)) << td.error();
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_TRUE(b.GenerateAssignStatement(&assign)) << b.error();
+  EXPECT_TRUE(b.GenerateAssignStatement(assign)) << b.error();
   EXPECT_FALSE(b.has_error());
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeFloat 32
@@ -267,17 +265,17 @@
 
   auto* v = Var("var", ast::StorageClass::kOutput, ty.vec3<f32>());
 
-  ast::AssignmentStatement assign(Source{}, MemberAccessor("var", "y"),
-                                  Expr(1.f));
+  auto* assign =
+      create<ast::AssignmentStatement>(MemberAccessor("var", "y"), Expr(1.f));
   td.RegisterVariableForTesting(v);
 
-  ASSERT_TRUE(td.DetermineResultType(&assign)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(assign)) << td.error();
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_TRUE(b.GenerateAssignStatement(&assign)) << b.error();
+  EXPECT_TRUE(b.GenerateAssignStatement(assign)) << b.error();
   EXPECT_FALSE(b.has_error());
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeFloat 32
@@ -302,16 +300,17 @@
 
   auto* v = Var("var", ast::StorageClass::kOutput, ty.vec3<f32>());
 
-  ast::AssignmentStatement assign(Source{}, IndexAccessor("var", 1), Expr(1.f));
+  auto* assign =
+      create<ast::AssignmentStatement>(IndexAccessor("var", 1), Expr(1.f));
   td.RegisterVariableForTesting(v);
 
-  ASSERT_TRUE(td.DetermineResultType(&assign)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(assign)) << td.error();
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_TRUE(b.GenerateAssignStatement(&assign)) << b.error();
+  EXPECT_TRUE(b.GenerateAssignStatement(assign)) << b.error();
   EXPECT_FALSE(b.has_error());
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeFloat 32
diff --git a/src/writer/spirv/builder_binary_expression_test.cc b/src/writer/spirv/builder_binary_expression_test.cc
index a6467a6..425b04c 100644
--- a/src/writer/spirv/builder_binary_expression_test.cc
+++ b/src/writer/spirv/builder_binary_expression_test.cc
@@ -54,20 +54,16 @@
 TEST_P(BinaryArithSignedIntegerTest, Scalar) {
   auto param = GetParam();
 
-  ast::type::I32 i32;
+  auto* lhs = Expr(3);
+  auto* rhs = Expr(4);
 
-  auto* lhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::SintLiteral>(Source{}, &i32, 3));
-  auto* rhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::SintLiteral>(Source{}, &i32, 4));
+  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
-  ast::BinaryExpression expr(Source{}, param.op, lhs, rhs);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 4u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 4u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 1
 %2 = OpConstant %1 3
 %3 = OpConstant %1 4
@@ -78,38 +74,16 @@
 TEST_P(BinaryArithSignedIntegerTest, Vector) {
   auto param = GetParam();
 
-  ast::type::I32 i32;
-  ast::type::Vector vec3(&i32, 3);
+  auto* lhs = vec3<i32>(1, 1, 1);
+  auto* rhs = vec3<i32>(1, 1, 1);
 
-  auto* lhs = create<ast::TypeConstructorExpression>(
-      Source{}, &vec3,
-      ast::ExpressionList{
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-      });
+  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
-  auto* rhs = create<ast::TypeConstructorExpression>(
-      Source{}, &vec3,
-      ast::ExpressionList{
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-      });
-
-  ast::BinaryExpression expr(Source{}, param.op, lhs, rhs);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 5u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 1
 %1 = OpTypeVector %2 3
 %3 = OpConstant %2 1
@@ -122,14 +96,15 @@
   auto param = GetParam();
 
   auto* var = Var("param", ast::StorageClass::kFunction, ty.i32);
-  ast::BinaryExpression expr(Source{}, param.op, Expr("param"), Expr("param"));
+  auto* expr =
+      create<ast::BinaryExpression>(param.op, Expr("param"), Expr("param"));
 
   td.RegisterVariableForTesting(var);
-  EXPECT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  EXPECT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateFunctionVariable(var)) << b.error();
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 7u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 7u) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeInt 32 1
@@ -168,17 +143,17 @@
   ast::type::U32 u32;
 
   auto* lhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::UintLiteral>(Source{}, &u32, 3));
+      create<ast::UintLiteral>(&u32, 3));
   auto* rhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::UintLiteral>(Source{}, &u32, 4));
+      create<ast::UintLiteral>(&u32, 4));
 
-  ast::BinaryExpression expr(Source{}, param.op, lhs, rhs);
+  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 4u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 4u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 0
 %2 = OpConstant %1 3
 %3 = OpConstant %1 4
@@ -189,38 +164,16 @@
 TEST_P(BinaryArithUnsignedIntegerTest, Vector) {
   auto param = GetParam();
 
-  ast::type::U32 u32;
-  ast::type::Vector vec3(&u32, 3);
+  auto* lhs = vec3<u32>(1u, 1u, 1u);
+  auto* rhs = vec3<u32>(1u, 1u, 1u);
 
-  auto* lhs = create<ast::TypeConstructorExpression>(
-      Source{}, &vec3,
-      ast::ExpressionList{
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::UintLiteral>(Source{}, &u32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::UintLiteral>(Source{}, &u32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::UintLiteral>(Source{}, &u32, 1)),
-      });
+  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
-  auto* rhs = create<ast::TypeConstructorExpression>(
-      Source{}, &vec3,
-      ast::ExpressionList{
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::UintLiteral>(Source{}, &u32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::UintLiteral>(Source{}, &u32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::UintLiteral>(Source{}, &u32, 1)),
-      });
-
-  ast::BinaryExpression expr(Source{}, param.op, lhs, rhs);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 5u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 0
 %1 = OpTypeVector %2 3
 %3 = OpConstant %2 1
@@ -251,16 +204,16 @@
   ast::type::F32 f32;
 
   auto* lhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::FloatLiteral>(Source{}, &f32, 3.2f));
+      create<ast::FloatLiteral>(&f32, 3.2f));
   auto* rhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::FloatLiteral>(Source{}, &f32, 4.5f));
+      create<ast::FloatLiteral>(&f32, 4.5f));
 
-  ast::BinaryExpression expr(Source{}, param.op, lhs, rhs);
+  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 4u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 4u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeFloat 32
 %2 = OpConstant %1 3.20000005
 %3 = OpConstant %1 4.5
@@ -272,38 +225,16 @@
 TEST_P(BinaryArithFloatTest, Vector) {
   auto param = GetParam();
 
-  ast::type::F32 f32;
-  ast::type::Vector vec3(&f32, 3);
+  auto* lhs = vec3<f32>(1.f, 1.f, 1.f);
+  auto* rhs = vec3<f32>(1.f, 1.f, 1.f);
 
-  auto* lhs = create<ast::TypeConstructorExpression>(
-      Source{}, &vec3,
-      ast::ExpressionList{
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-      });
+  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
-  auto* rhs = create<ast::TypeConstructorExpression>(
-      Source{}, &vec3,
-      ast::ExpressionList{
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-      });
-
-  ast::BinaryExpression expr(Source{}, param.op, lhs, rhs);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 5u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeVector %2 3
 %3 = OpConstant %2 1
@@ -328,17 +259,17 @@
   ast::type::U32 u32;
 
   auto* lhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::UintLiteral>(Source{}, &u32, 3));
+      create<ast::UintLiteral>(&u32, 3));
   auto* rhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::UintLiteral>(Source{}, &u32, 4));
+      create<ast::UintLiteral>(&u32, 4));
 
-  ast::BinaryExpression expr(Source{}, param.op, lhs, rhs);
+  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 4u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 4u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 0
 %2 = OpConstant %1 3
 %3 = OpConstant %1 4
@@ -351,38 +282,16 @@
 TEST_P(BinaryCompareUnsignedIntegerTest, Vector) {
   auto param = GetParam();
 
-  ast::type::U32 u32;
-  ast::type::Vector vec3(&u32, 3);
+  auto* lhs = vec3<u32>(1u, 1u, 1u);
+  auto* rhs = vec3<u32>(1u, 1u, 1u);
 
-  auto* lhs = create<ast::TypeConstructorExpression>(
-      Source{}, &vec3,
-      ast::ExpressionList{
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::UintLiteral>(Source{}, &u32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::UintLiteral>(Source{}, &u32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::UintLiteral>(Source{}, &u32, 1)),
-      });
+  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
-  auto* rhs = create<ast::TypeConstructorExpression>(
-      Source{}, &vec3,
-      ast::ExpressionList{
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::UintLiteral>(Source{}, &u32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::UintLiteral>(Source{}, &u32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::UintLiteral>(Source{}, &u32, 1)),
-      });
-
-  ast::BinaryExpression expr(Source{}, param.op, lhs, rhs);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 5u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 0
 %1 = OpTypeVector %2 3
 %3 = OpConstant %2 1
@@ -408,20 +317,16 @@
 TEST_P(BinaryCompareSignedIntegerTest, Scalar) {
   auto param = GetParam();
 
-  ast::type::I32 i32;
+  auto* lhs = Expr(3);
+  auto* rhs = Expr(4);
 
-  auto* lhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::SintLiteral>(Source{}, &i32, 3));
-  auto* rhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::SintLiteral>(Source{}, &i32, 4));
+  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
-  ast::BinaryExpression expr(Source{}, param.op, lhs, rhs);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 4u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 4u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 1
 %2 = OpConstant %1 3
 %3 = OpConstant %1 4
@@ -434,38 +339,16 @@
 TEST_P(BinaryCompareSignedIntegerTest, Vector) {
   auto param = GetParam();
 
-  ast::type::I32 i32;
-  ast::type::Vector vec3(&i32, 3);
+  auto* lhs = vec3<i32>(1, 1, 1);
+  auto* rhs = vec3<i32>(1, 1, 1);
 
-  auto* lhs = create<ast::TypeConstructorExpression>(
-      Source{}, &vec3,
-      ast::ExpressionList{
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-      });
+  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
-  auto* rhs = create<ast::TypeConstructorExpression>(
-      Source{}, &vec3,
-      ast::ExpressionList{
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-      });
-
-  ast::BinaryExpression expr(Source{}, param.op, lhs, rhs);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 5u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 1
 %1 = OpTypeVector %2 3
 %3 = OpConstant %2 1
@@ -491,20 +374,16 @@
 TEST_P(BinaryCompareFloatTest, Scalar) {
   auto param = GetParam();
 
-  ast::type::F32 f32;
+  auto* lhs = Expr(3.2f);
+  auto* rhs = Expr(4.5f);
 
-  auto* lhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::FloatLiteral>(Source{}, &f32, 3.2f));
-  auto* rhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::FloatLiteral>(Source{}, &f32, 4.5f));
+  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
-  ast::BinaryExpression expr(Source{}, param.op, lhs, rhs);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 4u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 4u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeFloat 32
 %2 = OpConstant %1 3.20000005
 %3 = OpConstant %1 4.5
@@ -517,38 +396,16 @@
 TEST_P(BinaryCompareFloatTest, Vector) {
   auto param = GetParam();
 
-  ast::type::F32 f32;
-  ast::type::Vector vec3(&f32, 3);
+  auto* lhs = vec3<f32>(1.f, 1.f, 1.f);
+  auto* rhs = vec3<f32>(1.f, 1.f, 1.f);
 
-  auto* lhs = create<ast::TypeConstructorExpression>(
-      Source{}, &vec3,
-      ast::ExpressionList{
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-      });
+  auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
-  auto* rhs = create<ast::TypeConstructorExpression>(
-      Source{}, &vec3,
-      ast::ExpressionList{
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-      });
-
-  ast::BinaryExpression expr(Source{}, param.op, lhs, rhs);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 5u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeVector %2 3
 %3 = OpConstant %2 1
@@ -571,30 +428,17 @@
         BinaryData{ast::BinaryOp::kNotEqual, "OpFOrdNotEqual"}));
 
 TEST_F(BuilderTest, Binary_Multiply_VectorScalar) {
-  ast::type::F32 f32;
-  ast::type::Vector vec3(&f32, 3);
+  auto* lhs = vec3<f32>(1.f, 1.f, 1.f);
+  auto* rhs = Expr(1.f);
 
-  auto* lhs = create<ast::TypeConstructorExpression>(
-      Source{}, &vec3,
-      ast::ExpressionList{
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-          create<ast::ScalarConstructorExpression>(
-              Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)),
-      });
+  auto* expr =
+      create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
 
-  auto* rhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f));
-
-  ast::BinaryExpression expr(Source{}, ast::BinaryOp::kMultiply, lhs, rhs);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 5u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeVector %2 3
 %3 = OpConstant %2 1
@@ -605,28 +449,17 @@
 }
 
 TEST_F(BuilderTest, Binary_Multiply_ScalarVector) {
-  ast::type::F32 f32;
-  ast::type::Vector vec3(&f32, 3);
+  auto* lhs = Expr(1.f);
+  auto* rhs = vec3<f32>(1.f, 1.f, 1.f);
 
-  auto* lhs = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f));
+  auto* expr =
+      create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
 
-  ast::ExpressionList vals;
-  vals.push_back(create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)));
-  vals.push_back(create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)));
-  vals.push_back(create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)));
-  auto* rhs = create<ast::TypeConstructorExpression>(Source{}, &vec3, vals);
-
-  ast::BinaryExpression expr(Source{}, ast::BinaryOp::kMultiply, lhs, rhs);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 5u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeFloat 32
 %2 = OpConstant %1 1
 %3 = OpTypeVector %1 3
@@ -640,14 +473,14 @@
   auto* var = Var("mat", ast::StorageClass::kFunction, ty.mat3x3<f32>());
   td.RegisterVariableForTesting(var);
 
-  ast::BinaryExpression expr(Source{}, ast::BinaryOp::kMultiply, Expr("mat"),
-                             Expr(1.f));
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply,
+                                             Expr("mat"), Expr(1.f));
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 8u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 8u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%5 = OpTypeFloat 32
 %4 = OpTypeVector %5 3
 %3 = OpTypeMatrix %4 3
@@ -665,15 +498,15 @@
   auto* var = Var("mat", ast::StorageClass::kFunction, ty.mat3x3<f32>());
   td.RegisterVariableForTesting(var);
 
-  ast::BinaryExpression expr(Source{}, ast::BinaryOp::kMultiply, Expr(1.f),
-                             Expr("mat"));
+  auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply,
+                                             Expr(1.f), Expr("mat"));
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 8u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 8u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%5 = OpTypeFloat 32
 %4 = OpTypeVector %5 3
 %3 = OpTypeMatrix %4 3
@@ -690,20 +523,19 @@
 TEST_F(BuilderTest, Binary_Multiply_MatrixVector) {
   auto* var = Var("mat", ast::StorageClass::kFunction, ty.mat3x3<f32>());
   auto* rhs = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(),
-      ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(1.f)});
+      ty.vec3<f32>(), ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(1.f)});
 
   td.RegisterVariableForTesting(var);
 
-  ast::BinaryExpression expr(Source{}, ast::BinaryOp::kMultiply, Expr("mat"),
-                             rhs);
+  auto* expr =
+      create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, Expr("mat"), rhs);
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 9u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 9u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%5 = OpTypeFloat 32
 %4 = OpTypeVector %5 3
 %3 = OpTypeMatrix %4 3
@@ -721,20 +553,19 @@
 TEST_F(BuilderTest, Binary_Multiply_VectorMatrix) {
   auto* var = Var("mat", ast::StorageClass::kFunction, ty.mat3x3<f32>());
   auto* lhs = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(),
-      ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(1.f)});
+      ty.vec3<f32>(), ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(1.f)});
 
   td.RegisterVariableForTesting(var);
 
-  ast::BinaryExpression expr(Source{}, ast::BinaryOp::kMultiply, lhs,
-                             Expr("mat"));
+  auto* expr =
+      create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, Expr("mat"));
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 9u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 9u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%5 = OpTypeFloat 32
 %4 = OpTypeVector %5 3
 %3 = OpTypeMatrix %4 3
@@ -753,15 +584,15 @@
   auto* var = Var("mat", ast::StorageClass::kFunction, ty.mat3x3<f32>());
   td.RegisterVariableForTesting(var);
 
-  ast::BinaryExpression expr(Source{}, ast::BinaryOp::kMultiply, Expr("mat"),
-                             Expr("mat"));
+  auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply,
+                                             Expr("mat"), Expr("mat"));
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 8u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 8u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%5 = OpTypeFloat 32
 %4 = OpTypeVector %5 3
 %3 = OpTypeMatrix %4 3
@@ -776,30 +607,21 @@
 }
 
 TEST_F(BuilderTest, Binary_LogicalAnd) {
-  ast::type::I32 i32;
+  auto* lhs =
+      create<ast::BinaryExpression>(ast::BinaryOp::kEqual, Expr(1), Expr(2));
 
-  auto* lhs = create<ast::BinaryExpression>(
-      Source{}, ast::BinaryOp::kEqual,
-      create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-      create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::SintLiteral>(Source{}, &i32, 2)));
+  auto* rhs =
+      create<ast::BinaryExpression>(ast::BinaryOp::kEqual, Expr(3), Expr(4));
 
-  auto* rhs = create<ast::BinaryExpression>(
-      Source{}, ast::BinaryOp::kEqual,
-      create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::SintLiteral>(Source{}, &i32, 3)),
-      create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::SintLiteral>(Source{}, &i32, 4)));
+  auto* expr =
+      create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, lhs, rhs);
 
-  ast::BinaryExpression expr(Source{}, ast::BinaryOp::kLogicalAnd, lhs, rhs);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   b.GenerateLabel(b.next_id());
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 12u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 12u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 1
 %3 = OpConstant %2 1
 %4 = OpConstant %2 2
@@ -831,10 +653,10 @@
   td.RegisterVariableForTesting(a_var);
   td.RegisterVariableForTesting(b_var);
 
-  ast::BinaryExpression expr(Source{}, ast::BinaryOp::kLogicalAnd, Expr("a"),
-                             Expr("b"));
+  auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd,
+                                             Expr("a"), Expr("b"));
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   b.GenerateLabel(b.next_id());
@@ -842,7 +664,7 @@
   ASSERT_TRUE(b.GenerateGlobalVariable(a_var)) << b.error();
   ASSERT_TRUE(b.GenerateGlobalVariable(b_var)) << b.error();
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 12u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 12u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
 %3 = OpConstantTrue %2
 %5 = OpTypePointer Function %2
@@ -871,24 +693,24 @@
   // From: crbug.com/tint/355
 
   auto* logical_and_expr = create<ast::BinaryExpression>(
-      Source{}, ast::BinaryOp::kLogicalAnd,
+      ast::BinaryOp::kLogicalAnd,
       create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::BoolLiteral>(Source{}, &bool_ty, true)),
+          create<ast::BoolLiteral>(&bool_ty, true)),
       create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::BoolLiteral>(Source{}, &bool_ty, false)));
+          create<ast::BoolLiteral>(&bool_ty, false)));
 
-  ast::BinaryExpression expr(
-      Source{}, ast::BinaryOp::kLogicalOr,
+  auto* expr = create<ast::BinaryExpression>(
+      ast::BinaryOp::kLogicalOr,
       create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::BoolLiteral>(Source{}, &bool_ty, true)),
+          create<ast::BoolLiteral>(&bool_ty, true)),
       logical_and_expr);
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   b.GenerateLabel(b.next_id());
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 10u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 10u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
 %3 = OpConstantTrue %2
 %8 = OpConstantFalse %2
@@ -918,24 +740,24 @@
   // From: crbug.com/tint/355
 
   auto* logical_or_expr = create<ast::BinaryExpression>(
-      Source{}, ast::BinaryOp::kLogicalOr,
+      ast::BinaryOp::kLogicalOr,
       create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::BoolLiteral>(Source{}, &bool_ty, true)),
+          create<ast::BoolLiteral>(&bool_ty, true)),
       create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::BoolLiteral>(Source{}, &bool_ty, false)));
+          create<ast::BoolLiteral>(&bool_ty, false)));
 
-  ast::BinaryExpression expr(
-      Source{}, ast::BinaryOp::kLogicalAnd,
+  auto* expr = create<ast::BinaryExpression>(
+      ast::BinaryOp::kLogicalAnd,
       create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::BoolLiteral>(Source{}, &bool_ty, true)),
+          create<ast::BoolLiteral>(&bool_ty, true)),
       logical_or_expr);
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   b.GenerateLabel(b.next_id());
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 10u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 10u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
 %3 = OpConstantTrue %2
 %8 = OpConstantFalse %2
@@ -958,30 +780,21 @@
 }
 
 TEST_F(BuilderTest, Binary_LogicalOr) {
-  ast::type::I32 i32;
+  auto* lhs =
+      create<ast::BinaryExpression>(ast::BinaryOp::kEqual, Expr(1), Expr(2));
 
-  auto* lhs = create<ast::BinaryExpression>(
-      Source{}, ast::BinaryOp::kEqual,
-      create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::SintLiteral>(Source{}, &i32, 1)),
-      create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::SintLiteral>(Source{}, &i32, 2)));
+  auto* rhs =
+      create<ast::BinaryExpression>(ast::BinaryOp::kEqual, Expr(3), Expr(4));
 
-  auto* rhs = create<ast::BinaryExpression>(
-      Source{}, ast::BinaryOp::kEqual,
-      create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::SintLiteral>(Source{}, &i32, 3)),
-      create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::SintLiteral>(Source{}, &i32, 4)));
+  auto* expr =
+      create<ast::BinaryExpression>(ast::BinaryOp::kLogicalOr, lhs, rhs);
 
-  ast::BinaryExpression expr(Source{}, ast::BinaryOp::kLogicalOr, lhs, rhs);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   b.GenerateLabel(b.next_id());
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 12u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 12u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 1
 %3 = OpConstant %2 1
 %4 = OpConstant %2 2
@@ -1013,10 +826,10 @@
   td.RegisterVariableForTesting(a_var);
   td.RegisterVariableForTesting(b_var);
 
-  ast::BinaryExpression expr(Source{}, ast::BinaryOp::kLogicalOr, Expr("a"),
-                             Expr("b"));
+  auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kLogicalOr,
+                                             Expr("a"), Expr("b"));
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   b.GenerateLabel(b.next_id());
@@ -1024,7 +837,7 @@
   ASSERT_TRUE(b.GenerateGlobalVariable(a_var)) << b.error();
   ASSERT_TRUE(b.GenerateGlobalVariable(b_var)) << b.error();
 
-  EXPECT_EQ(b.GenerateBinaryExpression(&expr), 12u) << b.error();
+  EXPECT_EQ(b.GenerateBinaryExpression(expr), 12u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
 %3 = OpConstantTrue %2
 %5 = OpTypePointer Function %2
diff --git a/src/writer/spirv/builder_bitcast_expression_test.cc b/src/writer/spirv/builder_bitcast_expression_test.cc
index cb75092..ee068dc 100644
--- a/src/writer/spirv/builder_bitcast_expression_test.cc
+++ b/src/writer/spirv/builder_bitcast_expression_test.cc
@@ -32,18 +32,12 @@
 using BuilderTest = TestHelper;
 
 TEST_F(BuilderTest, Bitcast) {
-  ast::type::U32 u32;
-  ast::type::F32 f32;
+  auto* bitcast = create<ast::BitcastExpression>(ty.u32, Expr(2.4f));
 
-  ast::BitcastExpression bitcast(
-      Source{}, &u32,
-      create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.4)));
-
-  ASSERT_TRUE(td.DetermineResultType(&bitcast)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(bitcast)) << td.error();
 
   b.push_function(Function{});
-  EXPECT_EQ(b.GenerateBitcastExpression(&bitcast), 1u);
+  EXPECT_EQ(b.GenerateBitcastExpression(bitcast), 1u);
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 0
 %3 = OpTypeFloat 32
@@ -57,15 +51,12 @@
 TEST_F(BuilderTest, Bitcast_DuplicateType) {
   ast::type::F32 f32;
 
-  ast::BitcastExpression bitcast(
-      Source{}, &f32,
-      create<ast::ScalarConstructorExpression>(
-          Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.4)));
+  auto* bitcast = create<ast::BitcastExpression>(ty.f32, Expr(2.4f));
 
-  ASSERT_TRUE(td.DetermineResultType(&bitcast)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(bitcast)) << td.error();
 
   b.push_function(Function{});
-  EXPECT_EQ(b.GenerateBitcastExpression(&bitcast), 1u);
+  EXPECT_EQ(b.GenerateBitcastExpression(bitcast), 1u);
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %3 = OpConstant %2 2.4000001
diff --git a/src/writer/spirv/builder_block_test.cc b/src/writer/spirv/builder_block_test.cc
index e3dc0a1..fe77612 100644
--- a/src/writer/spirv/builder_block_test.cc
+++ b/src/writer/spirv/builder_block_test.cc
@@ -39,27 +39,22 @@
 
   // Note, this test uses shadow variables which aren't allowed in WGSL but
   // serves to prove the block code is pushing new scopes as needed.
-  auto* inner = create<ast::BlockStatement>(
-      Source{},
-      ast::StatementList{
-          create<ast::VariableDeclStatement>(
-              Source{}, Var("var", ast::StorageClass::kFunction, ty.f32)),
-          create<ast::AssignmentStatement>(Source{}, Expr("var"), Expr(2.f))});
-  ast::BlockStatement outer(
-      Source{},
-      ast::StatementList{
-          create<ast::VariableDeclStatement>(
-              Source{}, Var("var", ast::StorageClass::kFunction, ty.f32)),
-          create<ast::AssignmentStatement>(Source{}, Expr("var"), Expr(1.f)),
-          inner,
-          create<ast::AssignmentStatement>(Source{}, Expr("var"), Expr(3.f))});
+  auto* inner = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::VariableDeclStatement>(
+          Var("var", ast::StorageClass::kFunction, ty.f32)),
+      create<ast::AssignmentStatement>(Expr("var"), Expr(2.f))});
+  auto* outer = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::VariableDeclStatement>(
+          Var("var", ast::StorageClass::kFunction, ty.f32)),
+      create<ast::AssignmentStatement>(Expr("var"), Expr(1.f)), inner,
+      create<ast::AssignmentStatement>(Expr("var"), Expr(3.f))});
 
-  ASSERT_TRUE(td.DetermineResultType(&outer)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(outer)) << td.error();
 
   b.push_function(Function{});
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_TRUE(b.GenerateStatement(&outer)) << b.error();
+  EXPECT_TRUE(b.GenerateStatement(outer)) << b.error();
   EXPECT_FALSE(b.has_error());
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
diff --git a/src/writer/spirv/builder_call_test.cc b/src/writer/spirv/builder_call_test.cc
index 23de1ae..4788081 100644
--- a/src/writer/spirv/builder_call_test.cc
+++ b/src/writer/spirv/builder_call_test.cc
@@ -47,10 +47,10 @@
   func_params.push_back(Var("a", ast::StorageClass::kFunction, ty.f32));
   func_params.push_back(Var("b", ast::StorageClass::kFunction, ty.f32));
 
-  auto* a_func = Func(
-      "a_func", func_params, ty.f32,
-      ast::StatementList{create<ast::ReturnStatement>(Source{}, Add("a", "b"))},
-      ast::FunctionDecorationList{});
+  auto* a_func =
+      Func("a_func", func_params, ty.f32,
+           ast::StatementList{create<ast::ReturnStatement>(Add("a", "b"))},
+           ast::FunctionDecorationList{});
 
   auto* func = Func("main", {}, ty.void_, ast::StatementList{},
                     ast::FunctionDecorationList{});
@@ -95,24 +95,24 @@
   func_params.push_back(Var("a", ast::StorageClass::kFunction, ty.f32));
   func_params.push_back(Var("b", ast::StorageClass::kFunction, ty.f32));
 
-  auto* a_func = Func(
-      "a_func", func_params, ty.void_,
-      ast::StatementList{create<ast::ReturnStatement>(Source{}, Add("a", "b"))},
-      ast::FunctionDecorationList{});
+  auto* a_func =
+      Func("a_func", func_params, ty.void_,
+           ast::StatementList{create<ast::ReturnStatement>(Add("a", "b"))},
+           ast::FunctionDecorationList{});
 
   auto* func = Func("main", {}, ty.void_, ast::StatementList{},
                     ast::FunctionDecorationList{});
 
-  ast::CallStatement expr(Source{}, Call("a_func", 1.f, 1.f));
+  auto* expr = create<ast::CallStatement>(Call("a_func", 1.f, 1.f));
 
   ASSERT_TRUE(td.DetermineFunction(func)) << td.error();
   ASSERT_TRUE(td.DetermineFunction(a_func)) << td.error();
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   ASSERT_TRUE(b.GenerateFunction(a_func)) << b.error();
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
 
-  EXPECT_TRUE(b.GenerateStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateStatement(expr)) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(OpName %4 "a_func"
 OpName %5 "a"
 OpName %6 "b"
diff --git a/src/writer/spirv/builder_constructor_expression_test.cc b/src/writer/spirv/builder_constructor_expression_test.cc
index b544ea4..02c8c75 100644
--- a/src/writer/spirv/builder_constructor_expression_test.cc
+++ b/src/writer/spirv/builder_constructor_expression_test.cc
@@ -115,12 +115,12 @@
   // cast<Int>(2.3f)
 
   auto* alias = ty.alias("Int", ty.i32);
-  ast::TypeConstructorExpression cast(Source{}, alias, ExprList(2.3f));
+  auto* cast = create<ast::TypeConstructorExpression>(alias, ExprList(2.3f));
 
-  ASSERT_TRUE(td.DetermineResultType(&cast)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(cast)) << td.error();
 
   b.push_function(Function{});
-  EXPECT_EQ(b.GenerateExpression(&cast), 1u);
+  EXPECT_EQ(b.GenerateExpression(cast), 1u);
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 1
 %3 = OpTypeFloat 32
@@ -184,8 +184,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_NonConst_Value_Fails) {
-  auto* rel = create<ast::BinaryExpression>(Source{}, ast::BinaryOp::kAdd,
-                                            Expr(3.0f), Expr(3.0f));
+  auto* rel = create<ast::BinaryExpression>(ast::BinaryOp::kAdd, Expr(3.0f),
+                                            Expr(3.0f));
 
   auto* t = vec2<f32>(1.0f, rel);
 
@@ -197,13 +197,13 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Bool_With_Bool) {
-  ast::TypeConstructorExpression cast(Source{}, ty.bool_, ExprList(true));
+  auto* cast = create<ast::TypeConstructorExpression>(ty.bool_, ExprList(true));
 
-  ASSERT_TRUE(td.DetermineResultType(&cast)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(cast)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_EQ(b.GenerateExpression(&cast), 3u);
+  EXPECT_EQ(b.GenerateExpression(cast), 3u);
   ASSERT_FALSE(b.has_error()) << b.error();
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
@@ -213,12 +213,12 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_I32_With_I32) {
-  ast::TypeConstructorExpression cast(Source{}, ty.i32, ExprList(2));
+  auto* cast = create<ast::TypeConstructorExpression>(ty.i32, ExprList(2));
 
-  ASSERT_TRUE(td.DetermineResultType(&cast)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(cast)) << td.error();
 
   b.push_function(Function{});
-  EXPECT_EQ(b.GenerateExpression(&cast), 3u);
+  EXPECT_EQ(b.GenerateExpression(cast), 3u);
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 1
 %3 = OpConstant %2 2
@@ -227,12 +227,12 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_U32_With_U32) {
-  ast::TypeConstructorExpression cast(Source{}, ty.u32, ExprList(2u));
+  auto* cast = create<ast::TypeConstructorExpression>(ty.u32, ExprList(2u));
 
-  ASSERT_TRUE(td.DetermineResultType(&cast)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(cast)) << td.error();
 
   b.push_function(Function{});
-  EXPECT_EQ(b.GenerateExpression(&cast), 3u);
+  EXPECT_EQ(b.GenerateExpression(cast), 3u);
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 0
 %3 = OpConstant %2 2
@@ -241,12 +241,12 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_F32_With_F32) {
-  ast::TypeConstructorExpression cast(Source{}, ty.f32, ExprList(2.0f));
+  auto* cast = create<ast::TypeConstructorExpression>(ty.f32, ExprList(2.0f));
 
-  ASSERT_TRUE(td.DetermineResultType(&cast)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(cast)) << td.error();
 
   b.push_function(Function{});
-  EXPECT_EQ(b.GenerateExpression(&cast), 3u);
+  EXPECT_EQ(b.GenerateExpression(cast), 3u);
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %3 = OpConstant %2 2
diff --git a/src/writer/spirv/builder_discard_test.cc b/src/writer/spirv/builder_discard_test.cc
index 6b3796a..6031a4c 100644
--- a/src/writer/spirv/builder_discard_test.cc
+++ b/src/writer/spirv/builder_discard_test.cc
@@ -27,10 +27,10 @@
 using BuilderTest = TestHelper;
 
 TEST_F(BuilderTest, Discard) {
-  ast::DiscardStatement expr(Source{});
+  auto* expr = create<ast::DiscardStatement>();
 
   b.push_function(Function{});
-  EXPECT_EQ(b.GenerateStatement(&expr), 1u) << b.error();
+  EXPECT_EQ(b.GenerateStatement(expr), 1u) << b.error();
   EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()), R"(OpKill
 )");
 }
diff --git a/src/writer/spirv/builder_function_decoration_test.cc b/src/writer/spirv/builder_function_decoration_test.cc
index 00b64a5..d3b50fa 100644
--- a/src/writer/spirv/builder_function_decoration_test.cc
+++ b/src/writer/spirv/builder_function_decoration_test.cc
@@ -39,11 +39,11 @@
 using BuilderTest = TestHelper;
 
 TEST_F(BuilderTest, FunctionDecoration_Stage) {
-  auto* func = Func(
-      "main", {}, ty.void_, ast::StatementList{},
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
-      });
+  auto* func =
+      Func("main", {}, ty.void_, ast::StatementList{},
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kVertex),
+           });
 
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
   EXPECT_EQ(DumpInstructions(b.entry_points()),
@@ -65,7 +65,7 @@
 
   auto* func = Func("main", {}, ty.void_, ast::StatementList{},
                     ast::FunctionDecorationList{
-                        create<ast::StageDecoration>(Source{}, params.stage),
+                        create<ast::StageDecoration>(params.stage),
                     });
 
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
@@ -91,11 +91,11 @@
   ast::type::F32 f32;
   ast::type::Void void_type;
 
-  auto* func = Func(
-      "main", {}, ty.void_, ast::StatementList{},
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
-      });
+  auto* func =
+      Func("main", {}, ty.void_, ast::StatementList{},
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kVertex),
+           });
 
   auto* v_in = Var("my_in", ast::StorageClass::kInput, ty.f32);
   auto* v_out = Var("my_out", ast::StorageClass::kOutput, ty.f32);
@@ -132,19 +132,17 @@
 }
 
 TEST_F(BuilderTest, FunctionDecoration_Stage_WithUsedInterfaceIds) {
-  auto* func = Func(
-      "main", {}, ty.void_,
-      ast::StatementList{create<ast::AssignmentStatement>(
-                             Source{}, Expr("my_out"), Expr("my_in")),
-                         create<ast::AssignmentStatement>(
-                             Source{}, Expr("my_wg"), Expr("my_wg")),
-                         // Add duplicate usages so we show they don't get
-                         // output multiple times.
-                         create<ast::AssignmentStatement>(
-                             Source{}, Expr("my_out"), Expr("my_in"))},
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
-      });
+  auto* func =
+      Func("main", {}, ty.void_,
+           ast::StatementList{
+               create<ast::AssignmentStatement>(Expr("my_out"), Expr("my_in")),
+               create<ast::AssignmentStatement>(Expr("my_wg"), Expr("my_wg")),
+               // Add duplicate usages so we show they don't get
+               // output multiple times.
+               create<ast::AssignmentStatement>(Expr("my_out"), Expr("my_in"))},
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kVertex),
+           });
 
   auto* v_in = Var("my_in", ast::StorageClass::kInput, ty.f32);
   auto* v_out = Var("my_out", ast::StorageClass::kOutput, ty.f32);
@@ -187,11 +185,11 @@
 }
 
 TEST_F(BuilderTest, FunctionDecoration_ExecutionMode_Fragment_OriginUpperLeft) {
-  auto* func = Func(
-      "main", {}, ty.void_, ast::StatementList{},
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
-      });
+  auto* func =
+      Func("main", {}, ty.void_, ast::StatementList{},
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kFragment),
+           });
 
   ASSERT_TRUE(b.GenerateExecutionModes(func, 3)) << b.error();
   EXPECT_EQ(DumpInstructions(b.execution_modes()),
@@ -200,11 +198,11 @@
 }
 
 TEST_F(BuilderTest, FunctionDecoration_ExecutionMode_WorkgroupSize_Default) {
-  auto* func = Func(
-      "main", {}, ty.void_, ast::StatementList{},
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
-      });
+  auto* func =
+      Func("main", {}, ty.void_, ast::StatementList{},
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kCompute),
+           });
 
   ASSERT_TRUE(b.GenerateExecutionModes(func, 3)) << b.error();
   EXPECT_EQ(DumpInstructions(b.execution_modes()),
@@ -213,12 +211,12 @@
 }
 
 TEST_F(BuilderTest, FunctionDecoration_ExecutionMode_WorkgroupSize) {
-  auto* func = Func(
-      "main", {}, ty.void_, ast::StatementList{},
-      ast::FunctionDecorationList{
-          create<ast::WorkgroupDecoration>(Source{}, 2u, 4u, 6u),
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
-      });
+  auto* func =
+      Func("main", {}, ty.void_, ast::StatementList{},
+           ast::FunctionDecorationList{
+               create<ast::WorkgroupDecoration>(2u, 4u, 6u),
+               create<ast::StageDecoration>(ast::PipelineStage::kCompute),
+           });
 
   ASSERT_TRUE(b.GenerateExecutionModes(func, 3)) << b.error();
   EXPECT_EQ(DumpInstructions(b.execution_modes()),
@@ -227,17 +225,17 @@
 }
 
 TEST_F(BuilderTest, FunctionDecoration_ExecutionMode_MultipleFragment) {
-  auto* func1 = Func(
-      "main1", {}, ty.void_, ast::StatementList{},
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
-      });
+  auto* func1 =
+      Func("main1", {}, ty.void_, ast::StatementList{},
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kFragment),
+           });
 
-  auto* func2 = Func(
-      "main2", {}, ty.void_, ast::StatementList{},
-      ast::FunctionDecorationList{
-          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
-      });
+  auto* func2 =
+      Func("main2", {}, ty.void_, ast::StatementList{},
+           ast::FunctionDecorationList{
+               create<ast::StageDecoration>(ast::PipelineStage::kFragment),
+           });
 
   ASSERT_TRUE(b.GenerateFunction(func1)) << b.error();
   ASSERT_TRUE(b.GenerateFunction(func2)) << b.error();
diff --git a/src/writer/spirv/builder_function_test.cc b/src/writer/spirv/builder_function_test.cc
index 797dcac..a50017b 100644
--- a/src/writer/spirv/builder_function_test.cc
+++ b/src/writer/spirv/builder_function_test.cc
@@ -63,7 +63,7 @@
 TEST_F(BuilderTest, Function_Terminator_Return) {
   auto* func = Func("a_func", {}, ty.void_,
                     ast::StatementList{
-                        create<ast::ReturnStatement>(Source{}),
+                        create<ast::ReturnStatement>(),
                     },
                     ast::FunctionDecorationList{});
 
@@ -108,7 +108,7 @@
 TEST_F(BuilderTest, Function_Terminator_Discard) {
   auto* func = Func("a_func", {}, ty.void_,
                     ast::StatementList{
-                        create<ast::DiscardStatement>(Source{}),
+                        create<ast::DiscardStatement>(),
                     },
                     ast::FunctionDecorationList{});
 
@@ -155,7 +155,7 @@
 TEST_F(BuilderTest, Function_WithBody) {
   auto* func = Func("a_func", {}, ty.void_,
                     ast::StatementList{
-                        create<ast::ReturnStatement>(Source{}),
+                        create<ast::ReturnStatement>(),
                     },
                     ast::FunctionDecorationList{});
 
@@ -211,7 +211,7 @@
   // }
 
   ast::StructDecorationList s_decos;
-  s_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
+  s_decos.push_back(create<ast::StructBlockDecoration>());
 
   auto* str = create<ast::Struct>(
       ast::StructMemberList{Member("d", ty.f32, {MemberOffset(0)})}, s_decos);
@@ -221,8 +221,8 @@
 
   auto* data_var = Var("data", ast::StorageClass::kStorageBuffer, &ac, nullptr,
                        ast::VariableDecorationList{
-                           create<ast::BindingDecoration>(Source{}, 0),
-                           create<ast::SetDecoration>(Source{}, 0),
+                           create<ast::BindingDecoration>(0),
+                           create<ast::SetDecoration>(0),
                        });
 
   mod->AddConstructedType(s);
@@ -234,15 +234,15 @@
     auto* var = Var("v", ast::StorageClass::kFunction, ty.f32,
                     MemberAccessor("data", "d"), ast::VariableDecorationList{});
 
-    auto* func = Func("a", ast::VariableList{}, ty.void_,
-                      ast::StatementList{
-                          create<ast::VariableDeclStatement>(Source{}, var),
-                          create<ast::ReturnStatement>(Source{}),
-                      },
-                      ast::FunctionDecorationList{
-                          create<ast::StageDecoration>(
-                              Source{}, ast::PipelineStage::kCompute),
-                      });
+    auto* func =
+        Func("a", ast::VariableList{}, ty.void_,
+             ast::StatementList{
+                 create<ast::VariableDeclStatement>(var),
+                 create<ast::ReturnStatement>(),
+             },
+             ast::FunctionDecorationList{
+                 create<ast::StageDecoration>(ast::PipelineStage::kCompute),
+             });
 
     mod->AddFunction(func);
   }
@@ -251,15 +251,15 @@
     auto* var = Var("v", ast::StorageClass::kFunction, ty.f32,
                     MemberAccessor("data", "d"), ast::VariableDecorationList{});
 
-    auto* func = Func("b", ast::VariableList{}, ty.void_,
-                      ast::StatementList{
-                          create<ast::VariableDeclStatement>(Source{}, var),
-                          create<ast::ReturnStatement>(Source{}),
-                      },
-                      ast::FunctionDecorationList{
-                          create<ast::StageDecoration>(
-                              Source{}, ast::PipelineStage::kCompute),
-                      });
+    auto* func =
+        Func("b", ast::VariableList{}, ty.void_,
+             ast::StatementList{
+                 create<ast::VariableDeclStatement>(var),
+                 create<ast::ReturnStatement>(),
+             },
+             ast::FunctionDecorationList{
+                 create<ast::StageDecoration>(ast::PipelineStage::kCompute),
+             });
 
     mod->AddFunction(func);
   }
diff --git a/src/writer/spirv/builder_function_variable_test.cc b/src/writer/spirv/builder_function_variable_test.cc
index 1fa6cae..ee02aea 100644
--- a/src/writer/spirv/builder_function_variable_test.cc
+++ b/src/writer/spirv/builder_function_variable_test.cc
@@ -64,8 +64,7 @@
 
 TEST_F(BuilderTest, FunctionVar_WithConstantConstructor) {
   auto* init = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(),
-      ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
+      ty.vec3<f32>(), ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
   auto* v = Var("var", ast::StorageClass::kOutput, ty.f32, init,
@@ -95,7 +94,7 @@
 
 TEST_F(BuilderTest, FunctionVar_WithNonConstantConstructor) {
   auto* init = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec2<f32>(), ast::ExpressionList{Expr(1.f), Add(3.f, 3.f)});
+      ty.vec2<f32>(), ast::ExpressionList{Expr(1.f), Add(3.f, 3.f)});
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
   auto* v = Var("var", ast::StorageClass::kFunction, ty.vec2<f32>(), init,
@@ -205,8 +204,7 @@
 
 TEST_F(BuilderTest, FunctionVar_Const) {
   auto* init = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(),
-      ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
+      ty.vec3<f32>(), ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
   auto* v = Const("var", ast::StorageClass::kOutput, ty.f32, init,
diff --git a/src/writer/spirv/builder_global_variable_test.cc b/src/writer/spirv/builder_global_variable_test.cc
index 8675194..2543a3a 100644
--- a/src/writer/spirv/builder_global_variable_test.cc
+++ b/src/writer/spirv/builder_global_variable_test.cc
@@ -86,8 +86,7 @@
 
 TEST_F(BuilderTest, GlobalVar_WithConstructor) {
   auto* init = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(),
-      ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
+      ty.vec3<f32>(), ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
   auto* v = Var("var", ast::StorageClass::kOutput, ty.f32, init,
@@ -111,8 +110,7 @@
 
 TEST_F(BuilderTest, GlobalVar_Const) {
   auto* init = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(),
-      ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
+      ty.vec3<f32>(), ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
   auto* v = Const("var", ast::StorageClass::kOutput, ty.f32, init,
@@ -134,8 +132,7 @@
 
 TEST_F(BuilderTest, GlobalVar_Complex_Constructor) {
   auto* init = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(),
-      ast::ExpressionList{Expr(1.f), Expr(2.f), Expr(3.f)});
+      ty.vec3<f32>(), ast::ExpressionList{Expr(1.f), Expr(2.f), Expr(3.f)});
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
   auto* v = Const("var", ast::StorageClass::kOutput, ty.f32, init,
@@ -156,10 +153,10 @@
 
 TEST_F(BuilderTest, GlobalVar_Complex_ConstructorWithExtract) {
   auto* first = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec2<f32>(), ast::ExpressionList{Expr(1.f), Expr(2.f)});
+      ty.vec2<f32>(), ast::ExpressionList{Expr(1.f), Expr(2.f)});
 
   auto* init = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(), ast::ExpressionList{first, Expr(3.f)});
+      ty.vec3<f32>(), ast::ExpressionList{first, Expr(3.f)});
 
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
@@ -189,7 +186,7 @@
 TEST_F(BuilderTest, GlobalVar_WithLocation) {
   auto* v = Var("var", ast::StorageClass::kOutput, ty.f32, nullptr,
                 ast::VariableDecorationList{
-                    create<ast::LocationDecoration>(Source{}, 5),
+                    create<ast::LocationDecoration>(5),
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -207,8 +204,8 @@
 TEST_F(BuilderTest, GlobalVar_WithBindingAndSet) {
   auto* v = Var("var", ast::StorageClass::kOutput, ty.f32, nullptr,
                 ast::VariableDecorationList{
-                    create<ast::BindingDecoration>(Source{}, 2),
-                    create<ast::SetDecoration>(Source{}, 3),
+                    create<ast::BindingDecoration>(2),
+                    create<ast::SetDecoration>(3),
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -225,11 +222,10 @@
 }
 
 TEST_F(BuilderTest, GlobalVar_WithBuiltin) {
-  auto* v =
-      Var("var", ast::StorageClass::kOutput, ty.f32, nullptr,
-          ast::VariableDecorationList{
-              create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kPosition),
-          });
+  auto* v = Var("var", ast::StorageClass::kOutput, ty.f32, nullptr,
+                ast::VariableDecorationList{
+                    create<ast::BuiltinDecoration>(ast::Builtin::kPosition),
+                });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
   EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
@@ -246,7 +242,7 @@
 TEST_F(BuilderTest, GlobalVar_ConstantId_Bool) {
   auto* v = Var("var", ast::StorageClass::kNone, ty.bool_, Expr(true),
                 ast::VariableDecorationList{
-                    create<ast::ConstantIdDecoration>(Source{}, 1200),
+                    create<ast::ConstantIdDecoration>(1200),
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -264,7 +260,7 @@
 TEST_F(BuilderTest, GlobalVar_ConstantId_Bool_NoConstructor) {
   auto* v = Var("var", ast::StorageClass::kNone, ty.bool_, nullptr,
                 ast::VariableDecorationList{
-                    create<ast::ConstantIdDecoration>(Source{}, 1200),
+                    create<ast::ConstantIdDecoration>(1200),
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -282,7 +278,7 @@
 TEST_F(BuilderTest, GlobalVar_ConstantId_Scalar) {
   auto* v = Var("var", ast::StorageClass::kNone, ty.f32, Expr(2.f),
                 ast::VariableDecorationList{
-                    create<ast::ConstantIdDecoration>(Source{}, 0),
+                    create<ast::ConstantIdDecoration>(0),
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -300,7 +296,7 @@
 TEST_F(BuilderTest, GlobalVar_ConstantId_Scalar_F32_NoConstructor) {
   auto* v = Var("var", ast::StorageClass::kNone, ty.f32, nullptr,
                 ast::VariableDecorationList{
-                    create<ast::ConstantIdDecoration>(Source{}, 0),
+                    create<ast::ConstantIdDecoration>(0),
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -318,7 +314,7 @@
 TEST_F(BuilderTest, GlobalVar_ConstantId_Scalar_I32_NoConstructor) {
   auto* v = Var("var", ast::StorageClass::kNone, ty.i32, nullptr,
                 ast::VariableDecorationList{
-                    create<ast::ConstantIdDecoration>(Source{}, 0),
+                    create<ast::ConstantIdDecoration>(0),
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -336,7 +332,7 @@
 TEST_F(BuilderTest, GlobalVar_ConstantId_Scalar_U32_NoConstructor) {
   auto* v = Var("var", ast::StorageClass::kNone, ty.u32, nullptr,
                 ast::VariableDecorationList{
-                    create<ast::ConstantIdDecoration>(Source{}, 0),
+                    create<ast::ConstantIdDecoration>(0),
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
diff --git a/src/writer/spirv/builder_ident_expression_test.cc b/src/writer/spirv/builder_ident_expression_test.cc
index a5f6dbf..c06fb70 100644
--- a/src/writer/spirv/builder_ident_expression_test.cc
+++ b/src/writer/spirv/builder_ident_expression_test.cc
@@ -39,8 +39,7 @@
 
 TEST_F(BuilderTest, IdentifierExpression_GlobalConst) {
   auto* init = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(),
-      ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
+      ty.vec3<f32>(), ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
   auto* v = Const("var", ast::StorageClass::kOutput, ty.f32, init,
@@ -83,8 +82,7 @@
 
 TEST_F(BuilderTest, IdentifierExpression_FunctionConst) {
   auto* init = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(),
-      ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
+      ty.vec3<f32>(), ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
   auto* v = Const("var", ast::StorageClass::kOutput, ty.f32, init,
diff --git a/src/writer/spirv/builder_if_test.cc b/src/writer/spirv/builder_if_test.cc
index a759428..966c082 100644
--- a/src/writer/spirv/builder_if_test.cc
+++ b/src/writer/spirv/builder_if_test.cc
@@ -46,18 +46,17 @@
   // if (true) {
   // }
   auto* cond = create<ast::ScalarConstructorExpression>(
-      Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, true));
+      create<ast::BoolLiteral>(&bool_type, true));
 
-  ast::IfStatement expr(
-      Source{}, cond,
-      create<ast::BlockStatement>(Source{}, ast::StatementList{}),
+  auto* expr = create<ast::IfStatement>(
+      cond, create<ast::BlockStatement>(ast::StatementList{}),
       ast::ElseStatementList{});
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateIfStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateIfStatement(expr)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeBool
 %2 = OpConstantTrue %1
 )");
@@ -80,12 +79,12 @@
       create<ast::BoolLiteral>(&bool_type, true));
 
   ast::ElseStatementList elses;
-  auto* block = create<ast::BlockStatement>(Source{}, ast::StatementList{});
-  ast::IfStatement expr(Source{}, cond, block, elses);
+  auto* block = create<ast::BlockStatement>(ast::StatementList{});
+  auto* expr = create<ast::IfStatement>(cond, block, elses);
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
-  EXPECT_FALSE(b.GenerateIfStatement(&expr)) << b.error();
+  EXPECT_FALSE(b.GenerateIfStatement(expr)) << b.error();
   EXPECT_TRUE(b.has_error());
   EXPECT_EQ(b.error(),
             "Internal error: trying to add SPIR-V instruction 247 outside a "
@@ -99,17 +98,17 @@
 
   auto* var = Var("v", ast::StorageClass::kPrivate, ty.i32);
   auto* body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(2))});
-  ast::IfStatement expr(Source{}, Expr(true), body, ast::ElseStatementList{});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(2))});
+  auto* expr =
+      create<ast::IfStatement>(Expr(true), body, ast::ElseStatementList{});
 
   td.RegisterVariableForTesting(var);
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_TRUE(b.GenerateIfStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateIfStatement(expr)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -137,24 +136,22 @@
 
   auto* var = Var("v", ast::StorageClass::kPrivate, ty.i32);
   auto* body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(2))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(2))});
   auto* else_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(3))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(3))});
 
-  ast::IfStatement expr(
-      Source{}, Expr(true), body,
-      {create<ast::ElseStatement>(Source{}, nullptr, else_body)});
+  auto* expr = create<ast::IfStatement>(
+      Expr(true), body,
+      ast::ElseStatementList{create<ast::ElseStatement>(nullptr, else_body)});
 
   td.RegisterVariableForTesting(var);
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_TRUE(b.GenerateIfStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateIfStatement(expr)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -186,24 +183,24 @@
 
   auto* var = Var("v", ast::StorageClass::kPrivate, ty.i32);
   auto* body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(2))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(2))});
   auto* else_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(3))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(3))});
 
-  ast::IfStatement expr(
-      Source{}, Expr(true), body,
-      {create<ast::ElseStatement>(Source{}, Expr(true), else_body)});
+  auto* expr = create<ast::IfStatement>(
+      Expr(true), body,
+      ast::ElseStatementList{
+          create<ast::ElseStatement>(Expr(true), else_body),
+      });
 
   td.RegisterVariableForTesting(var);
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_TRUE(b.GenerateIfStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateIfStatement(expr)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -244,34 +241,30 @@
 
   auto* var = Var("v", ast::StorageClass::kPrivate, ty.i32);
   auto* body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(2))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(2))});
   auto* elseif_1_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(3))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(3))});
   auto* elseif_2_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(4))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(4))});
   auto* else_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(5))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(5))});
 
-  ast::IfStatement expr(
-      Source{}, Expr(true), body,
-      {
-          create<ast::ElseStatement>(Source{}, Expr(true), elseif_1_body),
-          create<ast::ElseStatement>(Source{}, Expr(false), elseif_2_body),
-          create<ast::ElseStatement>(Source{}, nullptr, else_body),
+  auto* expr = create<ast::IfStatement>(
+      Expr(true), body,
+      ast::ElseStatementList{
+          create<ast::ElseStatement>(Expr(true), elseif_1_body),
+          create<ast::ElseStatement>(Expr(false), elseif_2_body),
+          create<ast::ElseStatement>(nullptr, else_body),
       });
 
   td.RegisterVariableForTesting(var);
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_TRUE(b.GenerateIfStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateIfStatement(expr)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -320,27 +313,25 @@
   //   }
   // }
 
-  auto* if_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{
-                    create<ast::BreakStatement>(Source{}),
-                });
+  auto* if_body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::BreakStatement>(),
+  });
 
-  auto* if_stmt = create<ast::IfStatement>(Source{}, Expr(true), if_body,
-                                           ast::ElseStatementList{});
+  auto* if_stmt =
+      create<ast::IfStatement>(Expr(true), if_body, ast::ElseStatementList{});
 
-  auto* loop_body = create<ast::BlockStatement>(Source{}, ast::StatementList{
-                                                              if_stmt,
-                                                          });
+  auto* loop_body = create<ast::BlockStatement>(ast::StatementList{
+      if_stmt,
+  });
 
-  ast::LoopStatement expr(
-      Source{}, loop_body,
-      create<ast::BlockStatement>(Source{}, ast::StatementList{}));
+  auto* expr = create<ast::LoopStatement>(
+      loop_body, create<ast::BlockStatement>(ast::StatementList{}));
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(expr)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%5 = OpTypeBool
 %6 = OpConstantTrue %5
 )");
@@ -369,30 +360,26 @@
   //     break;
   //   }
   // }
-  auto* else_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{
-                    create<ast::BreakStatement>(Source{}),
-                });
+  auto* else_body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::BreakStatement>(),
+  });
 
   auto* if_stmt = create<ast::IfStatement>(
-      Source{}, Expr(true),
-      create<ast::BlockStatement>(Source{}, ast::StatementList{}),
-      ast::ElseStatementList{
-          create<ast::ElseStatement>(Source{}, nullptr, else_body)});
+      Expr(true), create<ast::BlockStatement>(ast::StatementList{}),
+      ast::ElseStatementList{create<ast::ElseStatement>(nullptr, else_body)});
 
-  auto* loop_body = create<ast::BlockStatement>(Source{}, ast::StatementList{
-                                                              if_stmt,
-                                                          });
+  auto* loop_body = create<ast::BlockStatement>(ast::StatementList{
+      if_stmt,
+  });
 
-  ast::LoopStatement expr(
-      Source{}, loop_body,
-      create<ast::BlockStatement>(Source{}, ast::StatementList{}));
+  auto* expr = create<ast::LoopStatement>(
+      loop_body, create<ast::BlockStatement>(ast::StatementList{}));
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(expr)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%5 = OpTypeBool
 %6 = OpConstantTrue %5
 )");
@@ -422,27 +409,25 @@
   //     continue;
   //   }
   // }
-  auto* if_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{
-                    create<ast::ContinueStatement>(Source{}),
-                });
+  auto* if_body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::ContinueStatement>(),
+  });
 
-  auto* if_stmt = create<ast::IfStatement>(Source{}, Expr(true), if_body,
-                                           ast::ElseStatementList{});
+  auto* if_stmt =
+      create<ast::IfStatement>(Expr(true), if_body, ast::ElseStatementList{});
 
-  auto* loop_body = create<ast::BlockStatement>(Source{}, ast::StatementList{
-                                                              if_stmt,
-                                                          });
+  auto* loop_body = create<ast::BlockStatement>(ast::StatementList{
+      if_stmt,
+  });
 
-  ast::LoopStatement expr(
-      Source{}, loop_body,
-      create<ast::BlockStatement>(Source{}, ast::StatementList{}));
+  auto* expr = create<ast::LoopStatement>(
+      loop_body, create<ast::BlockStatement>(ast::StatementList{}));
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(expr)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%5 = OpTypeBool
 %6 = OpConstantTrue %5
 )");
@@ -471,30 +456,26 @@
   //     continue;
   //   }
   // }
-  auto* else_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{
-                    create<ast::ContinueStatement>(Source{}),
-                });
+  auto* else_body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::ContinueStatement>(),
+  });
 
   auto* if_stmt = create<ast::IfStatement>(
-      Source{}, Expr(true),
-      create<ast::BlockStatement>(Source{}, ast::StatementList{}),
-      ast::ElseStatementList{
-          create<ast::ElseStatement>(Source{}, nullptr, else_body)});
+      Expr(true), create<ast::BlockStatement>(ast::StatementList{}),
+      ast::ElseStatementList{create<ast::ElseStatement>(nullptr, else_body)});
 
-  auto* loop_body = create<ast::BlockStatement>(Source{}, ast::StatementList{
-                                                              if_stmt,
-                                                          });
+  auto* loop_body = create<ast::BlockStatement>(ast::StatementList{
+      if_stmt,
+  });
 
-  ast::LoopStatement expr(
-      Source{}, loop_body,
-      create<ast::BlockStatement>(Source{}, ast::StatementList{}));
+  auto* expr = create<ast::LoopStatement>(
+      loop_body, create<ast::BlockStatement>(ast::StatementList{}));
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(expr)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%5 = OpTypeBool
 %6 = OpConstantTrue %5
 )");
@@ -522,18 +503,17 @@
   // if (true) {
   //   return;
   // }
-  auto* if_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{
-                    create<ast::ReturnStatement>(Source{}),
-                });
+  auto* if_body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::ReturnStatement>(),
+  });
 
-  ast::IfStatement expr(Source{}, Expr(true), if_body,
-                        ast::ElseStatementList{});
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  auto* expr =
+      create<ast::IfStatement>(Expr(true), if_body, ast::ElseStatementList{});
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateIfStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateIfStatement(expr)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeBool
 %2 = OpConstantTrue %1
 )");
@@ -550,18 +530,17 @@
   // if (true) {
   //   return false;
   // }
-  auto* if_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{
-                    create<ast::ReturnStatement>(Source{}, Expr(false)),
-                });
+  auto* if_body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::ReturnStatement>(Expr(false)),
+  });
 
-  ast::IfStatement expr(Source{}, Expr(true), if_body,
-                        ast::ElseStatementList{});
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  auto* expr =
+      create<ast::IfStatement>(Expr(true), if_body, ast::ElseStatementList{});
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateIfStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateIfStatement(expr)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeBool
 %2 = OpConstantTrue %1
 %5 = OpConstantFalse %1
@@ -583,17 +562,16 @@
   auto* var = Var("a", ast::StorageClass::kFunction, ty.bool_);
   td.RegisterVariableForTesting(var);
 
-  ast::IfStatement expr(
-      Source{}, Expr("a"),
-      create<ast::BlockStatement>(Source{}, ast::StatementList{}),
+  auto* expr = create<ast::IfStatement>(
+      Expr("a"), create<ast::BlockStatement>(ast::StatementList{}),
       ast::ElseStatementList{});
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_TRUE(b.GenerateIfStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateIfStatement(expr)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeBool
 %2 = OpTypePointer Function %3
 %1 = OpVariable %2 Function
diff --git a/src/writer/spirv/builder_intrinsic_texture_test.cc b/src/writer/spirv/builder_intrinsic_texture_test.cc
index f73ff56..a26bedd 100644
--- a/src/writer/spirv/builder_intrinsic_texture_test.cc
+++ b/src/writer/spirv/builder_intrinsic_texture_test.cc
@@ -2793,10 +2793,11 @@
   ASSERT_TRUE(b.GenerateGlobalVariable(tex)) << b.error();
   ASSERT_TRUE(b.GenerateGlobalVariable(sampler)) << b.error();
 
-  ast::CallExpression call{Source{}, Expr(param.function), param.args(this)};
+  auto* call =
+      create<ast::CallExpression>(Expr(param.function), param.args(this));
 
-  EXPECT_TRUE(td.DetermineResultType(&call)) << td.error();
-  EXPECT_EQ(b.GenerateExpression(&call), 0u);
+  EXPECT_TRUE(td.DetermineResultType(call)) << td.error();
+  EXPECT_EQ(b.GenerateExpression(call), 0u);
   EXPECT_THAT(b.error(),
               ::testing::StartsWith(
                   "Internal error: trying to add SPIR-V instruction "));
diff --git a/src/writer/spirv/builder_literal_test.cc b/src/writer/spirv/builder_literal_test.cc
index acecbde..b641b92 100644
--- a/src/writer/spirv/builder_literal_test.cc
+++ b/src/writer/spirv/builder_literal_test.cc
@@ -34,10 +34,9 @@
 using BuilderTest = TestHelper;
 
 TEST_F(BuilderTest, Literal_Bool_True) {
-  ast::type::Bool bool_type;
-  ast::BoolLiteral b_true(Source{}, &bool_type, true);
+  auto* b_true = create<ast::BoolLiteral>(ty.bool_, true);
 
-  auto id = b.GenerateLiteralIfNeeded(nullptr, &b_true);
+  auto id = b.GenerateLiteralIfNeeded(nullptr, b_true);
   ASSERT_FALSE(b.has_error()) << b.error();
   EXPECT_EQ(2u, id);
 
@@ -47,10 +46,9 @@
 }
 
 TEST_F(BuilderTest, Literal_Bool_False) {
-  ast::type::Bool bool_type;
-  ast::BoolLiteral b_false(Source{}, &bool_type, false);
+  auto* b_false = create<ast::BoolLiteral>(ty.bool_, false);
 
-  auto id = b.GenerateLiteralIfNeeded(nullptr, &b_false);
+  auto id = b.GenerateLiteralIfNeeded(nullptr, b_false);
   ASSERT_FALSE(b.has_error()) << b.error();
   EXPECT_EQ(2u, id);
 
@@ -60,15 +58,14 @@
 }
 
 TEST_F(BuilderTest, Literal_Bool_Dedup) {
-  ast::type::Bool bool_type;
-  ast::BoolLiteral b_true(Source{}, &bool_type, true);
-  ast::BoolLiteral b_false(Source{}, &bool_type, false);
+  auto* b_true = create<ast::BoolLiteral>(ty.bool_, true);
+  auto* b_false = create<ast::BoolLiteral>(ty.bool_, false);
 
-  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, &b_true), 0u);
+  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, b_true), 0u);
   ASSERT_FALSE(b.has_error()) << b.error();
-  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, &b_false), 0u);
+  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, b_false), 0u);
   ASSERT_FALSE(b.has_error()) << b.error();
-  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, &b_true), 0u);
+  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, b_true), 0u);
   ASSERT_FALSE(b.has_error()) << b.error();
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeBool
@@ -78,10 +75,9 @@
 }
 
 TEST_F(BuilderTest, Literal_I32) {
-  ast::type::I32 i32;
-  ast::SintLiteral i(Source{}, &i32, -23);
+  auto* i = create<ast::SintLiteral>(ty.i32, -23);
 
-  auto id = b.GenerateLiteralIfNeeded(nullptr, &i);
+  auto id = b.GenerateLiteralIfNeeded(nullptr, i);
   ASSERT_FALSE(b.has_error()) << b.error();
   EXPECT_EQ(2u, id);
 
@@ -91,12 +87,11 @@
 }
 
 TEST_F(BuilderTest, Literal_I32_Dedup) {
-  ast::type::I32 i32;
-  ast::SintLiteral i1(Source{}, &i32, -23);
-  ast::SintLiteral i2(Source{}, &i32, -23);
+  auto* i1 = create<ast::SintLiteral>(ty.i32, -23);
+  auto* i2 = create<ast::SintLiteral>(ty.i32, -23);
 
-  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, &i1), 0u);
-  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, &i2), 0u);
+  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, i1), 0u);
+  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, i2), 0u);
   ASSERT_FALSE(b.has_error()) << b.error();
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 1
@@ -105,10 +100,9 @@
 }
 
 TEST_F(BuilderTest, Literal_U32) {
-  ast::type::U32 u32;
-  ast::UintLiteral i(Source{}, &u32, 23);
+  auto* i = create<ast::UintLiteral>(ty.u32, 23);
 
-  auto id = b.GenerateLiteralIfNeeded(nullptr, &i);
+  auto id = b.GenerateLiteralIfNeeded(nullptr, i);
   ASSERT_FALSE(b.has_error()) << b.error();
   EXPECT_EQ(2u, id);
 
@@ -118,12 +112,11 @@
 }
 
 TEST_F(BuilderTest, Literal_U32_Dedup) {
-  ast::type::U32 u32;
-  ast::UintLiteral i1(Source{}, &u32, 23);
-  ast::UintLiteral i2(Source{}, &u32, 23);
+  auto* i1 = create<ast::UintLiteral>(ty.u32, 23);
+  auto* i2 = create<ast::UintLiteral>(ty.u32, 23);
 
-  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, &i1), 0u);
-  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, &i2), 0u);
+  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, i1), 0u);
+  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, i2), 0u);
   ASSERT_FALSE(b.has_error()) << b.error();
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 0
@@ -132,10 +125,9 @@
 }
 
 TEST_F(BuilderTest, Literal_F32) {
-  ast::type::F32 f32;
-  ast::FloatLiteral i(Source{}, &f32, 23.245f);
+  auto* i = create<ast::FloatLiteral>(ty.f32, 23.245f);
 
-  auto id = b.GenerateLiteralIfNeeded(nullptr, &i);
+  auto id = b.GenerateLiteralIfNeeded(nullptr, i);
   ASSERT_FALSE(b.has_error()) << b.error();
   EXPECT_EQ(2u, id);
 
@@ -145,12 +137,11 @@
 }
 
 TEST_F(BuilderTest, Literal_F32_Dedup) {
-  ast::type::F32 f32;
-  ast::FloatLiteral i1(Source{}, &f32, 23.245f);
-  ast::FloatLiteral i2(Source{}, &f32, 23.245f);
+  auto* i1 = create<ast::FloatLiteral>(ty.f32, 23.245f);
+  auto* i2 = create<ast::FloatLiteral>(ty.f32, 23.245f);
 
-  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, &i1), 0u);
-  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, &i2), 0u);
+  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, i1), 0u);
+  ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, i2), 0u);
   ASSERT_FALSE(b.has_error()) << b.error();
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeFloat 32
diff --git a/src/writer/spirv/builder_loop_test.cc b/src/writer/spirv/builder_loop_test.cc
index c7e46d2..b91fa7d 100644
--- a/src/writer/spirv/builder_loop_test.cc
+++ b/src/writer/spirv/builder_loop_test.cc
@@ -39,14 +39,14 @@
   // loop {
   // }
 
-  ast::LoopStatement loop(
-      Source{}, create<ast::BlockStatement>(Source{}, ast::StatementList{}),
-      create<ast::BlockStatement>(Source{}, ast::StatementList{}));
+  auto* loop = create<ast::LoopStatement>(
+      create<ast::BlockStatement>(ast::StatementList{}),
+      create<ast::BlockStatement>(ast::StatementList{}));
 
-  ASSERT_TRUE(td.DetermineResultType(&loop)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(loop)) << td.error();
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&loop)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.error();
   EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
             R"(OpBranch %1
 %1 = OpLabel
@@ -67,20 +67,18 @@
 
   auto* var = Var("v", ast::StorageClass::kPrivate, ty.i32);
   auto* body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(2))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(2))});
 
-  ast::LoopStatement loop(
-      Source{}, body,
-      create<ast::BlockStatement>(Source{}, ast::StatementList{}));
+  auto* loop = create<ast::LoopStatement>(
+      body, create<ast::BlockStatement>(ast::StatementList{}));
 
   td.RegisterVariableForTesting(var);
-  ASSERT_TRUE(td.DetermineResultType(&loop)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(loop)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&loop)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -112,21 +110,19 @@
 
   auto* var = Var("v", ast::StorageClass::kPrivate, ty.i32);
   auto* body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(2))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(2))});
   auto* continuing = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(3))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(3))});
 
-  ast::LoopStatement loop(Source{}, body, continuing);
+  auto* loop = create<ast::LoopStatement>(body, continuing);
 
   td.RegisterVariableForTesting(var);
-  ASSERT_TRUE(td.DetermineResultType(&loop)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(loop)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&loop)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -153,19 +149,17 @@
   // loop {
   //   continue;
   // }
-  auto* body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{
-                    create<ast::ContinueStatement>(Source{}),
-                });
-  ast::LoopStatement loop(
-      Source{}, body,
-      create<ast::BlockStatement>(Source{}, ast::StatementList{}));
+  auto* body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::ContinueStatement>(),
+  });
+  auto* loop = create<ast::LoopStatement>(
+      body, create<ast::BlockStatement>(ast::StatementList{}));
 
-  ASSERT_TRUE(td.DetermineResultType(&loop)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(loop)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&loop)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.error();
   EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
             R"(OpBranch %1
 %1 = OpLabel
@@ -183,19 +177,17 @@
   // loop {
   //   break;
   // }
-  auto* body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{
-                    create<ast::BreakStatement>(Source{}),
-                });
-  ast::LoopStatement loop(
-      Source{}, body,
-      create<ast::BlockStatement>(Source{}, ast::StatementList{}));
+  auto* body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::BreakStatement>(),
+  });
+  auto* loop = create<ast::LoopStatement>(
+      body, create<ast::BlockStatement>(ast::StatementList{}));
 
-  ASSERT_TRUE(td.DetermineResultType(&loop)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(loop)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&loop)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(loop)) << b.error();
   EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
             R"(OpBranch %1
 %1 = OpLabel
diff --git a/src/writer/spirv/builder_return_test.cc b/src/writer/spirv/builder_return_test.cc
index d095562..5e71109 100644
--- a/src/writer/spirv/builder_return_test.cc
+++ b/src/writer/spirv/builder_return_test.cc
@@ -35,10 +35,10 @@
 using BuilderTest = TestHelper;
 
 TEST_F(BuilderTest, Return) {
-  ast::ReturnStatement ret(Source{});
+  auto* ret = create<ast::ReturnStatement>();
 
   b.push_function(Function{});
-  EXPECT_TRUE(b.GenerateReturnStatement(&ret));
+  EXPECT_TRUE(b.GenerateReturnStatement(ret));
   ASSERT_FALSE(b.has_error()) << b.error();
 
   EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()), R"(OpReturn
@@ -47,15 +47,14 @@
 
 TEST_F(BuilderTest, Return_WithValue) {
   auto* val = create<ast::TypeConstructorExpression>(
-      Source{}, ty.vec3<f32>(),
-      ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
+      ty.vec3<f32>(), ast::ExpressionList{Expr(1.f), Expr(1.f), Expr(3.f)});
 
-  ast::ReturnStatement ret(Source{}, val);
+  auto* ret = create<ast::ReturnStatement>(val);
 
-  EXPECT_TRUE(td.DetermineResultType(&ret)) << td.error();
+  EXPECT_TRUE(td.DetermineResultType(ret)) << td.error();
 
   b.push_function(Function{});
-  EXPECT_TRUE(b.GenerateReturnStatement(&ret));
+  EXPECT_TRUE(b.GenerateReturnStatement(ret));
   ASSERT_FALSE(b.has_error()) << b.error();
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
@@ -72,14 +71,14 @@
 TEST_F(BuilderTest, Return_WithValue_GeneratesLoad) {
   auto* var = Var("param", ast::StorageClass::kFunction, ty.f32);
 
-  ast::ReturnStatement ret(Source{}, Expr("param"));
+  auto* ret = create<ast::ReturnStatement>(Expr("param"));
 
   td.RegisterVariableForTesting(var);
-  EXPECT_TRUE(td.DetermineResultType(&ret)) << td.error();
+  EXPECT_TRUE(td.DetermineResultType(ret)) << td.error();
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateFunctionVariable(var)) << b.error();
-  EXPECT_TRUE(b.GenerateReturnStatement(&ret)) << b.error();
+  EXPECT_TRUE(b.GenerateReturnStatement(ret)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
diff --git a/src/writer/spirv/builder_switch_test.cc b/src/writer/spirv/builder_switch_test.cc
index d0be541..7150529 100644
--- a/src/writer/spirv/builder_switch_test.cc
+++ b/src/writer/spirv/builder_switch_test.cc
@@ -43,12 +43,12 @@
   // switch (1) {
   // }
 
-  ast::SwitchStatement expr(Source{}, Expr(1), ast::CaseStatementList{});
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  auto* expr = create<ast::SwitchStatement>(Expr(1), ast::CaseStatementList{});
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateSwitchStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateSwitchStatement(expr)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 1
 %3 = OpConstant %2 1
 )");
@@ -73,12 +73,10 @@
   auto* a = Var("a", ast::StorageClass::kPrivate, ty.i32);
 
   auto* case_1_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(1))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(1))});
 
   auto* case_2_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(2))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(2))});
 
   ast::CaseSelectorList selector_1;
   selector_1.push_back(Literal(1));
@@ -87,16 +85,14 @@
   selector_2.push_back(Literal(2));
 
   ast::CaseStatementList cases;
-  cases.push_back(
-      create<ast::CaseStatement>(Source{}, selector_1, case_1_body));
-  cases.push_back(
-      create<ast::CaseStatement>(Source{}, selector_2, case_2_body));
+  cases.push_back(create<ast::CaseStatement>(selector_1, case_1_body));
+  cases.push_back(create<ast::CaseStatement>(selector_2, case_2_body));
 
-  ast::SwitchStatement expr(Source{}, Expr("a"), cases);
+  auto* expr = create<ast::SwitchStatement>(Expr("a"), cases);
 
   td.RegisterVariableForTesting(v);
   td.RegisterVariableForTesting(a);
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   auto* func = Func("a_func", {}, ty.i32, ast::StatementList{},
                     ast::FunctionDecorationList{});
@@ -105,7 +101,7 @@
   ASSERT_TRUE(b.GenerateGlobalVariable(a)) << b.error();
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
 
-  EXPECT_TRUE(b.GenerateSwitchStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateSwitchStatement(expr)) << b.error();
 
   EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
 OpName %5 "a"
@@ -147,18 +143,17 @@
   auto* a = Var("a", ast::StorageClass::kPrivate, ty.i32);
 
   auto* default_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(1))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(1))});
 
   ast::CaseStatementList cases;
-  cases.push_back(create<ast::CaseStatement>(Source{}, ast::CaseSelectorList{},
-                                             default_body));
+  cases.push_back(
+      create<ast::CaseStatement>(ast::CaseSelectorList{}, default_body));
 
-  ast::SwitchStatement expr(Source{}, Expr("a"), cases);
+  auto* expr = create<ast::SwitchStatement>(Expr("a"), cases);
 
   td.RegisterVariableForTesting(v);
   td.RegisterVariableForTesting(a);
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   auto* func = Func("a_func", {}, ty.i32, ast::StatementList{},
                     ast::FunctionDecorationList{});
@@ -167,7 +162,7 @@
   ASSERT_TRUE(b.GenerateGlobalVariable(a)) << b.error();
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
 
-  EXPECT_TRUE(b.GenerateSwitchStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateSwitchStatement(expr)) << b.error();
 
   EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
 OpName %5 "a"
@@ -207,16 +202,13 @@
   auto* a = Var("a", ast::StorageClass::kPrivate, ty.i32);
 
   auto* case_1_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(1))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(1))});
 
   auto* case_2_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(2))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(2))});
 
   auto* default_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(3))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(3))});
 
   ast::CaseSelectorList selector_1;
   selector_1.push_back(Literal(1));
@@ -226,18 +218,16 @@
   selector_2.push_back(Literal(3));
 
   ast::CaseStatementList cases;
+  cases.push_back(create<ast::CaseStatement>(selector_1, case_1_body));
+  cases.push_back(create<ast::CaseStatement>(selector_2, case_2_body));
   cases.push_back(
-      create<ast::CaseStatement>(Source{}, selector_1, case_1_body));
-  cases.push_back(
-      create<ast::CaseStatement>(Source{}, selector_2, case_2_body));
-  cases.push_back(create<ast::CaseStatement>(Source{}, ast::CaseSelectorList{},
-                                             default_body));
+      create<ast::CaseStatement>(ast::CaseSelectorList{}, default_body));
 
-  ast::SwitchStatement expr(Source{}, Expr("a"), cases);
+  auto* expr = create<ast::SwitchStatement>(Expr("a"), cases);
 
   td.RegisterVariableForTesting(v);
   td.RegisterVariableForTesting(a);
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   auto* func = Func("a_func", {}, ty.i32, ast::StatementList{},
                     ast::FunctionDecorationList{});
@@ -246,7 +236,7 @@
   ASSERT_TRUE(b.GenerateGlobalVariable(a)) << b.error();
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
 
-  EXPECT_TRUE(b.GenerateSwitchStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateSwitchStatement(expr)) << b.error();
 
   EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
 OpName %5 "a"
@@ -295,18 +285,14 @@
   auto* a = Var("a", ast::StorageClass::kPrivate, ty.i32);
 
   auto* case_1_body = create<ast::BlockStatement>(
-      Source{},
-      ast::StatementList{
-          create<ast::AssignmentStatement>(Source{}, Expr("v"), Expr(1)),
-          create<ast::FallthroughStatement>(Source{})});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(1)),
+                         create<ast::FallthroughStatement>()});
 
   auto* case_2_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(2))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(2))});
 
   auto* default_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{create<ast::AssignmentStatement>(
-                    Source{}, Expr("v"), Expr(3))});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(3))});
 
   ast::CaseSelectorList selector_1;
   selector_1.push_back(Literal(1));
@@ -315,18 +301,16 @@
   selector_2.push_back(Literal(2));
 
   ast::CaseStatementList cases;
+  cases.push_back(create<ast::CaseStatement>(selector_1, case_1_body));
+  cases.push_back(create<ast::CaseStatement>(selector_2, case_2_body));
   cases.push_back(
-      create<ast::CaseStatement>(Source{}, selector_1, case_1_body));
-  cases.push_back(
-      create<ast::CaseStatement>(Source{}, selector_2, case_2_body));
-  cases.push_back(create<ast::CaseStatement>(Source{}, ast::CaseSelectorList{},
-                                             default_body));
+      create<ast::CaseStatement>(ast::CaseSelectorList{}, default_body));
 
-  ast::SwitchStatement expr(Source{}, Expr("a"), cases);
+  auto* expr = create<ast::SwitchStatement>(Expr("a"), cases);
 
   td.RegisterVariableForTesting(v);
   td.RegisterVariableForTesting(a);
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   auto* func = Func("a_func", {}, ty.i32, ast::StatementList{},
                     ast::FunctionDecorationList{});
@@ -335,7 +319,7 @@
   ASSERT_TRUE(b.GenerateGlobalVariable(a)) << b.error();
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
 
-  EXPECT_TRUE(b.GenerateSwitchStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateSwitchStatement(expr)) << b.error();
 
   EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
 OpName %5 "a"
@@ -380,23 +364,20 @@
   auto* a = Var("a", ast::StorageClass::kPrivate, ty.i32);
 
   auto* case_1_body = create<ast::BlockStatement>(
-      Source{},
-      ast::StatementList{
-          create<ast::AssignmentStatement>(Source{}, Expr("v"), Expr(1)),
-          create<ast::FallthroughStatement>(Source{})});
+      ast::StatementList{create<ast::AssignmentStatement>(Expr("v"), Expr(1)),
+                         create<ast::FallthroughStatement>()});
 
   ast::CaseSelectorList selector_1;
   selector_1.push_back(Literal(1));
 
   ast::CaseStatementList cases;
-  cases.push_back(
-      create<ast::CaseStatement>(Source{}, selector_1, case_1_body));
+  cases.push_back(create<ast::CaseStatement>(selector_1, case_1_body));
 
-  ast::SwitchStatement expr(Source{}, Expr("a"), cases);
+  auto* expr = create<ast::SwitchStatement>(Expr("a"), cases);
 
   td.RegisterVariableForTesting(v);
   td.RegisterVariableForTesting(a);
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   auto* func = Func("a_func", {}, ty.i32, ast::StatementList{},
                     ast::FunctionDecorationList{});
@@ -405,7 +386,7 @@
   ASSERT_TRUE(b.GenerateGlobalVariable(a)) << b.error();
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
 
-  EXPECT_FALSE(b.GenerateSwitchStatement(&expr)) << b.error();
+  EXPECT_FALSE(b.GenerateSwitchStatement(expr)) << b.error();
   EXPECT_EQ(b.error(), "fallthrough of last case statement is disallowed");
 }
 
@@ -421,30 +402,25 @@
   auto* v = Var("v", ast::StorageClass::kPrivate, ty.i32);
   auto* a = Var("a", ast::StorageClass::kPrivate, ty.i32);
 
-  auto* if_body = create<ast::BlockStatement>(
-      Source{}, ast::StatementList{
-                    create<ast::BreakStatement>(Source{}),
-                });
+  auto* if_body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::BreakStatement>(),
+  });
 
-  auto* case_1_body = create<ast::BlockStatement>(
-      Source{},
-      ast::StatementList{
-          create<ast::IfStatement>(Source{}, Expr(true), if_body,
-                                   ast::ElseStatementList{}),
-          create<ast::AssignmentStatement>(Source{}, Expr("v"), Expr(1))});
+  auto* case_1_body = create<ast::BlockStatement>(ast::StatementList{
+      create<ast::IfStatement>(Expr(true), if_body, ast::ElseStatementList{}),
+      create<ast::AssignmentStatement>(Expr("v"), Expr(1))});
 
   ast::CaseSelectorList selector_1;
   selector_1.push_back(Literal(1));
 
   ast::CaseStatementList cases;
-  cases.push_back(
-      create<ast::CaseStatement>(Source{}, selector_1, case_1_body));
+  cases.push_back(create<ast::CaseStatement>(selector_1, case_1_body));
 
-  ast::SwitchStatement expr(Source{}, Expr("a"), cases);
+  auto* expr = create<ast::SwitchStatement>(Expr("a"), cases);
 
   td.RegisterVariableForTesting(v);
   td.RegisterVariableForTesting(a);
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   auto* func = Func("a_func", {}, ty.i32, ast::StatementList{},
                     ast::FunctionDecorationList{});
@@ -453,7 +429,7 @@
   ASSERT_TRUE(b.GenerateGlobalVariable(a)) << b.error();
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
 
-  EXPECT_TRUE(b.GenerateSwitchStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateSwitchStatement(expr)) << b.error();
 
   EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
 OpName %5 "a"
diff --git a/src/writer/spirv/builder_type_test.cc b/src/writer/spirv/builder_type_test.cc
index ca97704..db2f45a 100644
--- a/src/writer/spirv/builder_type_test.cc
+++ b/src/writer/spirv/builder_type_test.cc
@@ -114,7 +114,7 @@
 TEST_F(BuilderTest_Type, GenerateArray_WithStride) {
   ast::type::Array ary(ty.i32, 4,
                        ast::ArrayDecorationList{
-                           create<ast::StrideDecoration>(Source{}, 16u),
+                           create<ast::StrideDecoration>(16u),
                        });
 
   auto id = b.GenerateTypeIfNeeded(&ary);
@@ -242,8 +242,8 @@
 }
 
 TEST_F(BuilderTest_Type, GenerateStruct_Empty) {
-  auto* s = create<ast::Struct>(Source{}, ast::StructMemberList{},
-                                ast::StructDecorationList{});
+  auto* s =
+      create<ast::Struct>(ast::StructMemberList{}, ast::StructDecorationList{});
   auto* s_type = ty.struct_("S", s);
 
   auto id = b.GenerateTypeIfNeeded(s_type);
@@ -276,7 +276,7 @@
 
 TEST_F(BuilderTest_Type, GenerateStruct_Decorated) {
   ast::StructDecorationList struct_decos;
-  struct_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
+  struct_decos.push_back(create<ast::StructBlockDecoration>());
 
   auto* s = create<ast::Struct>(ast::StructMemberList{Member("a", ty.f32)},
                                 struct_decos);
diff --git a/src/writer/spirv/builder_unary_op_expression_test.cc b/src/writer/spirv/builder_unary_op_expression_test.cc
index 2626f1c..5fc830b 100644
--- a/src/writer/spirv/builder_unary_op_expression_test.cc
+++ b/src/writer/spirv/builder_unary_op_expression_test.cc
@@ -38,11 +38,11 @@
 using BuilderTest = TestHelper;
 
 TEST_F(BuilderTest, UnaryOp_Negation_Integer) {
-  ast::UnaryOpExpression expr(Source{}, ast::UnaryOp::kNegation, Expr(1));
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  auto* expr = create<ast::UnaryOpExpression>(ast::UnaryOp::kNegation, Expr(1));
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
-  EXPECT_EQ(b.GenerateUnaryOpExpression(&expr), 1u) << b.error();
+  EXPECT_EQ(b.GenerateUnaryOpExpression(expr), 1u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 1
 %3 = OpConstant %2 1
 )");
@@ -52,11 +52,12 @@
 }
 
 TEST_F(BuilderTest, UnaryOp_Negation_Float) {
-  ast::UnaryOpExpression expr(Source{}, ast::UnaryOp::kNegation, Expr(1.f));
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  auto* expr =
+      create<ast::UnaryOpExpression>(ast::UnaryOp::kNegation, Expr(1.f));
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
-  EXPECT_EQ(b.GenerateUnaryOpExpression(&expr), 1u) << b.error();
+  EXPECT_EQ(b.GenerateUnaryOpExpression(expr), 1u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %3 = OpConstant %2 1
 )");
@@ -66,11 +67,11 @@
 }
 
 TEST_F(BuilderTest, UnaryOp_Not) {
-  ast::UnaryOpExpression expr(Source{}, ast::UnaryOp::kNot, Expr(false));
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  auto* expr = create<ast::UnaryOpExpression>(ast::UnaryOp::kNot, Expr(false));
+  ASSERT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
-  EXPECT_EQ(b.GenerateUnaryOpExpression(&expr), 1u) << b.error();
+  EXPECT_EQ(b.GenerateUnaryOpExpression(expr), 1u) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
 %3 = OpConstantFalse %2
 )");
@@ -82,14 +83,15 @@
 TEST_F(BuilderTest, UnaryOp_LoadRequired) {
   auto* var = Var("param", ast::StorageClass::kFunction, ty.vec3<f32>());
 
-  ast::UnaryOpExpression expr(Source{}, ast::UnaryOp::kNegation, Expr("param"));
+  auto* expr =
+      create<ast::UnaryOpExpression>(ast::UnaryOp::kNegation, Expr("param"));
 
   td.RegisterVariableForTesting(var);
-  EXPECT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  EXPECT_TRUE(td.DetermineResultType(expr)) << td.error();
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateFunctionVariable(var)) << b.error();
-  EXPECT_EQ(b.GenerateUnaryOpExpression(&expr), 6u) << b.error();
+  EXPECT_EQ(b.GenerateUnaryOpExpression(expr), 6u) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeFloat 32