transform tests: Replace std::make_unique<T> -> create<T>

create() is currently just a simple forwarder to std::make_unique<>, but
will be later replaced with a function that returns a raw pointer,
and owned by the context.

Bug: tint:322
Change-Id: I630ce57017fe84b5d00e9bd74902f47547a13f3a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/32669
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/transform/bound_array_accessors_transform_test.cc b/src/transform/bound_array_accessors_transform_test.cc
index cf013a7..e165ef0 100644
--- a/src/transform/bound_array_accessors_transform_test.cc
+++ b/src/transform/bound_array_accessors_transform_test.cc
@@ -52,9 +52,8 @@
   BoundArrayAccessorsTest() : td_(&ctx_, &mod_), transform_(&ctx_, &mod_) {}
 
   ast::BlockStatement* SetupFunctionAndBody() {
-    auto func = std::make_unique<ast::Function>("func", ast::VariableList{},
-                                                &void_type_);
-    auto block = std::make_unique<ast::BlockStatement>();
+    auto func = create<ast::Function>("func", ast::VariableList{}, &void_type_);
+    auto block = create<ast::BlockStatement>();
     body_ = block.get();
     func->set_body(std::move(block));
     mod_.AddFunction(std::move(func));
@@ -63,13 +62,20 @@
 
   void DeclareVariable(std::unique_ptr<ast::Variable> var) {
     ASSERT_NE(body_, nullptr);
-    body_->append(std::make_unique<ast::VariableDeclStatement>(std::move(var)));
+    body_->append(create<ast::VariableDeclStatement>(std::move(var)));
   }
 
   TypeDeterminer* td() { return &td_; }
 
   BoundArrayAccessorsTransform* transform() { return &transform_; }
 
+  /// @return a `std::unique_ptr` to a new `T` constructed with `args`
+  /// @param args the arguments to forward to the constructor for `T`
+  template <typename T, typename... ARGS>
+  std::unique_ptr<T> create(ARGS&&... args) {
+    return std::make_unique<T>(std::forward<ARGS>(args)...);
+  }
+
  private:
   Context ctx_;
   ast::Module mod_;
@@ -93,22 +99,20 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &ary));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &ary));
 
-  auto c_var =
-      std::make_unique<ast::Variable>("c", ast::StorageClass::kFunction, &u32);
+  auto c_var = create<ast::Variable>("c", ast::StorageClass::kFunction, &u32);
   c_var->set_is_const(true);
   DeclareVariable(std::move(c_var));
 
-  auto access_idx = std::make_unique<ast::IdentifierExpression>("c");
+  auto access_idx = create<ast::IdentifierExpression>("c");
   auto* access_ptr = access_idx.get();
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::IdentifierExpression>("a"), std::move(access_idx));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::IdentifierExpression>("a"), std::move(access_idx));
   auto* ptr = accessor.get();
 
-  auto b = std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction,
-                                           &ptr_type);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &ptr_type);
   b->set_constructor(std::move(accessor));
   b->set_is_const(true);
   DeclareVariable(std::move(b));
@@ -156,27 +160,24 @@
   ast::type::ArrayType ary5(&f32, 5);
 
   SetupFunctionAndBody();
-  DeclareVariable(std::make_unique<ast::Variable>(
-      "a", ast::StorageClass::kFunction, &ary3));
-  DeclareVariable(std::make_unique<ast::Variable>(
-      "b", ast::StorageClass::kFunction, &ary5));
   DeclareVariable(
-      std::make_unique<ast::Variable>("i", ast::StorageClass::kFunction, &u32));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &ary3));
+  DeclareVariable(
+      create<ast::Variable>("b", ast::StorageClass::kFunction, &ary5));
+  DeclareVariable(
+      create<ast::Variable>("i", ast::StorageClass::kFunction, &u32));
 
-  auto b_access_idx = std::make_unique<ast::IdentifierExpression>("i");
+  auto b_access_idx = create<ast::IdentifierExpression>("i");
   auto* b_access_ptr = b_access_idx.get();
 
-  auto a_access_idx = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::IdentifierExpression>("b"),
-      std::move(b_access_idx));
+  auto a_access_idx = create<ast::ArrayAccessorExpression>(
+      create<ast::IdentifierExpression>("b"), std::move(b_access_idx));
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::IdentifierExpression>("a"),
-      std::move(a_access_idx));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::IdentifierExpression>("a"), std::move(a_access_idx));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("c", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("c", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -241,16 +242,15 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &ary));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &ary));
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::IdentifierExpression>("a"),
-      std::make_unique<ast::ScalarConstructorExpression>(
-          std::make_unique<ast::UintLiteral>(&u32, 1u)));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::IdentifierExpression>("a"),
+      create<ast::ScalarConstructorExpression>(
+          create<ast::UintLiteral>(&u32, 1u)));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -282,26 +282,24 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &ary));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &ary));
   DeclareVariable(
-      std::make_unique<ast::Variable>("c", ast::StorageClass::kFunction, &u32));
+      create<ast::Variable>("c", ast::StorageClass::kFunction, &u32));
 
-  auto access_idx = std::make_unique<ast::BinaryExpression>(
-      ast::BinaryOp::kAdd, std::make_unique<ast::IdentifierExpression>("c"),
-      std::make_unique<ast::BinaryExpression>(
-          ast::BinaryOp::kSubtract,
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::UintLiteral>(&u32, 2)),
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::UintLiteral>(&u32, 3))));
+  auto access_idx = create<ast::BinaryExpression>(
+      ast::BinaryOp::kAdd, create<ast::IdentifierExpression>("c"),
+      create<ast::BinaryExpression>(ast::BinaryOp::kSubtract,
+                                    create<ast::ScalarConstructorExpression>(
+                                        create<ast::UintLiteral>(&u32, 2)),
+                                    create<ast::ScalarConstructorExpression>(
+                                        create<ast::UintLiteral>(&u32, 3))));
   auto* access_ptr = access_idx.get();
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::IdentifierExpression>("a"), std::move(access_idx));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::IdentifierExpression>("a"), std::move(access_idx));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -346,16 +344,15 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &ary));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &ary));
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::IdentifierExpression>("a"),
-      std::make_unique<ast::ScalarConstructorExpression>(
-          std::make_unique<ast::SintLiteral>(&i32, -1)));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::IdentifierExpression>("a"),
+      create<ast::ScalarConstructorExpression>(
+          create<ast::SintLiteral>(&i32, -1)));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -386,16 +383,15 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &ary));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &ary));
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::IdentifierExpression>("a"),
-      std::make_unique<ast::ScalarConstructorExpression>(
-          std::make_unique<ast::UintLiteral>(&u32, 3u)));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::IdentifierExpression>("a"),
+      create<ast::ScalarConstructorExpression>(
+          create<ast::UintLiteral>(&u32, 3u)));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -426,16 +422,15 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &vec));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &vec));
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::IdentifierExpression>("a"),
-      std::make_unique<ast::ScalarConstructorExpression>(
-          std::make_unique<ast::UintLiteral>(&u32, 1u)));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::IdentifierExpression>("a"),
+      create<ast::ScalarConstructorExpression>(
+          create<ast::UintLiteral>(&u32, 1u)));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -467,26 +462,24 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &vec));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &vec));
   DeclareVariable(
-      std::make_unique<ast::Variable>("c", ast::StorageClass::kFunction, &u32));
+      create<ast::Variable>("c", ast::StorageClass::kFunction, &u32));
 
-  auto access_idx = std::make_unique<ast::BinaryExpression>(
-      ast::BinaryOp::kAdd, std::make_unique<ast::IdentifierExpression>("c"),
-      std::make_unique<ast::BinaryExpression>(
-          ast::BinaryOp::kSubtract,
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::UintLiteral>(&u32, 2)),
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::UintLiteral>(&u32, 3))));
+  auto access_idx = create<ast::BinaryExpression>(
+      ast::BinaryOp::kAdd, create<ast::IdentifierExpression>("c"),
+      create<ast::BinaryExpression>(ast::BinaryOp::kSubtract,
+                                    create<ast::ScalarConstructorExpression>(
+                                        create<ast::UintLiteral>(&u32, 2)),
+                                    create<ast::ScalarConstructorExpression>(
+                                        create<ast::UintLiteral>(&u32, 3))));
   auto* access_ptr = access_idx.get();
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::IdentifierExpression>("a"), std::move(access_idx));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::IdentifierExpression>("a"), std::move(access_idx));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -530,16 +523,15 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &vec));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &vec));
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::IdentifierExpression>("a"),
-      std::make_unique<ast::ScalarConstructorExpression>(
-          std::make_unique<ast::SintLiteral>(&i32, -1)));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::IdentifierExpression>("a"),
+      create<ast::ScalarConstructorExpression>(
+          create<ast::SintLiteral>(&i32, -1)));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -570,16 +562,15 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &vec));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &vec));
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::IdentifierExpression>("a"),
-      std::make_unique<ast::ScalarConstructorExpression>(
-          std::make_unique<ast::UintLiteral>(&u32, 3u)));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::IdentifierExpression>("a"),
+      create<ast::ScalarConstructorExpression>(
+          create<ast::UintLiteral>(&u32, 3u)));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -610,19 +601,18 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::ArrayAccessorExpression>(
-          std::make_unique<ast::IdentifierExpression>("a"),
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::UintLiteral>(&u32, 2u))),
-      std::make_unique<ast::ScalarConstructorExpression>(
-          std::make_unique<ast::UintLiteral>(&u32, 1u)));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::ArrayAccessorExpression>(
+          create<ast::IdentifierExpression>("a"),
+          create<ast::ScalarConstructorExpression>(
+              create<ast::UintLiteral>(&u32, 2u))),
+      create<ast::ScalarConstructorExpression>(
+          create<ast::UintLiteral>(&u32, 1u)));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -667,30 +657,27 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
   DeclareVariable(
-      std::make_unique<ast::Variable>("c", ast::StorageClass::kFunction, &u32));
+      create<ast::Variable>("c", ast::StorageClass::kFunction, &u32));
 
-  auto access_idx = std::make_unique<ast::BinaryExpression>(
-      ast::BinaryOp::kAdd, std::make_unique<ast::IdentifierExpression>("c"),
-      std::make_unique<ast::BinaryExpression>(
-          ast::BinaryOp::kSubtract,
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::UintLiteral>(&u32, 2)),
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::UintLiteral>(&u32, 3))));
+  auto access_idx = create<ast::BinaryExpression>(
+      ast::BinaryOp::kAdd, create<ast::IdentifierExpression>("c"),
+      create<ast::BinaryExpression>(ast::BinaryOp::kSubtract,
+                                    create<ast::ScalarConstructorExpression>(
+                                        create<ast::UintLiteral>(&u32, 2)),
+                                    create<ast::ScalarConstructorExpression>(
+                                        create<ast::UintLiteral>(&u32, 3))));
   auto* access_ptr = access_idx.get();
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::ArrayAccessorExpression>(
-          std::make_unique<ast::IdentifierExpression>("a"),
-          std::move(access_idx)),
-      std::make_unique<ast::ScalarConstructorExpression>(
-          std::make_unique<ast::UintLiteral>(&u32, 1u)));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::ArrayAccessorExpression>(
+          create<ast::IdentifierExpression>("a"), std::move(access_idx)),
+      create<ast::ScalarConstructorExpression>(
+          create<ast::UintLiteral>(&u32, 1u)));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -749,30 +736,28 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
   DeclareVariable(
-      std::make_unique<ast::Variable>("c", ast::StorageClass::kFunction, &u32));
+      create<ast::Variable>("c", ast::StorageClass::kFunction, &u32));
 
-  auto access_idx = std::make_unique<ast::BinaryExpression>(
-      ast::BinaryOp::kAdd, std::make_unique<ast::IdentifierExpression>("c"),
-      std::make_unique<ast::BinaryExpression>(
-          ast::BinaryOp::kSubtract,
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::UintLiteral>(&u32, 2)),
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::UintLiteral>(&u32, 3))));
+  auto access_idx = create<ast::BinaryExpression>(
+      ast::BinaryOp::kAdd, create<ast::IdentifierExpression>("c"),
+      create<ast::BinaryExpression>(ast::BinaryOp::kSubtract,
+                                    create<ast::ScalarConstructorExpression>(
+                                        create<ast::UintLiteral>(&u32, 2)),
+                                    create<ast::ScalarConstructorExpression>(
+                                        create<ast::UintLiteral>(&u32, 3))));
   auto* access_ptr = access_idx.get();
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::ArrayAccessorExpression>(
-          std::make_unique<ast::IdentifierExpression>("a"),
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::UintLiteral>(&u32, 1u))),
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::ArrayAccessorExpression>(
+          create<ast::IdentifierExpression>("a"),
+          create<ast::ScalarConstructorExpression>(
+              create<ast::UintLiteral>(&u32, 1u))),
       std::move(access_idx));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -829,19 +814,18 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::ArrayAccessorExpression>(
-          std::make_unique<ast::IdentifierExpression>("a"),
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::SintLiteral>(&i32, -1))),
-      std::make_unique<ast::ScalarConstructorExpression>(
-          std::make_unique<ast::SintLiteral>(&i32, 1)));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::ArrayAccessorExpression>(
+          create<ast::IdentifierExpression>("a"),
+          create<ast::ScalarConstructorExpression>(
+              create<ast::SintLiteral>(&i32, -1))),
+      create<ast::ScalarConstructorExpression>(
+          create<ast::SintLiteral>(&i32, 1)));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -884,19 +868,18 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::ArrayAccessorExpression>(
-          std::make_unique<ast::IdentifierExpression>("a"),
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::SintLiteral>(&i32, 2))),
-      std::make_unique<ast::ScalarConstructorExpression>(
-          std::make_unique<ast::SintLiteral>(&i32, -1)));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::ArrayAccessorExpression>(
+          create<ast::IdentifierExpression>("a"),
+          create<ast::ScalarConstructorExpression>(
+              create<ast::SintLiteral>(&i32, 2))),
+      create<ast::ScalarConstructorExpression>(
+          create<ast::SintLiteral>(&i32, -1)));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -940,19 +923,18 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::ArrayAccessorExpression>(
-          std::make_unique<ast::IdentifierExpression>("a"),
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::UintLiteral>(&u32, 5u))),
-      std::make_unique<ast::ScalarConstructorExpression>(
-          std::make_unique<ast::UintLiteral>(&u32, 1u)));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::ArrayAccessorExpression>(
+          create<ast::IdentifierExpression>("a"),
+          create<ast::ScalarConstructorExpression>(
+              create<ast::UintLiteral>(&u32, 5u))),
+      create<ast::ScalarConstructorExpression>(
+          create<ast::UintLiteral>(&u32, 1u)));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
@@ -996,19 +978,18 @@
 
   SetupFunctionAndBody();
   DeclareVariable(
-      std::make_unique<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
+      create<ast::Variable>("a", ast::StorageClass::kFunction, &mat));
 
-  auto accessor = std::make_unique<ast::ArrayAccessorExpression>(
-      std::make_unique<ast::ArrayAccessorExpression>(
-          std::make_unique<ast::IdentifierExpression>("a"),
-          std::make_unique<ast::ScalarConstructorExpression>(
-              std::make_unique<ast::UintLiteral>(&u32, 2u))),
-      std::make_unique<ast::ScalarConstructorExpression>(
-          std::make_unique<ast::UintLiteral>(&u32, 5u)));
+  auto accessor = create<ast::ArrayAccessorExpression>(
+      create<ast::ArrayAccessorExpression>(
+          create<ast::IdentifierExpression>("a"),
+          create<ast::ScalarConstructorExpression>(
+              create<ast::UintLiteral>(&u32, 2u))),
+      create<ast::ScalarConstructorExpression>(
+          create<ast::UintLiteral>(&u32, 5u)));
   auto* ptr = accessor.get();
 
-  auto b =
-      std::make_unique<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
+  auto b = create<ast::Variable>("b", ast::StorageClass::kFunction, &f32);
   b->set_constructor(std::move(accessor));
   DeclareVariable(std::move(b));
 
diff --git a/src/transform/vertex_pulling_transform_test.cc b/src/transform/vertex_pulling_transform_test.cc
index 4a5715e..a9b0c8c 100644
--- a/src/transform/vertex_pulling_transform_test.cc
+++ b/src/transform/vertex_pulling_transform_test.cc
@@ -35,17 +35,17 @@
 class VertexPullingTransformHelper {
  public:
   VertexPullingTransformHelper() {
-    mod_ = std::make_unique<ast::Module>();
+    mod_ = create<ast::Module>();
     transform_ = std::make_unique<VertexPullingTransform>(&ctx_, mod_.get());
   }
 
   // Create basic module with an entry point and vertex function
   void InitBasicModule() {
-    auto func = std::make_unique<ast::Function>(
+    auto func = create<ast::Function>(
         "main", ast::VariableList{},
         ctx_.type_mgr().Get(std::make_unique<ast::type::VoidType>()));
-    func->add_decoration(std::make_unique<ast::StageDecoration>(
-        ast::PipelineStage ::kVertex, Source{}));
+    func->add_decoration(
+        create<ast::StageDecoration>(ast::PipelineStage ::kVertex, Source{}));
     mod()->AddFunction(std::move(func));
   }
 
@@ -65,12 +65,11 @@
   void AddVertexInputVariable(uint32_t location,
                               std::string name,
                               ast::type::Type* type) {
-    auto var = std::make_unique<ast::DecoratedVariable>(
-        std::make_unique<ast::Variable>(name, ast::StorageClass::kInput, type));
+    auto var = create<ast::DecoratedVariable>(
+        create<ast::Variable>(name, ast::StorageClass::kInput, type));
 
     ast::VariableDecorationList decorations;
-    decorations.push_back(
-        std::make_unique<ast::LocationDecoration>(location, Source{}));
+    decorations.push_back(create<ast::LocationDecoration>(location, Source{}));
 
     var->set_decorations(std::move(decorations));
     mod_->AddGlobalVariable(std::move(var));
@@ -80,6 +79,13 @@
   ast::Module* mod() { return mod_.get(); }
   VertexPullingTransform* transform() { return transform_.get(); }
 
+  /// @return a `std::unique_ptr` to a new `T` constructed with `args`
+  /// @param args the arguments to forward to the constructor for `T`
+  template <typename T, typename... ARGS>
+  std::unique_ptr<T> create(ARGS&&... args) {
+    return std::make_unique<T>(std::forward<ARGS>(args)...);
+  }
+
  private:
   Context ctx_;
   std::unique_ptr<ast::Module> mod_;
@@ -110,11 +116,11 @@
 }
 
 TEST_F(VertexPullingTransformTest, Error_EntryPointWrongStage) {
-  auto func = std::make_unique<ast::Function>(
+  auto func = create<ast::Function>(
       "main", ast::VariableList{},
       ctx()->type_mgr().Get(std::make_unique<ast::type::VoidType>()));
-  func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kFragment, Source{}));
+  func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}));
   mod()->AddFunction(std::move(func));
 
   InitTransform({});
@@ -392,26 +398,26 @@
 
   ast::type::I32Type i32;
   {
-    auto vertex_index_var = std::make_unique<ast::DecoratedVariable>(
-        std::make_unique<ast::Variable>("custom_vertex_index",
-                                        ast::StorageClass::kInput, &i32));
+    auto vertex_index_var =
+        create<ast::DecoratedVariable>(create<ast::Variable>(
+            "custom_vertex_index", ast::StorageClass::kInput, &i32));
 
     ast::VariableDecorationList decorations;
-    decorations.push_back(std::make_unique<ast::BuiltinDecoration>(
-        ast::Builtin::kVertexIdx, Source{}));
+    decorations.push_back(
+        create<ast::BuiltinDecoration>(ast::Builtin::kVertexIdx, Source{}));
 
     vertex_index_var->set_decorations(std::move(decorations));
     mod()->AddGlobalVariable(std::move(vertex_index_var));
   }
 
   {
-    auto instance_index_var = std::make_unique<ast::DecoratedVariable>(
-        std::make_unique<ast::Variable>("custom_instance_index",
-                                        ast::StorageClass::kInput, &i32));
+    auto instance_index_var =
+        create<ast::DecoratedVariable>(create<ast::Variable>(
+            "custom_instance_index", ast::StorageClass::kInput, &i32));
 
     ast::VariableDecorationList decorations;
-    decorations.push_back(std::make_unique<ast::BuiltinDecoration>(
-        ast::Builtin::kInstanceIdx, Source{}));
+    decorations.push_back(
+        create<ast::BuiltinDecoration>(ast::Builtin::kInstanceIdx, Source{}));
 
     instance_index_var->set_decorations(std::move(decorations));
     mod()->AddGlobalVariable(std::move(instance_index_var));