inspector_test: 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: Ibb9f437b9cb8b9883e05d1a266fa69141dc200d0
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/32668
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/inspector/inspector_test.cc b/src/inspector/inspector_test.cc
index 9a1a4aa..da3848e 100644
--- a/src/inspector/inspector_test.cc
+++ b/src/inspector/inspector_test.cc
@@ -79,10 +79,10 @@
   /// @param name name of the function created
   /// @returns a function object
   std::unique_ptr<ast::Function> MakeEmptyBodyFunction(std::string name) {
-    auto body = std::make_unique<ast::BlockStatement>();
-    body->append(std::make_unique<ast::ReturnStatement>());
+    auto body = create<ast::BlockStatement>();
+    body->append(create<ast::ReturnStatement>());
     std::unique_ptr<ast::Function> func =
-        std::make_unique<ast::Function>(name, ast::VariableList(), void_type());
+        create<ast::Function>(name, ast::VariableList(), void_type());
     func->set_body(std::move(body));
     return func;
   }
@@ -93,14 +93,14 @@
   /// @returns a function object
   std::unique_ptr<ast::Function> MakeCallerBodyFunction(std::string caller,
                                                         std::string callee) {
-    auto body = std::make_unique<ast::BlockStatement>();
-    auto ident_expr = std::make_unique<ast::IdentifierExpression>(callee);
-    auto call_expr = std::make_unique<ast::CallExpression>(
-        std::move(ident_expr), ast::ExpressionList());
-    body->append(std::make_unique<ast::CallStatement>(std::move(call_expr)));
-    body->append(std::make_unique<ast::ReturnStatement>());
-    std::unique_ptr<ast::Function> func = std::make_unique<ast::Function>(
-        caller, ast::VariableList(), void_type());
+    auto body = create<ast::BlockStatement>();
+    auto ident_expr = create<ast::IdentifierExpression>(callee);
+    auto call_expr = create<ast::CallExpression>(std::move(ident_expr),
+                                                 ast::ExpressionList());
+    body->append(create<ast::CallStatement>(std::move(call_expr)));
+    body->append(create<ast::ReturnStatement>());
+    std::unique_ptr<ast::Function> func =
+        create<ast::Function>(caller, ast::VariableList(), void_type());
     func->set_body(std::move(body));
     return func;
   }
@@ -113,10 +113,10 @@
     for (auto inout : inout_vars) {
       std::string in, out;
       std::tie(in, out) = inout;
-      auto in_var = std::make_unique<ast::Variable>(
-          in, ast::StorageClass::kInput, u32_type());
-      auto out_var = std::make_unique<ast::Variable>(
-          out, ast::StorageClass::kOutput, u32_type());
+      auto in_var =
+          create<ast::Variable>(in, ast::StorageClass::kInput, u32_type());
+      auto out_var =
+          create<ast::Variable>(out, ast::StorageClass::kOutput, u32_type());
       mod()->AddGlobalVariable(std::move(in_var));
       mod()->AddGlobalVariable(std::move(out_var));
     }
@@ -130,17 +130,16 @@
   std::unique_ptr<ast::Function> MakeInOutVariableBodyFunction(
       std::string name,
       std::vector<std::tuple<std::string, std::string>> inout_vars) {
-    auto body = std::make_unique<ast::BlockStatement>();
+    auto body = create<ast::BlockStatement>();
     for (auto inout : inout_vars) {
       std::string in, out;
       std::tie(in, out) = inout;
-      body->append(std::make_unique<ast::AssignmentStatement>(
-          std::make_unique<ast::IdentifierExpression>(out),
-          std::make_unique<ast::IdentifierExpression>(in)));
+      body->append(create<ast::AssignmentStatement>(
+          create<ast::IdentifierExpression>(out),
+          create<ast::IdentifierExpression>(in)));
     }
-    body->append(std::make_unique<ast::ReturnStatement>());
-    auto func =
-        std::make_unique<ast::Function>(name, ast::VariableList(), void_type());
+    body->append(create<ast::ReturnStatement>());
+    auto func = create<ast::Function>(name, ast::VariableList(), void_type());
     func->set_body(std::move(body));
     return func;
   }
@@ -156,21 +155,20 @@
       std::string caller,
       std::string callee,
       std::vector<std::tuple<std::string, std::string>> inout_vars) {
-    auto body = std::make_unique<ast::BlockStatement>();
+    auto body = create<ast::BlockStatement>();
     for (auto inout : inout_vars) {
       std::string in, out;
       std::tie(in, out) = inout;
-      body->append(std::make_unique<ast::AssignmentStatement>(
-          std::make_unique<ast::IdentifierExpression>(out),
-          std::make_unique<ast::IdentifierExpression>(in)));
+      body->append(create<ast::AssignmentStatement>(
+          create<ast::IdentifierExpression>(out),
+          create<ast::IdentifierExpression>(in)));
     }
-    auto ident_expr = std::make_unique<ast::IdentifierExpression>(callee);
-    auto call_expr = std::make_unique<ast::CallExpression>(
-        std::move(ident_expr), ast::ExpressionList());
-    body->append(std::make_unique<ast::CallStatement>(std::move(call_expr)));
-    body->append(std::make_unique<ast::ReturnStatement>());
-    auto func = std::make_unique<ast::Function>(caller, ast::VariableList(),
-                                                void_type());
+    auto ident_expr = create<ast::IdentifierExpression>(callee);
+    auto call_expr = create<ast::CallExpression>(std::move(ident_expr),
+                                                 ast::ExpressionList());
+    body->append(create<ast::CallStatement>(std::move(call_expr)));
+    body->append(create<ast::ReturnStatement>());
+    auto func = create<ast::Function>(caller, ast::VariableList(), void_type());
     func->set_body(std::move(body));
     return func;
   }
@@ -186,15 +184,15 @@
                      uint32_t id,
                      ast::type::Type* type,
                      T* val) {
-    auto dvar = std::make_unique<ast::DecoratedVariable>(
-        std::make_unique<ast::Variable>(name, ast::StorageClass::kNone, type));
+    auto dvar = create<ast::DecoratedVariable>(
+        create<ast::Variable>(name, ast::StorageClass::kNone, type));
     dvar->set_is_const(true);
     ast::VariableDecorationList decos;
-    decos.push_back(std::make_unique<ast::ConstantIdDecoration>(id, Source{}));
+    decos.push_back(create<ast::ConstantIdDecoration>(id, Source{}));
     dvar->set_decorations(std::move(decos));
     if (val) {
-      dvar->set_constructor(std::make_unique<ast::ScalarConstructorExpression>(
-          MakeLiteral(type, val)));
+      dvar->set_constructor(
+          create<ast::ScalarConstructorExpression>(MakeLiteral(type, val)));
     }
     mod()->AddGlobalVariable(std::move(dvar));
   }
@@ -203,7 +201,7 @@
   /// @param val scalar value for the literal to contain
   /// @returns a Literal of the expected type and value
   std::unique_ptr<ast::Literal> MakeLiteral(ast::type::Type* type, bool* val) {
-    return std::make_unique<ast::BoolLiteral>(type, *val);
+    return create<ast::BoolLiteral>(type, *val);
   }
 
   /// @param type AST type of the literal, must resolve to UIntLiteral
@@ -211,7 +209,7 @@
   /// @returns a Literal of the expected type and value
   std::unique_ptr<ast::Literal> MakeLiteral(ast::type::Type* type,
                                             uint32_t* val) {
-    return std::make_unique<ast::UintLiteral>(type, *val);
+    return create<ast::UintLiteral>(type, *val);
   }
 
   /// @param type AST type of the literal, must resolve to IntLiteral
@@ -219,14 +217,14 @@
   /// @returns a Literal of the expected type and value
   std::unique_ptr<ast::Literal> MakeLiteral(ast::type::Type* type,
                                             int32_t* val) {
-    return std::make_unique<ast::SintLiteral>(type, *val);
+    return create<ast::SintLiteral>(type, *val);
   }
 
   /// @param type AST type of the literal, must resolve to FloattLiteral
   /// @param val scalar value for the literal to contain
   /// @returns a Literal of the expected type and value
   std::unique_ptr<ast::Literal> MakeLiteral(ast::type::Type* type, float* val) {
-    return std::make_unique<ast::FloatLiteral>(type, *val);
+    return create<ast::FloatLiteral>(type, *val);
   }
 
   /// @param vec Vector of strings to be searched
@@ -267,20 +265,19 @@
       std::tie(type, offset) = member_info;
 
       ast::StructMemberDecorationList deco;
-      deco.push_back(std::make_unique<ast::StructMemberOffsetDecoration>(
-          offset, Source{}));
+      deco.push_back(
+          create<ast::StructMemberOffsetDecoration>(offset, Source{}));
 
-      members.push_back(std::make_unique<ast::StructMember>(
+      members.push_back(create<ast::StructMember>(
           StructMemberName(members.size(), type), type, std::move(deco)));
     }
 
     ast::StructDecorationList decos;
     if (is_block) {
-      decos.push_back(std::make_unique<ast::StructBlockDecoration>(Source{}));
+      decos.push_back(create<ast::StructBlockDecoration>(Source{}));
     }
 
-    auto str =
-        std::make_unique<ast::Struct>(std::move(decos), std::move(members));
+    auto str = create<ast::Struct>(std::move(decos), std::move(members));
 
     return std::make_unique<ast::type::StructType>(name, std::move(str));
   }
@@ -350,13 +347,12 @@
                   ast::StorageClass storage_class,
                   uint32_t set,
                   uint32_t binding) {
-    auto var = std::make_unique<ast::DecoratedVariable>(
-        std::make_unique<ast::Variable>(name, storage_class, type));
+    auto var = create<ast::DecoratedVariable>(
+        create<ast::Variable>(name, storage_class, type));
     ast::VariableDecorationList decorations;
 
-    decorations.push_back(
-        std::make_unique<ast::BindingDecoration>(binding, Source{}));
-    decorations.push_back(std::make_unique<ast::SetDecoration>(set, Source{}));
+    decorations.push_back(create<ast::BindingDecoration>(binding, Source{}));
+    decorations.push_back(create<ast::SetDecoration>(set, Source{}));
     var->set_decorations(std::move(decorations));
 
     mod()->AddGlobalVariable(std::move(var));
@@ -395,16 +391,15 @@
       std::string func_name,
       std::string struct_name,
       std::vector<std::tuple<size_t, ast::type::Type*>> members) {
-    auto body = std::make_unique<ast::BlockStatement>();
+    auto body = create<ast::BlockStatement>();
 
     for (auto member : members) {
       size_t member_idx;
       ast::type::Type* member_type;
       std::tie(member_idx, member_type) = member;
       std::string member_name = StructMemberName(member_idx, member_type);
-      body->append(std::make_unique<ast::VariableDeclStatement>(
-          std::make_unique<ast::Variable>(
-              "local" + member_name, ast::StorageClass::kNone, member_type)));
+      body->append(create<ast::VariableDeclStatement>(create<ast::Variable>(
+          "local" + member_name, ast::StorageClass::kNone, member_type)));
     }
 
     for (auto member : members) {
@@ -412,16 +407,16 @@
       ast::type::Type* member_type;
       std::tie(member_idx, member_type) = member;
       std::string member_name = StructMemberName(member_idx, member_type);
-      body->append(std::make_unique<ast::AssignmentStatement>(
-          std::make_unique<ast::IdentifierExpression>("local" + member_name),
-          std::make_unique<ast::MemberAccessorExpression>(
-              std::make_unique<ast::IdentifierExpression>(struct_name),
-              std::make_unique<ast::IdentifierExpression>(member_name))));
+      body->append(create<ast::AssignmentStatement>(
+          create<ast::IdentifierExpression>("local" + member_name),
+          create<ast::MemberAccessorExpression>(
+              create<ast::IdentifierExpression>(struct_name),
+              create<ast::IdentifierExpression>(member_name))));
     }
 
-    body->append(std::make_unique<ast::ReturnStatement>());
-    auto func = std::make_unique<ast::Function>(func_name, ast::VariableList(),
-                                                void_type());
+    body->append(create<ast::ReturnStatement>());
+    auto func =
+        create<ast::Function>(func_name, ast::VariableList(), void_type());
     func->set_body(std::move(body));
     return func;
   }
@@ -499,16 +494,16 @@
   }
 
   void AddGlobalVariable(const std::string& name, ast::type::Type* type) {
-    mod()->AddGlobalVariable(std::make_unique<ast::Variable>(
-        name, ast::StorageClass::kUniformConstant, type));
+    mod()->AddGlobalVariable(
+        create<ast::Variable>(name, ast::StorageClass::kUniformConstant, type));
   }
 
   /// Adds a depth texture variable to the module
   /// @param name the name of the variable
   /// @param type the type to use
   void AddDepthTexture(const std::string& name, ast::type::Type* type) {
-    mod()->AddGlobalVariable(std::make_unique<ast::Variable>(
-        name, ast::StorageClass::kUniformConstant, type));
+    mod()->AddGlobalVariable(
+        create<ast::Variable>(name, ast::StorageClass::kUniformConstant, type));
   }
 
   /// Generates a function that references a specific sampler variable
@@ -525,31 +520,27 @@
       ast::type::Type* base_type) {
     std::string result_name = "sampler_result";
 
-    auto body = std::make_unique<ast::BlockStatement>();
+    auto body = create<ast::BlockStatement>();
 
-    auto call_result = std::make_unique<ast::Variable>(
+    auto call_result = create<ast::Variable>(
         "sampler_result", ast::StorageClass::kFunction, vec_type(base_type, 4));
-    body->append(
-        std::make_unique<ast::VariableDeclStatement>(std::move(call_result)));
+    body->append(create<ast::VariableDeclStatement>(std::move(call_result)));
 
     ast::ExpressionList call_params;
-    call_params.push_back(
-        std::make_unique<ast::IdentifierExpression>(texture_name));
-    call_params.push_back(
-        std::make_unique<ast::IdentifierExpression>(sampler_name));
-    call_params.push_back(
-        std::make_unique<ast::IdentifierExpression>(coords_name));
-    auto call_expr = std::make_unique<ast::CallExpression>(
-        std::make_unique<ast::IdentifierExpression>("textureSample"),
+    call_params.push_back(create<ast::IdentifierExpression>(texture_name));
+    call_params.push_back(create<ast::IdentifierExpression>(sampler_name));
+    call_params.push_back(create<ast::IdentifierExpression>(coords_name));
+    auto call_expr = create<ast::CallExpression>(
+        create<ast::IdentifierExpression>("textureSample"),
         std::move(call_params));
 
-    body->append(std::make_unique<ast::AssignmentStatement>(
-        std::make_unique<ast::IdentifierExpression>("sampler_result"),
+    body->append(create<ast::AssignmentStatement>(
+        create<ast::IdentifierExpression>("sampler_result"),
         std::move(call_expr)));
-    body->append(std::make_unique<ast::ReturnStatement>());
+    body->append(create<ast::ReturnStatement>());
 
-    auto func = std::make_unique<ast::Function>(func_name, ast::VariableList(),
-                                                void_type());
+    auto func =
+        create<ast::Function>(func_name, ast::VariableList(), void_type());
     func->set_body(std::move(body));
     return func;
   }
@@ -571,33 +562,28 @@
       ast::type::Type* base_type) {
     std::string result_name = "sampler_result";
 
-    auto body = std::make_unique<ast::BlockStatement>();
+    auto body = create<ast::BlockStatement>();
 
-    auto call_result = std::make_unique<ast::Variable>(
+    auto call_result = create<ast::Variable>(
         "sampler_result", ast::StorageClass::kFunction, base_type);
-    body->append(
-        std::make_unique<ast::VariableDeclStatement>(std::move(call_result)));
+    body->append(create<ast::VariableDeclStatement>(std::move(call_result)));
 
     ast::ExpressionList call_params;
-    call_params.push_back(
-        std::make_unique<ast::IdentifierExpression>(texture_name));
-    call_params.push_back(
-        std::make_unique<ast::IdentifierExpression>(sampler_name));
-    call_params.push_back(
-        std::make_unique<ast::IdentifierExpression>(coords_name));
-    call_params.push_back(
-        std::make_unique<ast::IdentifierExpression>(depth_name));
-    auto call_expr = std::make_unique<ast::CallExpression>(
-        std::make_unique<ast::IdentifierExpression>("textureSampleCompare"),
+    call_params.push_back(create<ast::IdentifierExpression>(texture_name));
+    call_params.push_back(create<ast::IdentifierExpression>(sampler_name));
+    call_params.push_back(create<ast::IdentifierExpression>(coords_name));
+    call_params.push_back(create<ast::IdentifierExpression>(depth_name));
+    auto call_expr = create<ast::CallExpression>(
+        create<ast::IdentifierExpression>("textureSampleCompare"),
         std::move(call_params));
 
-    body->append(std::make_unique<ast::AssignmentStatement>(
-        std::make_unique<ast::IdentifierExpression>("sampler_result"),
+    body->append(create<ast::AssignmentStatement>(
+        create<ast::IdentifierExpression>("sampler_result"),
         std::move(call_expr)));
-    body->append(std::make_unique<ast::ReturnStatement>());
+    body->append(create<ast::ReturnStatement>());
 
-    auto func = std::make_unique<ast::Function>(func_name, ast::VariableList(),
-                                                void_type());
+    auto func =
+        create<ast::Function>(func_name, ast::VariableList(), void_type());
     func->set_body(std::move(body));
     return func;
   }
@@ -650,7 +636,7 @@
       array_type_memo_[count] =
           std::make_unique<ast::type::ArrayType>(u32_type(), count);
       ast::ArrayDecorationList decos;
-      decos.push_back(std::make_unique<ast::StrideDecoration>(4, Source{}));
+      decos.push_back(create<ast::StrideDecoration>(4, Source{}));
       array_type_memo_[count]->set_decorations(std::move(decos));
     }
     return array_type_memo_[count].get();
@@ -669,6 +655,13 @@
     return &comparison_sampler_type_;
   }
 
+  /// @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_;
@@ -743,8 +736,8 @@
 
 TEST_F(InspectorGetEntryPointTest, OneEntryPoint) {
   auto foo = MakeEmptyBodyFunction("foo");
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   auto result = inspector()->GetEntryPoints();
@@ -758,13 +751,13 @@
 
 TEST_F(InspectorGetEntryPointTest, MultipleEntryPoints) {
   auto foo = MakeEmptyBodyFunction("foo");
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   auto bar = MakeEmptyBodyFunction("bar");
-  bar->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kCompute, Source{}));
+  bar->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}));
   mod()->AddFunction(std::move(bar));
 
   auto result = inspector()->GetEntryPoints();
@@ -784,13 +777,13 @@
   mod()->AddFunction(std::move(func));
 
   auto foo = MakeCallerBodyFunction("foo", "func");
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   auto bar = MakeCallerBodyFunction("bar", "func");
-  bar->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kFragment, Source{}));
+  bar->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}));
   mod()->AddFunction(std::move(bar));
 
   auto result = inspector()->GetEntryPoints();
@@ -807,8 +800,8 @@
 
 TEST_F(InspectorGetEntryPointTest, DefaultWorkgroupSize) {
   auto foo = MakeCallerBodyFunction("foo", "func");
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   auto result = inspector()->GetEntryPoints();
@@ -824,10 +817,9 @@
 
 TEST_F(InspectorGetEntryPointTest, NonDefaultWorkgroupSize) {
   auto foo = MakeEmptyBodyFunction("foo");
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kCompute, Source{}));
   foo->add_decoration(
-      std::make_unique<ast::WorkgroupDecoration>(8u, 2u, 1u, Source{}));
+      create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}));
+  foo->add_decoration(create<ast::WorkgroupDecoration>(8u, 2u, 1u, Source{}));
   mod()->AddFunction(std::move(foo));
 
   auto result = inspector()->GetEntryPoints();
@@ -846,8 +838,8 @@
   mod()->AddFunction(std::move(func));
 
   auto foo = MakeCallerBodyFunction("foo", "func");
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   auto result = inspector()->GetEntryPoints();
@@ -862,8 +854,8 @@
   AddInOutVariables({{"in_var", "out_var"}});
 
   auto foo = MakeInOutVariableBodyFunction("foo", {{"in_var", "out_var"}});
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -886,8 +878,8 @@
   mod()->AddFunction(std::move(func));
 
   auto foo = MakeCallerBodyFunction("foo", "func");
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -911,8 +903,8 @@
 
   auto foo = MakeInOutVariableCallerBodyFunction("foo", "func",
                                                  {{"in_var", "out_var"}});
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -933,8 +925,8 @@
 
   auto foo = MakeInOutVariableBodyFunction(
       "foo", {{"in_var", "out_var"}, {"in2_var", "out2_var"}});
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -960,8 +952,8 @@
   mod()->AddFunction(std::move(func));
 
   auto foo = MakeCallerBodyFunction("foo", "func");
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -983,13 +975,13 @@
   AddInOutVariables({{"in_var", "out_var"}, {"in2_var", "out2_var"}});
 
   auto foo = MakeInOutVariableBodyFunction("foo", {{"in_var", "out2_var"}});
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   auto bar = MakeInOutVariableBodyFunction("bar", {{"in2_var", "out_var"}});
-  bar->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kCompute, Source{}));
+  bar->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}));
   mod()->AddFunction(std::move(bar));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1022,13 +1014,13 @@
 
   auto foo = MakeInOutVariableCallerBodyFunction("foo", "func",
                                                  {{"in_var", "out_var"}});
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   auto bar = MakeCallerBodyFunction("bar", "func");
-  bar->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kCompute, Source{}));
+  bar->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}));
   mod()->AddFunction(std::move(bar));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1079,8 +1071,8 @@
 // through
 TEST_F(InspectorGetRemappedNameForEntryPointTest, DISABLED_OneEntryPoint) {
   auto foo = MakeEmptyBodyFunction("foo");
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   auto result = inspector()->GetRemappedNameForEntryPoint("foo");
@@ -1094,13 +1086,13 @@
 TEST_F(InspectorGetRemappedNameForEntryPointTest,
        DISABLED_MultipleEntryPoints) {
   auto foo = MakeEmptyBodyFunction("foo");
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   auto bar = MakeEmptyBodyFunction("bar");
-  bar->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kCompute, Source{}));
+  bar->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}));
   mod()->AddFunction(std::move(bar));
 
   {
@@ -1222,8 +1214,8 @@
   mod()->AddFunction(std::move(ub_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "ub_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1236,17 +1228,15 @@
 TEST_F(InspectorGetUniformBufferResourceBindingsTest, MissingBlockDeco) {
   ast::StructMemberList members;
   ast::StructMemberDecorationList deco;
-  deco.push_back(
-      std::make_unique<ast::StructMemberOffsetDecoration>(0, Source{}));
+  deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
 
-  members.push_back(std::make_unique<ast::StructMember>(
-      StructMemberName(members.size(), i32_type()), i32_type(),
-      std::move(deco)));
+  members.push_back(
+      create<ast::StructMember>(StructMemberName(members.size(), i32_type()),
+                                i32_type(), std::move(deco)));
 
   ast::StructDecorationList decos;
 
-  auto str =
-      std::make_unique<ast::Struct>(std::move(decos), std::move(members));
+  auto str = create<ast::Struct>(std::move(decos), std::move(members));
   auto foo_type =
       std::make_unique<ast::type::StructType>("foo_type", std::move(str));
 
@@ -1257,8 +1247,8 @@
   mod()->AddFunction(std::move(ub_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "ub_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1280,8 +1270,8 @@
   mod()->AddFunction(std::move(ub_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "ub_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1307,8 +1297,8 @@
   mod()->AddFunction(std::move(ub_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "ub_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1342,25 +1332,25 @@
   AddReferenceFunc("ub_bar_func", "ub_bar");
   AddReferenceFunc("ub_baz_func", "ub_baz");
 
-  auto AddFuncCall = [](ast::BlockStatement* body, const std::string& callee) {
-    auto ident_expr = std::make_unique<ast::IdentifierExpression>(callee);
-    auto call_expr = std::make_unique<ast::CallExpression>(
-        std::move(ident_expr), ast::ExpressionList());
-    body->append(std::make_unique<ast::CallStatement>(std::move(call_expr)));
+  auto AddFuncCall = [&](ast::BlockStatement* body, const std::string& callee) {
+    auto ident_expr = create<ast::IdentifierExpression>(callee);
+    auto call_expr = create<ast::CallExpression>(std::move(ident_expr),
+                                                 ast::ExpressionList());
+    body->append(create<ast::CallStatement>(std::move(call_expr)));
   };
-  auto body = std::make_unique<ast::BlockStatement>();
+  auto body = create<ast::BlockStatement>();
 
   AddFuncCall(body.get(), "ub_foo_func");
   AddFuncCall(body.get(), "ub_bar_func");
   AddFuncCall(body.get(), "ub_baz_func");
 
-  body->append(std::make_unique<ast::ReturnStatement>());
-  std::unique_ptr<ast::Function> func = std::make_unique<ast::Function>(
-      "ep_func", ast::VariableList(), void_type());
+  body->append(create<ast::ReturnStatement>());
+  std::unique_ptr<ast::Function> func =
+      create<ast::Function>("ep_func", ast::VariableList(), void_type());
   func->set_body(std::move(body));
 
-  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));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1394,8 +1384,8 @@
   mod()->AddFunction(std::move(ub_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "ub_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1421,8 +1411,8 @@
   mod()->AddFunction(std::move(sb_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "sb_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1448,8 +1438,8 @@
   mod()->AddFunction(std::move(sb_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "sb_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1483,25 +1473,25 @@
   AddReferenceFunc("sb_bar_func", "sb_bar");
   AddReferenceFunc("sb_baz_func", "sb_baz");
 
-  auto AddFuncCall = [](ast::BlockStatement* body, const std::string& callee) {
-    auto ident_expr = std::make_unique<ast::IdentifierExpression>(callee);
-    auto call_expr = std::make_unique<ast::CallExpression>(
-        std::move(ident_expr), ast::ExpressionList());
-    body->append(std::make_unique<ast::CallStatement>(std::move(call_expr)));
+  auto AddFuncCall = [&](ast::BlockStatement* body, const std::string& callee) {
+    auto ident_expr = create<ast::IdentifierExpression>(callee);
+    auto call_expr = create<ast::CallExpression>(std::move(ident_expr),
+                                                 ast::ExpressionList());
+    body->append(create<ast::CallStatement>(std::move(call_expr)));
   };
-  auto body = std::make_unique<ast::BlockStatement>();
+  auto body = create<ast::BlockStatement>();
 
   AddFuncCall(body.get(), "sb_foo_func");
   AddFuncCall(body.get(), "sb_bar_func");
   AddFuncCall(body.get(), "sb_baz_func");
 
-  body->append(std::make_unique<ast::ReturnStatement>());
-  std::unique_ptr<ast::Function> func = std::make_unique<ast::Function>(
-      "ep_func", ast::VariableList(), void_type());
+  body->append(create<ast::ReturnStatement>());
+  std::unique_ptr<ast::Function> func =
+      create<ast::Function>("ep_func", ast::VariableList(), void_type());
   func->set_body(std::move(body));
 
-  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));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1535,8 +1525,8 @@
   mod()->AddFunction(std::move(sb_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "sb_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1562,8 +1552,8 @@
   mod()->AddFunction(std::move(sb_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "sb_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1589,8 +1579,8 @@
   mod()->AddFunction(std::move(sb_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "sb_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1612,8 +1602,8 @@
   mod()->AddFunction(std::move(sb_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "sb_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1649,25 +1639,25 @@
   AddReferenceFunc("sb_bar_func", "sb_bar");
   AddReferenceFunc("sb_baz_func", "sb_baz");
 
-  auto AddFuncCall = [](ast::BlockStatement* body, const std::string& callee) {
-    auto ident_expr = std::make_unique<ast::IdentifierExpression>(callee);
-    auto call_expr = std::make_unique<ast::CallExpression>(
-        std::move(ident_expr), ast::ExpressionList());
-    body->append(std::make_unique<ast::CallStatement>(std::move(call_expr)));
+  auto AddFuncCall = [&](ast::BlockStatement* body, const std::string& callee) {
+    auto ident_expr = create<ast::IdentifierExpression>(callee);
+    auto call_expr = create<ast::CallExpression>(std::move(ident_expr),
+                                                 ast::ExpressionList());
+    body->append(create<ast::CallStatement>(std::move(call_expr)));
   };
-  auto body = std::make_unique<ast::BlockStatement>();
+  auto body = create<ast::BlockStatement>();
 
   AddFuncCall(body.get(), "sb_foo_func");
   AddFuncCall(body.get(), "sb_bar_func");
   AddFuncCall(body.get(), "sb_baz_func");
 
-  body->append(std::make_unique<ast::ReturnStatement>());
-  std::unique_ptr<ast::Function> func = std::make_unique<ast::Function>(
-      "ep_func", ast::VariableList(), void_type());
+  body->append(create<ast::ReturnStatement>());
+  std::unique_ptr<ast::Function> func =
+      create<ast::Function>("ep_func", ast::VariableList(), void_type());
   func->set_body(std::move(body));
 
-  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));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1702,8 +1692,8 @@
   mod()->AddFunction(std::move(sb_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "sb_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1731,8 +1721,8 @@
   mod()->AddFunction(std::move(sb_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "sb_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1759,8 +1749,8 @@
   mod()->AddFunction(std::move(sb_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "sb_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1780,8 +1770,8 @@
 
   auto func = MakeSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords", f32_type());
-  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));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1796,8 +1786,8 @@
 
 TEST_F(InspectorGetSamplerResourceBindingsTest, NoSampler) {
   auto func = MakeEmptyBodyFunction("ep_func");
-  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));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1820,8 +1810,8 @@
   mod()->AddFunction(std::move(foo_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "foo_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1843,8 +1833,8 @@
 
   auto func = MakeSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords", f32_type());
-  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));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1864,8 +1854,8 @@
   auto func = MakeComparisonSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords", "foo_depth",
       f32_type());
-  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));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1887,8 +1877,8 @@
   auto func = MakeComparisonSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords", "foo_depth",
       f32_type());
-  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));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1903,8 +1893,8 @@
 
 TEST_F(InspectorGetComparisonSamplerResourceBindingsTest, NoSampler) {
   auto func = MakeEmptyBodyFunction("ep_func");
-  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));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1929,8 +1919,8 @@
   mod()->AddFunction(std::move(foo_func));
 
   auto ep_func = MakeCallerBodyFunction("ep_func", "foo_func");
-  ep_func->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  ep_func->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(ep_func));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1954,8 +1944,8 @@
   auto func = MakeComparisonSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords", "foo_depth",
       f32_type());
-  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));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1973,8 +1963,8 @@
 
   auto func = MakeSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords", f32_type());
-  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));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -1987,8 +1977,8 @@
 
 TEST_F(InspectorGetSampledTextureResourceBindingsTest, Empty) {
   auto foo = MakeEmptyBodyFunction("foo");
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   auto result = inspector()->GetSampledTextureResourceBindings("foo");
@@ -2009,8 +1999,8 @@
   auto func = MakeSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords",
       GetBaseType(GetParam().sampled_kind));
-  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));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
@@ -2116,8 +2106,8 @@
 
 TEST_F(InspectorGetMultisampledTextureResourceBindingsTest, Empty) {
   auto foo = MakeEmptyBodyFunction("foo");
-  foo->add_decoration(std::make_unique<ast::StageDecoration>(
-      ast::PipelineStage::kVertex, Source{}));
+  foo->add_decoration(
+      create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(std::move(foo));
 
   auto result = inspector()->GetSampledTextureResourceBindings("foo");
@@ -2139,8 +2129,8 @@
   auto func = MakeSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords",
       GetBaseType(GetParam().sampled_kind));
-  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));
 
   ASSERT_TRUE(td()->Determine()) << td()->error();