Move all Source constructor params to be the first

This consistency can be utilized by the ast::Builder to inject the source parameter if it isn't provided.

Bug: tint:396
Bug: tint:390
Change-Id: I2f19002131e79daae799b8cbe918eb192d6bfc75
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/35503
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/access_decoration.cc b/src/ast/access_decoration.cc
index 6d5e726..2346357 100644
--- a/src/ast/access_decoration.cc
+++ b/src/ast/access_decoration.cc
@@ -22,7 +22,7 @@
 namespace tint {
 namespace ast {
 
-AccessDecoration::AccessDecoration(AccessControl val, const Source& source)
+AccessDecoration::AccessDecoration(const Source& source, AccessControl val)
     : Base(source), value_(val) {}
 
 AccessDecoration::~AccessDecoration() = default;
@@ -33,7 +33,7 @@
 }
 
 AccessDecoration* AccessDecoration::Clone(CloneContext* ctx) const {
-  return ctx->mod->create<AccessDecoration>(value_, ctx->Clone(source()));
+  return ctx->mod->create<AccessDecoration>(ctx->Clone(source()), value_);
 }
 
 }  // namespace ast
diff --git a/src/ast/access_decoration.h b/src/ast/access_decoration.h
index 07d437e..dcf2d95 100644
--- a/src/ast/access_decoration.h
+++ b/src/ast/access_decoration.h
@@ -27,9 +27,9 @@
 class AccessDecoration : public Castable<AccessDecoration, TypeDecoration> {
  public:
   /// constructor
-  /// @param value the access value
   /// @param source the source of this decoration
-  explicit AccessDecoration(AccessControl value, const Source& source);
+  /// @param value the access value
+  explicit AccessDecoration(const Source& source, AccessControl value);
   ~AccessDecoration() override;
 
   /// @returns the access control value
diff --git a/src/ast/binding_decoration.cc b/src/ast/binding_decoration.cc
index 127e600..13d48d7 100644
--- a/src/ast/binding_decoration.cc
+++ b/src/ast/binding_decoration.cc
@@ -22,7 +22,7 @@
 namespace tint {
 namespace ast {
 
-BindingDecoration::BindingDecoration(uint32_t val, const Source& source)
+BindingDecoration::BindingDecoration(const Source& source, uint32_t val)
     : Base(source), value_(val) {}
 
 BindingDecoration::~BindingDecoration() = default;
@@ -33,7 +33,7 @@
 }
 
 BindingDecoration* BindingDecoration::Clone(CloneContext* ctx) const {
-  return ctx->mod->create<BindingDecoration>(value_, ctx->Clone(source()));
+  return ctx->mod->create<BindingDecoration>(ctx->Clone(source()), value_);
 }
 
 }  // namespace ast
diff --git a/src/ast/binding_decoration.h b/src/ast/binding_decoration.h
index 0299ddc..ae4cc45 100644
--- a/src/ast/binding_decoration.h
+++ b/src/ast/binding_decoration.h
@@ -29,7 +29,7 @@
   /// constructor
   /// @param value the binding value
   /// @param source the source of this decoration
-  BindingDecoration(uint32_t value, const Source& source);
+  BindingDecoration(const Source& source, uint32_t value);
   ~BindingDecoration() override;
 
   /// @returns the binding value
diff --git a/src/ast/binding_decoration_test.cc b/src/ast/binding_decoration_test.cc
index 54e6f74..5824236 100644
--- a/src/ast/binding_decoration_test.cc
+++ b/src/ast/binding_decoration_test.cc
@@ -24,12 +24,12 @@
 using BindingDecorationTest = TestHelper;
 
 TEST_F(BindingDecorationTest, Creation) {
-  BindingDecoration d{2, Source{}};
+  BindingDecoration d{Source{}, 2};
   EXPECT_EQ(2u, d.value());
 }
 
 TEST_F(BindingDecorationTest, Is) {
-  BindingDecoration bd{2, Source{}};
+  BindingDecoration bd{Source{}, 2};
   Decoration* d = &bd;
   EXPECT_TRUE(d->Is<BindingDecoration>());
   EXPECT_FALSE(d->Is<BuiltinDecoration>());
@@ -39,7 +39,7 @@
 }
 
 TEST_F(BindingDecorationTest, ToStr) {
-  BindingDecoration d{2, Source{}};
+  BindingDecoration d{Source{}, 2};
   std::ostringstream out;
   d.to_str(out, 0);
   EXPECT_EQ(out.str(), R"(BindingDecoration{2}
diff --git a/src/ast/builtin_decoration.cc b/src/ast/builtin_decoration.cc
index 051761c..d7abdbe 100644
--- a/src/ast/builtin_decoration.cc
+++ b/src/ast/builtin_decoration.cc
@@ -22,7 +22,7 @@
 namespace tint {
 namespace ast {
 
-BuiltinDecoration::BuiltinDecoration(Builtin builtin, const Source& source)
+BuiltinDecoration::BuiltinDecoration(const Source& source, Builtin builtin)
     : Base(source), builtin_(builtin) {}
 
 BuiltinDecoration::~BuiltinDecoration() = default;
@@ -33,7 +33,7 @@
 }
 
 BuiltinDecoration* BuiltinDecoration::Clone(CloneContext* ctx) const {
-  return ctx->mod->create<BuiltinDecoration>(builtin_, ctx->Clone(source()));
+  return ctx->mod->create<BuiltinDecoration>(ctx->Clone(source()), builtin_);
 }
 
 }  // namespace ast
diff --git a/src/ast/builtin_decoration.h b/src/ast/builtin_decoration.h
index c907f69..5a1419b 100644
--- a/src/ast/builtin_decoration.h
+++ b/src/ast/builtin_decoration.h
@@ -26,9 +26,9 @@
     : public Castable<BuiltinDecoration, VariableDecoration> {
  public:
   /// constructor
-  /// @param builtin the builtin value
   /// @param source the source of this decoration
-  BuiltinDecoration(Builtin builtin, const Source& source);
+  /// @param builtin the builtin value
+  BuiltinDecoration(const Source& source, Builtin builtin);
   ~BuiltinDecoration() override;
 
   /// @returns the builtin value
diff --git a/src/ast/builtin_decoration_test.cc b/src/ast/builtin_decoration_test.cc
index 3122651..0618f65 100644
--- a/src/ast/builtin_decoration_test.cc
+++ b/src/ast/builtin_decoration_test.cc
@@ -24,12 +24,12 @@
 using BuiltinDecorationTest = TestHelper;
 
 TEST_F(BuiltinDecorationTest, Creation) {
-  BuiltinDecoration d{Builtin::kFragDepth, Source{}};
+  BuiltinDecoration d{Source{}, Builtin::kFragDepth};
   EXPECT_EQ(Builtin::kFragDepth, d.value());
 }
 
 TEST_F(BuiltinDecorationTest, Is) {
-  BuiltinDecoration bd{Builtin::kFragDepth, Source{}};
+  BuiltinDecoration bd{Source{}, Builtin::kFragDepth};
   Decoration* d = &bd;
   EXPECT_FALSE(d->Is<BindingDecoration>());
   EXPECT_TRUE(d->Is<BuiltinDecoration>());
@@ -39,7 +39,7 @@
 }
 
 TEST_F(BuiltinDecorationTest, ToStr) {
-  BuiltinDecoration d{Builtin::kFragDepth, Source{}};
+  BuiltinDecoration d{Source{}, Builtin::kFragDepth};
   std::ostringstream out;
   d.to_str(out, 0);
   EXPECT_EQ(out.str(), R"(BuiltinDecoration{frag_depth}
diff --git a/src/ast/constant_id_decoration.cc b/src/ast/constant_id_decoration.cc
index dbdd8ff..840a30d 100644
--- a/src/ast/constant_id_decoration.cc
+++ b/src/ast/constant_id_decoration.cc
@@ -22,7 +22,7 @@
 namespace tint {
 namespace ast {
 
-ConstantIdDecoration::ConstantIdDecoration(uint32_t val, const Source& source)
+ConstantIdDecoration::ConstantIdDecoration(const Source& source, uint32_t val)
     : Base(source), value_(val) {}
 
 ConstantIdDecoration::~ConstantIdDecoration() = default;
@@ -33,7 +33,7 @@
 }
 
 ConstantIdDecoration* ConstantIdDecoration::Clone(CloneContext* ctx) const {
-  return ctx->mod->create<ConstantIdDecoration>(value_, ctx->Clone(source()));
+  return ctx->mod->create<ConstantIdDecoration>(ctx->Clone(source()), value_);
 }
 
 }  // namespace ast
diff --git a/src/ast/constant_id_decoration.h b/src/ast/constant_id_decoration.h
index d683e2a..bb990ae 100644
--- a/src/ast/constant_id_decoration.h
+++ b/src/ast/constant_id_decoration.h
@@ -26,9 +26,9 @@
     : public Castable<ConstantIdDecoration, VariableDecoration> {
  public:
   /// constructor
-  /// @param val the constant_id value
   /// @param source the source of this decoration
-  ConstantIdDecoration(uint32_t val, const Source& source);
+  /// @param val the constant_id value
+  ConstantIdDecoration(const Source& source, uint32_t val);
   ~ConstantIdDecoration() override;
 
   /// @returns the constant id value
diff --git a/src/ast/constant_id_decoration_test.cc b/src/ast/constant_id_decoration_test.cc
index 28f77ee..493c6da 100644
--- a/src/ast/constant_id_decoration_test.cc
+++ b/src/ast/constant_id_decoration_test.cc
@@ -23,12 +23,12 @@
 using ConstantIdDecorationTest = TestHelper;
 
 TEST_F(ConstantIdDecorationTest, Creation) {
-  ConstantIdDecoration d{12, Source{}};
+  ConstantIdDecoration d{Source{}, 12};
   EXPECT_EQ(12u, d.value());
 }
 
 TEST_F(ConstantIdDecorationTest, Is) {
-  ConstantIdDecoration cd{27, Source{}};
+  ConstantIdDecoration cd{Source{}, 27};
   Decoration* d = &cd;
   EXPECT_FALSE(d->Is<BindingDecoration>());
   EXPECT_FALSE(d->Is<BuiltinDecoration>());
@@ -38,7 +38,7 @@
 }
 
 TEST_F(ConstantIdDecorationTest, ToStr) {
-  ConstantIdDecoration d{1200, Source{}};
+  ConstantIdDecoration d{Source{}, 1200};
   std::ostringstream out;
   d.to_str(out, 0);
   EXPECT_EQ(out.str(), R"(ConstantIdDecoration{1200}
diff --git a/src/ast/decoration_test.cc b/src/ast/decoration_test.cc
index f3feae8..8ec0a01 100644
--- a/src/ast/decoration_test.cc
+++ b/src/ast/decoration_test.cc
@@ -43,21 +43,21 @@
 using DecorationTest = TestHelper;
 
 TEST_F(DecorationTest, AsCorrectType) {
-  auto* decoration = create<ConstantIdDecoration>(1, Source{});
+  auto* decoration = create<ConstantIdDecoration>(Source{}, 1);
   auto* upcast = static_cast<Decoration*>(decoration);
   auto* downcast = As<VariableDecoration>(upcast);
   EXPECT_EQ(decoration, downcast);
 }
 
 TEST_F(DecorationTest, AsIncorrectType) {
-  auto* decoration = create<ConstantIdDecoration>(1, Source{});
+  auto* decoration = create<ConstantIdDecoration>(Source{}, 1);
   auto* upcast = static_cast<Decoration*>(decoration);
   auto* downcast = As<ArrayDecoration>(upcast);
   EXPECT_EQ(nullptr, downcast);
 }
 
 TEST_F(DecorationTest, Is) {
-  Decoration* decoration = create<ConstantIdDecoration>(1, Source{});
+  Decoration* decoration = create<ConstantIdDecoration>(Source{}, 1);
   EXPECT_TRUE(decoration->Is<VariableDecoration>());
   EXPECT_FALSE(decoration->Is<ArrayDecoration>());
 }
diff --git a/src/ast/function_test.cc b/src/ast/function_test.cc
index 546e969..0d9f645 100644
--- a/src/ast/function_test.cc
+++ b/src/ast/function_test.cc
@@ -107,25 +107,25 @@
   auto* loc1 = create<Variable>(Source{}, "loc1", StorageClass::kInput, &i32,
                                 false, nullptr,
                                 ast::VariableDecorationList{
-                                    create<LocationDecoration>(0, Source{}),
+                                    create<LocationDecoration>(Source{}, 0),
                                 });
 
   auto* loc2 = create<Variable>(Source{}, "loc2", StorageClass::kInput, &i32,
                                 false, nullptr,
                                 ast::VariableDecorationList{
-                                    create<LocationDecoration>(1, Source{}),
+                                    create<LocationDecoration>(Source{}, 1),
                                 });
 
   auto* builtin1 = create<Variable>(
       Source{}, "builtin1", StorageClass::kInput, &i32, false, nullptr,
       ast::VariableDecorationList{
-          create<BuiltinDecoration>(Builtin::kPosition, Source{}),
+          create<BuiltinDecoration>(Source{}, Builtin::kPosition),
       });
 
   auto* builtin2 = create<Variable>(
       Source{}, "builtin2", StorageClass::kInput, &i32, false, nullptr,
       ast::VariableDecorationList{
-          create<BuiltinDecoration>(Builtin::kFragDepth, Source{}),
+          create<BuiltinDecoration>(Source{}, Builtin::kFragDepth),
       });
 
   Function f(Source{}, func_sym, "func", VariableList{}, &void_type,
@@ -155,25 +155,25 @@
   auto* loc1 = create<Variable>(Source{}, "loc1", StorageClass::kInput, &i32,
                                 false, nullptr,
                                 ast::VariableDecorationList{
-                                    create<LocationDecoration>(0, Source{}),
+                                    create<LocationDecoration>(Source{}, 0),
                                 });
 
   auto* loc2 = create<Variable>(Source{}, "loc2", StorageClass::kInput, &i32,
                                 false, nullptr,
                                 ast::VariableDecorationList{
-                                    create<LocationDecoration>(1, Source{}),
+                                    create<LocationDecoration>(Source{}, 1),
                                 });
 
   auto* builtin1 = create<Variable>(
       Source{}, "builtin1", StorageClass::kInput, &i32, false, nullptr,
       ast::VariableDecorationList{
-          create<BuiltinDecoration>(Builtin::kPosition, Source{}),
+          create<BuiltinDecoration>(Source{}, Builtin::kPosition),
       });
 
   auto* builtin2 = create<Variable>(
       Source{}, "builtin2", StorageClass::kInput, &i32, false, nullptr,
       ast::VariableDecorationList{
-          create<BuiltinDecoration>(Builtin::kFragDepth, Source{}),
+          create<BuiltinDecoration>(Source{}, Builtin::kFragDepth),
       });
 
   Function f(Source{}, func_sym, "func", VariableList{}, &void_type,
@@ -382,7 +382,7 @@
                                        });
   Function f(
       Source{}, func_sym, "func", {}, &void_type, body,
-      FunctionDecorationList{create<WorkgroupDecoration>(2, 4, 6, Source{})});
+      FunctionDecorationList{create<WorkgroupDecoration>(Source{}, 2, 4, 6)});
 
   std::ostringstream out;
   f.to_str(out, 2);
@@ -512,7 +512,7 @@
 
   Function f(Source{}, func_sym, "func", {}, &void_type,
              create<BlockStatement>(Source{}, StatementList{}),
-             {create<WorkgroupDecoration>(2u, 4u, 6u, Source{})});
+             {create<WorkgroupDecoration>(Source{}, 2u, 4u, 6u)});
 
   uint32_t x = 0;
   uint32_t y = 0;
diff --git a/src/ast/location_decoration.cc b/src/ast/location_decoration.cc
index 64990a8..db28f0a 100644
--- a/src/ast/location_decoration.cc
+++ b/src/ast/location_decoration.cc
@@ -22,7 +22,7 @@
 namespace tint {
 namespace ast {
 
-LocationDecoration::LocationDecoration(uint32_t val, const Source& source)
+LocationDecoration::LocationDecoration(const Source& source, uint32_t val)
     : Base(source), value_(val) {}
 
 LocationDecoration::~LocationDecoration() = default;
@@ -33,7 +33,7 @@
 }
 
 LocationDecoration* LocationDecoration::Clone(CloneContext* ctx) const {
-  return ctx->mod->create<LocationDecoration>(value_, ctx->Clone(source()));
+  return ctx->mod->create<LocationDecoration>(ctx->Clone(source()), value_);
 }
 
 }  // namespace ast
diff --git a/src/ast/location_decoration.h b/src/ast/location_decoration.h
index dc641e4..f6583ea 100644
--- a/src/ast/location_decoration.h
+++ b/src/ast/location_decoration.h
@@ -27,9 +27,9 @@
     : public Castable<LocationDecoration, VariableDecoration> {
  public:
   /// constructor
-  /// @param value the location value
   /// @param source the source of this decoration
-  LocationDecoration(uint32_t value, const Source& source);
+  /// @param value the location value
+  LocationDecoration(const Source& source, uint32_t value);
   ~LocationDecoration() override;
 
   /// @returns the location value
diff --git a/src/ast/location_decoration_test.cc b/src/ast/location_decoration_test.cc
index f402abe..0e32216 100644
--- a/src/ast/location_decoration_test.cc
+++ b/src/ast/location_decoration_test.cc
@@ -26,12 +26,12 @@
 using LocationDecorationTest = TestHelper;
 
 TEST_F(LocationDecorationTest, Creation) {
-  LocationDecoration d{2, Source{}};
+  LocationDecoration d{Source{}, 2};
   EXPECT_EQ(2u, d.value());
 }
 
 TEST_F(LocationDecorationTest, Is) {
-  LocationDecoration ld{2, Source{}};
+  LocationDecoration ld{Source{}, 2};
   Decoration* d = &ld;
   EXPECT_FALSE(d->Is<BindingDecoration>());
   EXPECT_FALSE(d->Is<BuiltinDecoration>());
@@ -41,7 +41,7 @@
 }
 
 TEST_F(LocationDecorationTest, ToStr) {
-  LocationDecoration d{2, Source{}};
+  LocationDecoration d{Source{}, 2};
   std::ostringstream out;
   d.to_str(out, 0);
   EXPECT_EQ(out.str(), R"(LocationDecoration{2}
diff --git a/src/ast/set_decoration.cc b/src/ast/set_decoration.cc
index 3b5ea5e..3f6607c 100644
--- a/src/ast/set_decoration.cc
+++ b/src/ast/set_decoration.cc
@@ -22,7 +22,7 @@
 namespace tint {
 namespace ast {
 
-SetDecoration::SetDecoration(uint32_t val, const Source& source)
+SetDecoration::SetDecoration(const Source& source, uint32_t val)
     : Base(source), value_(val) {}
 
 SetDecoration::~SetDecoration() = default;
@@ -33,7 +33,7 @@
 }
 
 SetDecoration* SetDecoration::Clone(CloneContext* ctx) const {
-  return ctx->mod->create<SetDecoration>(value_, ctx->Clone(source()));
+  return ctx->mod->create<SetDecoration>(ctx->Clone(source()), value_);
 }
 
 }  // namespace ast
diff --git a/src/ast/set_decoration.h b/src/ast/set_decoration.h
index a58e334..1ea07b2 100644
--- a/src/ast/set_decoration.h
+++ b/src/ast/set_decoration.h
@@ -28,7 +28,7 @@
   /// constructor
   /// @param value the set value
   /// @param source the source of this decoration
-  SetDecoration(uint32_t value, const Source& source);
+  SetDecoration(const Source& source, uint32_t value);
   ~SetDecoration() override;
 
   /// @returns the set value
diff --git a/src/ast/set_decoration_test.cc b/src/ast/set_decoration_test.cc
index 088f3f0..c0d6a15 100644
--- a/src/ast/set_decoration_test.cc
+++ b/src/ast/set_decoration_test.cc
@@ -24,12 +24,12 @@
 using SetDecorationTest = TestHelper;
 
 TEST_F(SetDecorationTest, Creation) {
-  SetDecoration d{2, Source{}};
+  SetDecoration d{Source{}, 2};
   EXPECT_EQ(2u, d.value());
 }
 
 TEST_F(SetDecorationTest, Is) {
-  SetDecoration sd{2, Source{}};
+  SetDecoration sd{Source{}, 2};
   Decoration* d = &sd;
   EXPECT_FALSE(d->Is<BindingDecoration>());
   EXPECT_FALSE(d->Is<BuiltinDecoration>());
@@ -39,7 +39,7 @@
 }
 
 TEST_F(SetDecorationTest, ToStr) {
-  SetDecoration d{2, Source{}};
+  SetDecoration d{Source{}, 2};
   std::ostringstream out;
   d.to_str(out, 0);
   EXPECT_EQ(out.str(), R"(SetDecoration{2}
diff --git a/src/ast/stage_decoration.cc b/src/ast/stage_decoration.cc
index d66817f..50525f3 100644
--- a/src/ast/stage_decoration.cc
+++ b/src/ast/stage_decoration.cc
@@ -22,7 +22,7 @@
 namespace tint {
 namespace ast {
 
-StageDecoration::StageDecoration(PipelineStage stage, const Source& source)
+StageDecoration::StageDecoration(const Source& source, PipelineStage stage)
     : Base(source), stage_(stage) {}
 
 StageDecoration::~StageDecoration() = default;
@@ -33,7 +33,7 @@
 }
 
 StageDecoration* StageDecoration::Clone(CloneContext* ctx) const {
-  return ctx->mod->create<StageDecoration>(stage_, ctx->Clone(source()));
+  return ctx->mod->create<StageDecoration>(ctx->Clone(source()), stage_);
 }
 
 }  // namespace ast
diff --git a/src/ast/stage_decoration.h b/src/ast/stage_decoration.h
index 4339f98..a8ee49f 100644
--- a/src/ast/stage_decoration.h
+++ b/src/ast/stage_decoration.h
@@ -27,7 +27,7 @@
   /// constructor
   /// @param stage the pipeline stage
   /// @param source the source of this decoration
-  StageDecoration(PipelineStage stage, const Source& source);
+  StageDecoration(const Source& source, PipelineStage stage);
   ~StageDecoration() override;
 
   /// @returns the stage
diff --git a/src/ast/stage_decoration_test.cc b/src/ast/stage_decoration_test.cc
index 4bfdad9..966d7e0 100644
--- a/src/ast/stage_decoration_test.cc
+++ b/src/ast/stage_decoration_test.cc
@@ -26,19 +26,19 @@
 using StageDecorationTest = TestHelper;
 
 TEST_F(StageDecorationTest, Creation_1param) {
-  StageDecoration d{PipelineStage::kFragment, Source{}};
+  StageDecoration d{Source{}, PipelineStage::kFragment};
   EXPECT_EQ(d.value(), PipelineStage::kFragment);
 }
 
 TEST_F(StageDecorationTest, Is) {
-  StageDecoration sd{PipelineStage::kFragment, Source{}};
+  StageDecoration sd{Source{}, PipelineStage::kFragment};
   Decoration* d = &sd;
   EXPECT_FALSE(d->Is<WorkgroupDecoration>());
   EXPECT_TRUE(d->Is<StageDecoration>());
 }
 
 TEST_F(StageDecorationTest, ToStr) {
-  StageDecoration d{PipelineStage::kFragment, Source{}};
+  StageDecoration d{Source{}, PipelineStage::kFragment};
   std::ostringstream out;
   d.to_str(out, 0);
   EXPECT_EQ(out.str(), R"(StageDecoration{fragment}
diff --git a/src/ast/stride_decoration.cc b/src/ast/stride_decoration.cc
index 094ec56..9e42cd7 100644
--- a/src/ast/stride_decoration.cc
+++ b/src/ast/stride_decoration.cc
@@ -22,7 +22,7 @@
 namespace tint {
 namespace ast {
 
-StrideDecoration::StrideDecoration(uint32_t stride, const Source& source)
+StrideDecoration::StrideDecoration(const Source& source, uint32_t stride)
     : Base(source), stride_(stride) {}
 
 StrideDecoration::~StrideDecoration() = default;
@@ -33,7 +33,7 @@
 }
 
 StrideDecoration* StrideDecoration::Clone(CloneContext* ctx) const {
-  return ctx->mod->create<StrideDecoration>(stride_, ctx->Clone(source()));
+  return ctx->mod->create<StrideDecoration>(ctx->Clone(source()), stride_);
 }
 
 }  // namespace ast
diff --git a/src/ast/stride_decoration.h b/src/ast/stride_decoration.h
index 317ac93..dc89978 100644
--- a/src/ast/stride_decoration.h
+++ b/src/ast/stride_decoration.h
@@ -28,7 +28,7 @@
   /// constructor
   /// @param stride the stride value
   /// @param source the source of this decoration
-  StrideDecoration(uint32_t stride, const Source& source);
+  StrideDecoration(const Source& source, uint32_t stride);
   ~StrideDecoration() override;
 
   /// @returns the stride value
diff --git a/src/ast/stride_decoration_test.cc b/src/ast/stride_decoration_test.cc
index 6b97255..34a1079 100644
--- a/src/ast/stride_decoration_test.cc
+++ b/src/ast/stride_decoration_test.cc
@@ -23,18 +23,18 @@
 using StrideDecorationTest = TestHelper;
 
 TEST_F(StrideDecorationTest, Creation) {
-  StrideDecoration d{2, Source{}};
+  StrideDecoration d{Source{}, 2};
   EXPECT_EQ(2u, d.stride());
 }
 
 TEST_F(StrideDecorationTest, Is) {
-  StrideDecoration d{2, Source{}};
+  StrideDecoration d{Source{}, 2};
   EXPECT_TRUE(d.Is<StrideDecoration>());
 }
 
 TEST_F(StrideDecorationTest, Source) {
   StrideDecoration d{
-      2, Source{Source::Range{Source::Location{1, 2}, Source::Location{3, 4}}}};
+      Source{Source::Range{Source::Location{1, 2}, Source::Location{3, 4}}}, 2};
   EXPECT_EQ(d.source().range.begin.line, 1u);
   EXPECT_EQ(d.source().range.begin.column, 2u);
   EXPECT_EQ(d.source().range.end.line, 3u);
diff --git a/src/ast/struct_member_offset_decoration.cc b/src/ast/struct_member_offset_decoration.cc
index abd2161..4c3af19 100644
--- a/src/ast/struct_member_offset_decoration.cc
+++ b/src/ast/struct_member_offset_decoration.cc
@@ -22,8 +22,8 @@
 namespace tint {
 namespace ast {
 
-StructMemberOffsetDecoration::StructMemberOffsetDecoration(uint32_t offset,
-                                                           const Source& source)
+StructMemberOffsetDecoration::StructMemberOffsetDecoration(const Source& source,
+                                                           uint32_t offset)
     : Base(source), offset_(offset) {}
 
 StructMemberOffsetDecoration::~StructMemberOffsetDecoration() = default;
@@ -36,8 +36,8 @@
 
 StructMemberOffsetDecoration* StructMemberOffsetDecoration::Clone(
     CloneContext* ctx) const {
-  return ctx->mod->create<StructMemberOffsetDecoration>(offset_,
-                                                        ctx->Clone(source()));
+  return ctx->mod->create<StructMemberOffsetDecoration>(ctx->Clone(source()),
+                                                        offset_);
 }
 
 }  // namespace ast
diff --git a/src/ast/struct_member_offset_decoration.h b/src/ast/struct_member_offset_decoration.h
index a153758..001d777 100644
--- a/src/ast/struct_member_offset_decoration.h
+++ b/src/ast/struct_member_offset_decoration.h
@@ -27,9 +27,9 @@
     : public Castable<StructMemberOffsetDecoration, StructMemberDecoration> {
  public:
   /// constructor
-  /// @param offset the offset value
   /// @param source the source of this decoration
-  StructMemberOffsetDecoration(uint32_t offset, const Source& source);
+  /// @param offset the offset value
+  StructMemberOffsetDecoration(const Source& source, uint32_t offset);
   ~StructMemberOffsetDecoration() override;
 
   /// @returns the offset value
diff --git a/src/ast/struct_member_offset_decoration_test.cc b/src/ast/struct_member_offset_decoration_test.cc
index 2197f03..49a4796 100644
--- a/src/ast/struct_member_offset_decoration_test.cc
+++ b/src/ast/struct_member_offset_decoration_test.cc
@@ -23,12 +23,12 @@
 using StructMemberOffsetDecorationTest = TestHelper;
 
 TEST_F(StructMemberOffsetDecorationTest, Creation) {
-  StructMemberOffsetDecoration d{2, Source{}};
+  StructMemberOffsetDecoration d{Source{}, 2};
   EXPECT_EQ(2u, d.offset());
 }
 
 TEST_F(StructMemberOffsetDecorationTest, Is) {
-  StructMemberOffsetDecoration d{2, Source{}};
+  StructMemberOffsetDecoration d{Source{}, 2};
   EXPECT_TRUE(d.Is<StructMemberOffsetDecoration>());
 }
 
diff --git a/src/ast/struct_member_test.cc b/src/ast/struct_member_test.cc
index e698302..1c9a6d7 100644
--- a/src/ast/struct_member_test.cc
+++ b/src/ast/struct_member_test.cc
@@ -30,7 +30,7 @@
 TEST_F(StructMemberTest, Creation) {
   type::I32 i32;
   StructMemberDecorationList decorations;
-  decorations.emplace_back(create<StructMemberOffsetDecoration>(4, Source{}));
+  decorations.emplace_back(create<StructMemberOffsetDecoration>(Source{}, 4));
 
   StructMember st{Source{}, "a", &i32, decorations};
   EXPECT_EQ(st.name(), "a");
@@ -77,7 +77,7 @@
 TEST_F(StructMemberTest, IsValid_Null_Decoration) {
   type::I32 i32;
   StructMemberDecorationList decorations;
-  decorations.emplace_back(create<StructMemberOffsetDecoration>(4, Source{}));
+  decorations.emplace_back(create<StructMemberOffsetDecoration>(Source{}, 4));
   decorations.push_back(nullptr);
 
   StructMember st{Source{}, "a", &i32, decorations};
@@ -87,7 +87,7 @@
 TEST_F(StructMemberTest, ToStr) {
   type::I32 i32;
   StructMemberDecorationList decorations;
-  decorations.emplace_back(create<StructMemberOffsetDecoration>(4, Source{}));
+  decorations.emplace_back(create<StructMemberOffsetDecoration>(Source{}, 4));
 
   StructMember st{Source{}, "a", &i32, decorations};
   std::ostringstream out;
diff --git a/src/ast/type/access_control_type_test.cc b/src/ast/type/access_control_type_test.cc
index 2927685..ef803ac 100644
--- a/src/ast/type/access_control_type_test.cc
+++ b/src/ast/type/access_control_type_test.cc
@@ -107,7 +107,7 @@
 TEST_F(AccessControlTest, MinBufferBindingSizeArray) {
   U32 u32;
   Array array(&u32, 4,
-              ArrayDecorationList{create<StrideDecoration>(4, Source{})});
+              ArrayDecorationList{create<StrideDecoration>(Source{}, 4)});
   AccessControl at{ast::AccessControl::kReadOnly, &array};
   EXPECT_EQ(16u, at.MinBufferBindingSize(MemoryLayout::kUniformBuffer));
 }
@@ -115,7 +115,7 @@
 TEST_F(AccessControlTest, MinBufferBindingSizeRuntimeArray) {
   U32 u32;
   Array array(&u32, 0,
-              ArrayDecorationList{create<StrideDecoration>(4, Source{})});
+              ArrayDecorationList{create<StrideDecoration>(Source{}, 4)});
   AccessControl at{ast::AccessControl::kReadOnly, &array};
   EXPECT_EQ(4u, at.MinBufferBindingSize(MemoryLayout::kUniformBuffer));
 }
@@ -125,11 +125,11 @@
   StructMemberList members;
 
   StructMemberDecorationList deco;
-  deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+  deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
 
   deco = StructMemberDecorationList();
-  deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
+  deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
 
   StructDecorationList decos;
@@ -150,7 +150,7 @@
 TEST_F(AccessControlTest, BaseAlignmentArray) {
   U32 u32;
   Array array(&u32, 4,
-              ArrayDecorationList{create<StrideDecoration>(4, Source{})});
+              ArrayDecorationList{create<StrideDecoration>(Source{}, 4)});
   AccessControl at{ast::AccessControl::kReadOnly, &array};
   EXPECT_EQ(16u, at.BaseAlignment(MemoryLayout::kUniformBuffer));
 }
@@ -158,7 +158,7 @@
 TEST_F(AccessControlTest, BaseAlignmentRuntimeArray) {
   U32 u32;
   Array array(&u32, 0,
-              ArrayDecorationList{create<StrideDecoration>(4, Source{})});
+              ArrayDecorationList{create<StrideDecoration>(Source{}, 4)});
   AccessControl at{ast::AccessControl::kReadOnly, &array};
   EXPECT_EQ(16u, at.BaseAlignment(MemoryLayout::kUniformBuffer));
 }
@@ -169,12 +169,12 @@
 
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 4));
     members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
diff --git a/src/ast/type/alias_type_test.cc b/src/ast/type/alias_type_test.cc
index 55bc94c..dc34994 100644
--- a/src/ast/type/alias_type_test.cc
+++ b/src/ast/type/alias_type_test.cc
@@ -175,7 +175,7 @@
   U32 u32;
   Array array(&u32, 4,
               ArrayDecorationList{
-                  create<StrideDecoration>(4, Source{}),
+                  create<StrideDecoration>(Source{}, 4),
               });
   Alias alias{mod.RegisterSymbol("alias"), "alias", &array};
   EXPECT_EQ(16u, alias.MinBufferBindingSize(MemoryLayout::kUniformBuffer));
@@ -185,7 +185,7 @@
   U32 u32;
   Array array(&u32, 0,
               ArrayDecorationList{
-                  create<StrideDecoration>(4, Source{}),
+                  create<StrideDecoration>(Source{}, 4),
               });
   Alias alias{mod.RegisterSymbol("alias"), "alias", &array};
   EXPECT_EQ(4u, alias.MinBufferBindingSize(MemoryLayout::kUniformBuffer));
@@ -197,12 +197,12 @@
 
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 4));
     members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
@@ -224,7 +224,7 @@
   U32 u32;
   Array array(&u32, 4,
               ArrayDecorationList{
-                  create<StrideDecoration>(4, Source{}),
+                  create<StrideDecoration>(Source{}, 4),
               });
   Alias alias{mod.RegisterSymbol("alias"), "alias", &array};
   EXPECT_EQ(16u, alias.BaseAlignment(MemoryLayout::kUniformBuffer));
@@ -234,7 +234,7 @@
   U32 u32;
   Array array(&u32, 0,
               ArrayDecorationList{
-                  create<StrideDecoration>(4, Source{}),
+                  create<StrideDecoration>(Source{}, 4),
               });
   Alias alias{mod.RegisterSymbol("alias"), "alias", &array};
   EXPECT_EQ(16u, alias.BaseAlignment(MemoryLayout::kUniformBuffer));
@@ -246,12 +246,12 @@
 
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 4));
     members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
diff --git a/src/ast/type/array_type_test.cc b/src/ast/type/array_type_test.cc
index 5d929fa..4de28df 100644
--- a/src/ast/type/array_type_test.cc
+++ b/src/ast/type/array_type_test.cc
@@ -90,7 +90,7 @@
 TEST_F(ArrayTest, TypeName_WithStride) {
   I32 i32;
   Array arr{&i32, 3,
-            ArrayDecorationList{create<StrideDecoration>(16, Source{})}};
+            ArrayDecorationList{create<StrideDecoration>(Source{}, 16)}};
   EXPECT_EQ(arr.type_name(), "__array__i32_3_stride_16");
 }
 
@@ -103,21 +103,21 @@
 TEST_F(ArrayTest, MinBufferBindingSizeArray) {
   U32 u32;
   Array arr(&u32, 4,
-            ArrayDecorationList{create<StrideDecoration>(4, Source{})});
+            ArrayDecorationList{create<StrideDecoration>(Source{}, 4)});
   EXPECT_EQ(16u, arr.MinBufferBindingSize(MemoryLayout::kUniformBuffer));
 }
 
 TEST_F(ArrayTest, MinBufferBindingSizeRuntimeArray) {
   U32 u32;
   Array arr(&u32, 0,
-            ArrayDecorationList{create<StrideDecoration>(4, Source{})});
+            ArrayDecorationList{create<StrideDecoration>(Source{}, 4)});
   EXPECT_EQ(4u, arr.MinBufferBindingSize(MemoryLayout::kUniformBuffer));
 }
 
 TEST_F(ArrayTest, BaseAlignmentArray) {
   U32 u32;
   Array arr(&u32, 4,
-            ArrayDecorationList{create<StrideDecoration>(4, Source{})});
+            ArrayDecorationList{create<StrideDecoration>(Source{}, 4)});
   EXPECT_EQ(16u, arr.BaseAlignment(MemoryLayout::kUniformBuffer));
   EXPECT_EQ(4u, arr.BaseAlignment(MemoryLayout::kStorageBuffer));
 }
@@ -125,7 +125,7 @@
 TEST_F(ArrayTest, BaseAlignmentRuntimeArray) {
   U32 u32;
   Array arr(&u32, 0,
-            ArrayDecorationList{create<StrideDecoration>(4, Source{})});
+            ArrayDecorationList{create<StrideDecoration>(Source{}, 4)});
   EXPECT_EQ(16u, arr.BaseAlignment(MemoryLayout::kUniformBuffer));
   EXPECT_EQ(4u, arr.BaseAlignment(MemoryLayout::kStorageBuffer));
 }
diff --git a/src/ast/type/struct_type_test.cc b/src/ast/type/struct_type_test.cc
index 0a7b2d1..ad1131b 100644
--- a/src/ast/type/struct_type_test.cc
+++ b/src/ast/type/struct_type_test.cc
@@ -83,12 +83,12 @@
 
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 4));
     members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
@@ -103,22 +103,22 @@
 TEST_F(StructTest, MinBufferBindingSizeArray) {
   U32 u32;
   Array arr(&u32, 4,
-            ArrayDecorationList{create<StrideDecoration>(4, Source{})});
+            ArrayDecorationList{create<StrideDecoration>(Source{}, 4)});
 
   StructMemberList members;
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 4));
     members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(8, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 8));
     members.push_back(create<StructMember>(Source{}, "bar", &arr, deco));
   }
   StructDecorationList decos;
@@ -134,22 +134,22 @@
 TEST_F(StructTest, MinBufferBindingSizeRuntimeArray) {
   U32 u32;
   Array arr(&u32, 0,
-            ArrayDecorationList{create<StrideDecoration>(4, Source{})});
+            ArrayDecorationList{create<StrideDecoration>(Source{}, 4)});
 
   StructMemberList members;
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 4));
     members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(8, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 8));
     members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
@@ -167,7 +167,7 @@
   StructMemberList members;
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &vec2, deco));
   }
   StructDecorationList decos;
@@ -186,7 +186,7 @@
   StructMemberList members;
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &vec3, deco));
   }
   StructDecorationList decos;
@@ -206,7 +206,7 @@
   StructMemberList members;
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &vec4, deco));
   }
   StructDecorationList decos;
@@ -225,12 +225,12 @@
 
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 4));
     members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
@@ -244,22 +244,22 @@
 TEST_F(StructTest, BaseAlignmentArray) {
   U32 u32;
   Array arr(&u32, 4,
-            ArrayDecorationList{create<StrideDecoration>(4, Source{})});
+            ArrayDecorationList{create<StrideDecoration>(Source{}, 4)});
 
   StructMemberList members;
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 4));
     members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(8, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 8));
     members.push_back(create<StructMember>(Source{}, "bar", &arr, deco));
   }
   StructDecorationList decos;
@@ -273,22 +273,22 @@
 TEST_F(StructTest, BaseAlignmentRuntimeArray) {
   U32 u32;
   Array arr(&u32, 0,
-            ArrayDecorationList{create<StrideDecoration>(4, Source{})});
+            ArrayDecorationList{create<StrideDecoration>(Source{}, 4)});
 
   StructMemberList members;
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 4));
     members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(8, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 8));
     members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
@@ -305,7 +305,7 @@
   StructMemberList members;
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &vec2, deco));
   }
   StructDecorationList decos;
@@ -323,7 +323,7 @@
   StructMemberList members;
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &vec3, deco));
   }
   StructDecorationList decos;
@@ -341,7 +341,7 @@
   StructMemberList members;
   {
     StructMemberDecorationList deco;
-    deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
+    deco.push_back(create<StructMemberOffsetDecoration>(Source{}, 0));
     members.push_back(create<StructMember>(Source{}, "foo", &vec4, deco));
   }
   StructDecorationList decos;
diff --git a/src/ast/variable_test.cc b/src/ast/variable_test.cc
index 5fb2a26..778b4b7 100644
--- a/src/ast/variable_test.cc
+++ b/src/ast/variable_test.cc
@@ -140,9 +140,9 @@
   auto* var = create<Variable>(
       Source{}, "my_var", StorageClass::kFunction, &t, false, nullptr,
       VariableDecorationList{
-          create<LocationDecoration>(1, Source{}),
-          create<BuiltinDecoration>(Builtin::kPosition, Source{}),
-          create<ConstantIdDecoration>(1200, Source{}),
+          create<LocationDecoration>(Source{}, 1),
+          create<BuiltinDecoration>(Source{}, Builtin::kPosition),
+          create<ConstantIdDecoration>(Source{}, 1200),
       });
 
   EXPECT_TRUE(var->HasLocationDecoration());
@@ -155,7 +155,7 @@
   auto* var = create<Variable>(Source{}, "my_var", StorageClass::kFunction, &t,
                                false, nullptr,
                                VariableDecorationList{
-                                   create<ConstantIdDecoration>(1200, Source{}),
+                                   create<ConstantIdDecoration>(Source{}, 1200),
                                });
 
   EXPECT_EQ(var->constant_id(), 1200u);
@@ -168,8 +168,8 @@
                        create<IdentifierExpression>(
                            Source{}, mod.RegisterSymbol("expr"), "expr"),
                        VariableDecorationList{
-                           create<BindingDecoration>(2, Source{}),
-                           create<SetDecoration>(1, Source{}),
+                           create<BindingDecoration>(Source{}, 2),
+                           create<SetDecoration>(Source{}, 1),
                        });
 
   std::ostringstream out;
diff --git a/src/ast/workgroup_decoration.cc b/src/ast/workgroup_decoration.cc
index b1935b9..63fdf20 100644
--- a/src/ast/workgroup_decoration.cc
+++ b/src/ast/workgroup_decoration.cc
@@ -22,18 +22,18 @@
 namespace tint {
 namespace ast {
 
-WorkgroupDecoration::WorkgroupDecoration(uint32_t x, const Source& source)
+WorkgroupDecoration::WorkgroupDecoration(const Source& source, uint32_t x)
     : Base(source), x_(x) {}
 
-WorkgroupDecoration::WorkgroupDecoration(uint32_t x,
-                                         uint32_t y,
-                                         const Source& source)
+WorkgroupDecoration::WorkgroupDecoration(const Source& source,
+                                         uint32_t x,
+                                         uint32_t y)
     : Base(source), x_(x), y_(y) {}
 
-WorkgroupDecoration::WorkgroupDecoration(uint32_t x,
+WorkgroupDecoration::WorkgroupDecoration(const Source& source,
+                                         uint32_t x,
                                          uint32_t y,
-                                         uint32_t z,
-                                         const Source& source)
+                                         uint32_t z)
     : Base(source), x_(x), y_(y), z_(z) {}
 
 WorkgroupDecoration::~WorkgroupDecoration() = default;
@@ -45,8 +45,8 @@
 }
 
 WorkgroupDecoration* WorkgroupDecoration::Clone(CloneContext* ctx) const {
-  return ctx->mod->create<WorkgroupDecoration>(x_, y_, z_,
-                                               ctx->Clone(source()));
+  return ctx->mod->create<WorkgroupDecoration>(ctx->Clone(source()), x_, y_,
+                                               z_);
 }
 
 }  // namespace ast
diff --git a/src/ast/workgroup_decoration.h b/src/ast/workgroup_decoration.h
index ac16b41..9946108 100644
--- a/src/ast/workgroup_decoration.h
+++ b/src/ast/workgroup_decoration.h
@@ -29,20 +29,20 @@
     : public Castable<WorkgroupDecoration, FunctionDecoration> {
  public:
   /// constructor
-  /// @param x the workgroup x dimension size
   /// @param source the source of this decoration
-  WorkgroupDecoration(uint32_t x, const Source& source);
+  /// @param x the workgroup x dimension size
+  WorkgroupDecoration(const Source& source, uint32_t x);
   /// constructor
+  /// @param source the source of this decoration
   /// @param x the workgroup x dimension size
   /// @param y the workgroup x dimension size
-  /// @param source the source of this decoration
-  WorkgroupDecoration(uint32_t x, uint32_t y, const Source& source);
+  WorkgroupDecoration(const Source& source, uint32_t x, uint32_t y);
   /// constructor
+  /// @param source the source of this decoration
   /// @param x the workgroup x dimension size
   /// @param y the workgroup x dimension size
   /// @param z the workgroup x dimension size
-  /// @param source the source of this decoration
-  WorkgroupDecoration(uint32_t x, uint32_t y, uint32_t z, const Source& source);
+  WorkgroupDecoration(const Source& source, uint32_t x, uint32_t y, uint32_t z);
   ~WorkgroupDecoration() override;
 
   /// @returns the workgroup dimensions
diff --git a/src/ast/workgroup_decoration_test.cc b/src/ast/workgroup_decoration_test.cc
index e285d35..b45dff8 100644
--- a/src/ast/workgroup_decoration_test.cc
+++ b/src/ast/workgroup_decoration_test.cc
@@ -26,7 +26,7 @@
 using WorkgroupDecorationTest = TestHelper;
 
 TEST_F(WorkgroupDecorationTest, Creation_1param) {
-  WorkgroupDecoration d{2, Source{}};
+  WorkgroupDecoration d{Source{}, 2};
   uint32_t x = 0;
   uint32_t y = 0;
   uint32_t z = 0;
@@ -36,7 +36,7 @@
   EXPECT_EQ(z, 1u);
 }
 TEST_F(WorkgroupDecorationTest, Creation_2param) {
-  WorkgroupDecoration d{2, 4, Source{}};
+  WorkgroupDecoration d{Source{}, 2, 4};
   uint32_t x = 0;
   uint32_t y = 0;
   uint32_t z = 0;
@@ -47,7 +47,7 @@
 }
 
 TEST_F(WorkgroupDecorationTest, Creation_3param) {
-  WorkgroupDecoration d{2, 4, 6, Source{}};
+  WorkgroupDecoration d{Source{}, 2, 4, 6};
   uint32_t x = 0;
   uint32_t y = 0;
   uint32_t z = 0;
@@ -58,14 +58,14 @@
 }
 
 TEST_F(WorkgroupDecorationTest, Is) {
-  WorkgroupDecoration wd{2, 4, 6, Source{}};
+  WorkgroupDecoration wd{Source{}, 2, 4, 6};
   Decoration* d = &wd;
   EXPECT_TRUE(d->Is<WorkgroupDecoration>());
   EXPECT_FALSE(d->Is<StageDecoration>());
 }
 
 TEST_F(WorkgroupDecorationTest, ToStr) {
-  WorkgroupDecoration d{2, 4, 6, Source{}};
+  WorkgroupDecoration d{Source{}, 2, 4, 6};
   std::ostringstream out;
   d.to_str(out, 0);
   EXPECT_EQ(out.str(), R"(WorkgroupDecoration{2 4 6}
diff --git a/src/inspector/inspector_test.cc b/src/inspector/inspector_test.cc
index d149929..192e7bd 100644
--- a/src/inspector/inspector_test.cc
+++ b/src/inspector/inspector_test.cc
@@ -231,7 +231,7 @@
         constructor,               // constructor
         ast::VariableDecorationList{
             // decorations
-            create<ast::ConstantIdDecoration>(id, Source{}),
+            create<ast::ConstantIdDecoration>(Source{}, id),
         });
     mod()->AddGlobalVariable(var);
   }
@@ -303,7 +303,7 @@
 
       ast::StructMemberDecorationList deco;
       deco.push_back(
-          create<ast::StructMemberOffsetDecoration>(offset, Source{}));
+          create<ast::StructMemberOffsetDecoration>(Source{}, offset));
 
       members.push_back(create<ast::StructMember>(
           Source{}, StructMemberName(members.size(), type), type, deco));
@@ -394,8 +394,8 @@
         nullptr,        // constructor
         ast::VariableDecorationList{
             // decorations
-            create<ast::BindingDecoration>(binding, Source{}),
-            create<ast::SetDecoration>(set, Source{}),
+            create<ast::BindingDecoration>(Source{}, binding),
+            create<ast::SetDecoration>(Source{}, set),
         });
 
     mod()->AddGlobalVariable(var);
@@ -801,7 +801,7 @@
       array_type_memo_[count] = create<ast::type::Array>(
           u32_type(), count,
           ast::ArrayDecorationList{
-              create<ast::StrideDecoration>(4, Source{}),
+              create<ast::StrideDecoration>(Source{}, 4),
           });
     }
     return array_type_memo_[count];
@@ -915,7 +915,7 @@
   auto* foo = MakeEmptyBodyFunction(
       "foo",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
@@ -934,14 +934,14 @@
   auto* foo = MakeEmptyBodyFunction(
       "foo",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
   auto* bar = MakeEmptyBodyFunction(
       "bar",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
       });
   mod()->AddFunction(bar);
 
@@ -966,14 +966,14 @@
   auto* foo = MakeCallerBodyFunction(
       "foo", "func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
   auto* bar = MakeCallerBodyFunction(
       "bar", "func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
   mod()->AddFunction(bar);
 
@@ -995,7 +995,7 @@
   auto* foo = MakeCallerBodyFunction(
       "foo", "func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
@@ -1014,8 +1014,8 @@
   auto* foo = MakeEmptyBodyFunction(
       "foo",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
-          create<ast::WorkgroupDecoration>(8u, 2u, 1u, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
+          create<ast::WorkgroupDecoration>(Source{}, 8u, 2u, 1u),
       });
   mod()->AddFunction(foo);
 
@@ -1037,7 +1037,7 @@
   auto* foo = MakeCallerBodyFunction(
       "foo", "func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
@@ -1055,7 +1055,7 @@
   auto* foo = MakeInOutVariableBodyFunction(
       "foo", {{"in_var", "out_var"}},
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
@@ -1081,7 +1081,7 @@
   auto* foo = MakeCallerBodyFunction(
       "foo", "func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
@@ -1107,7 +1107,7 @@
   auto* foo = MakeInOutVariableCallerBodyFunction(
       "foo", "func", {{"in_var", "out_var"}},
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
@@ -1130,7 +1130,7 @@
   auto* foo = MakeInOutVariableBodyFunction(
       "foo", {{"in_var", "out_var"}, {"in2_var", "out2_var"}},
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
@@ -1159,7 +1159,7 @@
   auto* foo = MakeCallerBodyFunction(
       "foo", "func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
@@ -1184,14 +1184,14 @@
   auto* foo = MakeInOutVariableBodyFunction(
       "foo", {{"in_var", "out2_var"}},
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
   auto* bar = MakeInOutVariableBodyFunction(
       "bar", {{"in2_var", "out_var"}},
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
       });
   mod()->AddFunction(bar);
 
@@ -1228,14 +1228,14 @@
   auto* foo = MakeInOutVariableCallerBodyFunction(
       "foo", "func", {{"in_var", "out_var"}},
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
   auto* bar = MakeCallerBodyFunction(
       "bar", "func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
       });
   mod()->AddFunction(bar);
 
@@ -1291,7 +1291,7 @@
   auto* foo = MakeEmptyBodyFunction(
       "foo",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
@@ -1310,7 +1310,7 @@
   auto* foo = MakeEmptyBodyFunction(
       "foo",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
@@ -1319,7 +1319,7 @@
   auto* bar = MakeEmptyBodyFunction(
       "bar",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
       });
   mod()->AddFunction(bar);
 
@@ -1444,7 +1444,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "ub_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -1458,7 +1458,7 @@
 TEST_F(InspectorGetUniformBufferResourceBindingsTest, MissingBlockDeco) {
   ast::StructMemberList members;
   ast::StructMemberDecorationList deco;
-  deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
 
   members.push_back(create<ast::StructMember>(
       Source{}, StructMemberName(members.size(), i32_type()), i32_type(),
@@ -1479,7 +1479,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "ub_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -1504,7 +1504,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "ub_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -1533,7 +1533,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "ub_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -1587,7 +1587,7 @@
       Source{}, mod()->RegisterSymbol("ep_func"), "ep_func",
       ast::VariableList(), void_type(), body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -1624,7 +1624,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "ub_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -1653,7 +1653,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -1682,7 +1682,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -1736,7 +1736,7 @@
       Source{}, mod()->RegisterSymbol("ep_func"), "ep_func",
       ast::VariableList(), void_type(), body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -1773,7 +1773,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -1802,7 +1802,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -1831,7 +1831,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -1856,7 +1856,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -1912,7 +1912,7 @@
       Source{}, mod()->RegisterSymbol("ep_func"), "ep_func",
       ast::VariableList(), void_type(), body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -1950,7 +1950,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -1981,7 +1981,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -2011,7 +2011,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -2033,7 +2033,7 @@
   auto* func = MakeSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords", f32_type(),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -2051,7 +2051,7 @@
   auto* func = MakeEmptyBodyFunction(
       "ep_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -2077,7 +2077,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "foo_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -2101,7 +2101,7 @@
   auto* func = MakeSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords", f32_type(),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -2122,7 +2122,7 @@
   auto* func = MakeComparisonSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords", "foo_depth", f32_type(),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -2145,7 +2145,7 @@
   auto* func = MakeComparisonSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords", "foo_depth", f32_type(),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -2163,7 +2163,7 @@
   auto* func = MakeEmptyBodyFunction(
       "ep_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -2191,7 +2191,7 @@
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "foo_func",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(ep_func);
 
@@ -2216,7 +2216,7 @@
   auto* func = MakeComparisonSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords", "foo_depth", f32_type(),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -2236,7 +2236,7 @@
   auto* func = MakeSamplerReferenceBodyFunction(
       "ep", "foo_texture", "foo_sampler", "foo_coords", f32_type(),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -2252,7 +2252,7 @@
   auto* foo = MakeEmptyBodyFunction(
       "foo",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
@@ -2275,7 +2275,7 @@
       "ep", "foo_texture", "foo_sampler", "foo_coords",
       GetBaseType(GetParam().sampled_kind),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -2359,7 +2359,7 @@
       "ep", "foo_texture", "foo_sampler", "foo_coords", "foo_array_index",
       GetBaseType(GetParam().sampled_kind),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -2430,7 +2430,7 @@
       "ep", "foo_texture", "foo_sampler", "foo_coords",
       GetBaseType(GetParam().sampled_kind),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -2479,7 +2479,7 @@
   auto* foo = MakeEmptyBodyFunction(
       "foo",
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(foo);
 
@@ -2504,7 +2504,7 @@
       "ep", "foo_texture", "foo_sampler", "foo_coords", "foo_array_index",
       GetBaseType(GetParam().sampled_kind),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
diff --git a/src/reader/spirv/function.cc b/src/reader/spirv/function.cc
index 82d9ec5..c699115 100644
--- a/src/reader/spirv/function.cc
+++ b/src/reader/spirv/function.cc
@@ -906,7 +906,7 @@
   }
   ast::FunctionDecorationList decos;
   if (ep_info_ != nullptr) {
-    decos.emplace_back(create<ast::StageDecoration>(ep_info_->stage, Source{}));
+    decos.emplace_back(create<ast::StageDecoration>(Source{}, ep_info_->stage));
   }
 
   decl->name = name;
diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc
index 122ce2f..a75725f 100644
--- a/src/reader/spirv/parser_impl.cc
+++ b/src/reader/spirv/parser_impl.cc
@@ -447,7 +447,7 @@
             << ShowType(struct_type_id);
         return nullptr;
       }
-      return create<ast::StructMemberOffsetDecoration>(decoration[1], Source{});
+      return create<ast::StructMemberOffsetDecoration>(Source{}, decoration[1]);
     case SpvDecorationNonReadable:
       // WGSL doesn't have a member decoration for this.  Silently drop it.
       return nullptr;
@@ -845,7 +845,7 @@
                       << ": multiple ArrayStride decorations";
       }
       has_array_stride = true;
-      decorations->push_back(create<ast::StrideDecoration>(stride, Source{}));
+      decorations->push_back(create<ast::StrideDecoration>(Source{}, stride));
     } else {
       return Fail() << "invalid array type ID " << type_id
                     << ": unknown decoration "
@@ -1072,7 +1072,7 @@
       ast::VariableDecorationList spec_id_decos;
       for (const auto& deco : GetDecorationsFor(inst.result_id())) {
         if ((deco.size() == 2) && (deco[0] == SpvDecorationSpecId)) {
-          auto* cid = create<ast::ConstantIdDecoration>(deco[1], Source{});
+          auto* cid = create<ast::ConstantIdDecoration>(Source{}, deco[1]);
           spec_id_decos.push_back(cid);
           break;
         }
@@ -1210,7 +1210,7 @@
         enum_converter_.ToStorageClass(builtin_position_.storage_class),
         ConvertType(builtin_position_.member_type_id), false, nullptr,
         ast::VariableDecorationList{
-            create<ast::BuiltinDecoration>(ast::Builtin::kPosition, Source{}),
+            create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kPosition),
         });
 
     ast_module_.AddGlobalVariable(var);
@@ -1255,7 +1255,7 @@
         return nullptr;
       }
       decorations.emplace_back(
-          create<ast::BuiltinDecoration>(ast_builtin, Source{}));
+          create<ast::BuiltinDecoration>(Source{}, ast_builtin));
     }
     if (deco[0] == SpvDecorationLocation) {
       if (deco.size() != 2) {
@@ -1264,7 +1264,7 @@
         return nullptr;
       }
       decorations.emplace_back(
-          create<ast::LocationDecoration>(deco[1], Source{}));
+          create<ast::LocationDecoration>(Source{}, deco[1]));
     }
     if (deco[0] == SpvDecorationDescriptorSet) {
       if (deco.size() == 1) {
@@ -1272,7 +1272,7 @@
                << ": has no operand";
         return nullptr;
       }
-      decorations.emplace_back(create<ast::SetDecoration>(deco[1], Source{}));
+      decorations.emplace_back(create<ast::SetDecoration>(Source{}, deco[1]));
     }
     if (deco[0] == SpvDecorationBinding) {
       if (deco.size() == 1) {
@@ -1281,7 +1281,7 @@
         return nullptr;
       }
       decorations.emplace_back(
-          create<ast::BindingDecoration>(deco[1], Source{}));
+          create<ast::BindingDecoration>(Source{}, deco[1]));
     }
   }
 
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index 663bdc6..e1d3061 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -2865,7 +2865,7 @@
       if (val.errored)
         return Failure::kErrored;
 
-      return create<ast::AccessDecoration>(val.value, val.source);
+      return create<ast::AccessDecoration>(val.source, val.value);
     });
   }
 
@@ -2876,7 +2876,7 @@
       if (val.errored)
         return Failure::kErrored;
 
-      return create<ast::LocationDecoration>(val.value, val.source);
+      return create<ast::LocationDecoration>(val.source, val.value);
     });
   }
 
@@ -2887,7 +2887,7 @@
       if (val.errored)
         return Failure::kErrored;
 
-      return create<ast::BindingDecoration>(val.value, val.source);
+      return create<ast::BindingDecoration>(val.source, val.value);
     });
   }
 
@@ -2898,7 +2898,7 @@
       if (val.errored)
         return Failure::kErrored;
 
-      return create<ast::SetDecoration>(val.value, val.source);
+      return create<ast::SetDecoration>(val.source, val.value);
     });
   }
 
@@ -2908,7 +2908,7 @@
       if (builtin.errored)
         return Failure::kErrored;
 
-      return create<ast::BuiltinDecoration>(builtin.value, builtin.source);
+      return create<ast::BuiltinDecoration>(builtin.source, builtin.value);
     });
   }
 
@@ -2937,7 +2937,7 @@
         }
       }
 
-      return create<ast::WorkgroupDecoration>(x, y, z, t.source());
+      return create<ast::WorkgroupDecoration>(t.source(), x, y, z);
     });
   }
 
@@ -2947,7 +2947,7 @@
       if (stage.errored)
         return Failure::kErrored;
 
-      return create<ast::StageDecoration>(stage.value, stage.source);
+      return create<ast::StageDecoration>(stage.source, stage.value);
     });
   }
 
@@ -2962,7 +2962,7 @@
       if (val.errored)
         return Failure::kErrored;
 
-      return create<ast::StrideDecoration>(val.value, t.source());
+      return create<ast::StrideDecoration>(t.source(), val.value);
     });
   }
 
@@ -2973,7 +2973,7 @@
       if (val.errored)
         return Failure::kErrored;
 
-      return create<ast::StructMemberOffsetDecoration>(val.value, t.source());
+      return create<ast::StructMemberOffsetDecoration>(t.source(), val.value);
     });
   }
 
diff --git a/src/transform/emit_vertex_point_size.cc b/src/transform/emit_vertex_point_size.cc
index d8640d8..c80fab7 100644
--- a/src/transform/emit_vertex_point_size.cc
+++ b/src/transform/emit_vertex_point_size.cc
@@ -66,7 +66,7 @@
                                    ast::VariableDecorationList{
                                        // decorations
                                        mod->create<ast::BuiltinDecoration>(
-                                           ast::Builtin::kPointSize, Source{}),
+                                           Source{}, ast::Builtin::kPointSize),
                                    });
     mod->AddGlobalVariable(pointsize_var);
 
diff --git a/src/transform/emit_vertex_point_size_test.cc b/src/transform/emit_vertex_point_size_test.cc
index a089d3e..95e64ef 100644
--- a/src/transform/emit_vertex_point_size_test.cc
+++ b/src/transform/emit_vertex_point_size_test.cc
@@ -71,8 +71,8 @@
       auto* entry = create<ast::Function>(
           Source{}, entry_sym, "entry", ast::VariableList{}, ty.void_, block,
           ast::FunctionDecorationList{
-              create<ast::StageDecoration>(ast::PipelineStage::kVertex,
-                                           Source{}),
+              create<ast::StageDecoration>(Source{},
+                                           ast::PipelineStage::kVertex),
           });
       mod->AddFunction(entry);
 
@@ -141,8 +141,8 @@
           Source{}, entry_sym, "entry", ast::VariableList{}, ty.void_,
           create<ast::BlockStatement>(Source{}, ast::StatementList{}),
           ast::FunctionDecorationList{
-              create<ast::StageDecoration>(ast::PipelineStage::kVertex,
-                                           Source{}),
+              create<ast::StageDecoration>(Source{},
+                                           ast::PipelineStage::kVertex),
           }));
 
       auto b_sym = mod->RegisterSymbol("non_entry_b");
@@ -197,8 +197,8 @@
           Source{}, frag_sym, "fragment_entry", ast::VariableList{}, ty.void_,
           create<ast::BlockStatement>(Source{}, ast::StatementList{}),
           ast::FunctionDecorationList{
-              create<ast::StageDecoration>(ast::PipelineStage::kFragment,
-                                           Source{}),
+              create<ast::StageDecoration>(Source{},
+                                           ast::PipelineStage::kFragment),
           });
       mod->AddFunction(fragment_entry);
 
@@ -207,8 +207,8 @@
           Source{}, comp_sym, "compute_entry", ast::VariableList{}, ty.void_,
           create<ast::BlockStatement>(Source{}, ast::StatementList{}),
           ast::FunctionDecorationList{
-              create<ast::StageDecoration>(ast::PipelineStage::kCompute,
-                                           Source{}),
+              create<ast::StageDecoration>(Source{},
+                                           ast::PipelineStage::kCompute),
           });
       mod->AddFunction(compute_entry);
     }
diff --git a/src/transform/first_index_offset.cc b/src/transform/first_index_offset.cc
index 807a2c6..b89b94f 100644
--- a/src/transform/first_index_offset.cc
+++ b/src/transform/first_index_offset.cc
@@ -197,7 +197,7 @@
   if (has_vertex_index_) {
     ast::StructMemberDecorationList member_dec;
     member_dec.push_back(
-        mod->create<ast::StructMemberOffsetDecoration>(offset, Source{}));
+        mod->create<ast::StructMemberOffsetDecoration>(Source{}, offset));
     members.push_back(mod->create<ast::StructMember>(
         Source{}, kFirstVertexName, u32_type, std::move(member_dec)));
     vertex_index_offset_ = offset;
@@ -207,7 +207,7 @@
   if (has_instance_index_) {
     ast::StructMemberDecorationList member_dec;
     member_dec.push_back(
-        mod->create<ast::StructMemberOffsetDecoration>(offset, Source{}));
+        mod->create<ast::StructMemberOffsetDecoration>(Source{}, offset));
     members.push_back(mod->create<ast::StructMember>(
         Source{}, kFirstInstanceName, u32_type, std::move(member_dec)));
     instance_index_offset_ = offset;
@@ -229,8 +229,8 @@
       false,                        // is_const
       nullptr,                      // constructor
       ast::VariableDecorationList{
-          mod->create<ast::BindingDecoration>(binding_, Source{}),
-          mod->create<ast::SetDecoration>(set_, Source{}),
+          mod->create<ast::BindingDecoration>(Source{}, binding_),
+          mod->create<ast::SetDecoration>(Source{}, set_),
       });  // decorations
 
   mod->AddGlobalVariable(idx_var);
diff --git a/src/transform/first_index_offset_test.cc b/src/transform/first_index_offset_test.cc
index 2e8164a..0717bdd 100644
--- a/src/transform/first_index_offset_test.cc
+++ b/src/transform/first_index_offset_test.cc
@@ -54,7 +54,7 @@
   void AddBuiltinInput(const std::string& name, ast::Builtin builtin) {
     mod->AddGlobalVariable(
         Var(name, ast::StorageClass::kInput, ty.u32, nullptr,
-            {create<ast::BuiltinDecoration>(builtin, Source{})}));
+            {create<ast::BuiltinDecoration>(Source{}, builtin)}));
   }
 
   ast::Function* AddFunction(const std::string& name,
diff --git a/src/transform/vertex_pulling.cc b/src/transform/vertex_pulling.cc
index 74feab3..b1fa044 100644
--- a/src/transform/vertex_pulling.cc
+++ b/src/transform/vertex_pulling.cc
@@ -173,7 +173,7 @@
                                  ast::VariableDecorationList{
                                      // decorations
                                      out->create<ast::BuiltinDecoration>(
-                                         ast::Builtin::kVertexIdx, Source{}),
+                                         Source{}, ast::Builtin::kVertexIdx),
                                  });
 
   out->AddGlobalVariable(var);
@@ -220,7 +220,7 @@
                                  ast::VariableDecorationList{
                                      // decorations
                                      out->create<ast::BuiltinDecoration>(
-                                         ast::Builtin::kInstanceIdx, Source{}),
+                                         Source{}, ast::Builtin::kInstanceIdx),
                                  });
   out->AddGlobalVariable(var);
 }
@@ -258,14 +258,14 @@
   auto* internal_array_type = out->create<ast::type::Array>(
       GetU32Type(), 0,
       ast::ArrayDecorationList{
-          out->create<ast::StrideDecoration>(4u, Source{}),
+          out->create<ast::StrideDecoration>(Source{}, 4u),
       });
 
   // Creating the struct type
   ast::StructMemberList members;
   ast::StructMemberDecorationList member_dec;
   member_dec.push_back(
-      out->create<ast::StructMemberOffsetDecoration>(0u, Source{}));
+      out->create<ast::StructMemberOffsetDecoration>(Source{}, 0u));
 
   members.push_back(out->create<ast::StructMember>(
       Source{}, kStructBufferName, internal_array_type, std::move(member_dec)));
@@ -288,8 +288,8 @@
         nullptr,                            // constructor
         ast::VariableDecorationList{
             // decorations
-            out->create<ast::BindingDecoration>(i, Source{}),
-            out->create<ast::SetDecoration>(cfg.pulling_set, Source{}),
+            out->create<ast::BindingDecoration>(Source{}, i),
+            out->create<ast::SetDecoration>(Source{}, cfg.pulling_set),
         });
     out->AddGlobalVariable(var);
   }
diff --git a/src/transform/vertex_pulling_test.cc b/src/transform/vertex_pulling_test.cc
index 818853f..65e644b 100644
--- a/src/transform/vertex_pulling_test.cc
+++ b/src/transform/vertex_pulling_test.cc
@@ -51,7 +51,7 @@
         mod_->create<ast::type::Void>(),
         create<ast::BlockStatement>(Source{}, ast::StatementList{}),
         ast::FunctionDecorationList{create<ast::StageDecoration>(
-            ast::PipelineStage::kVertex, Source{})});
+            Source{}, ast::PipelineStage::kVertex)});
     mod()->AddFunction(func);
   }
 
@@ -79,7 +79,7 @@
         nullptr,                    // constructor
         ast::VariableDecorationList{
             // decorations
-            create<ast::LocationDecoration>(location, Source{}),
+            create<ast::LocationDecoration>(Source{}, location),
         });
 
     mod_->AddGlobalVariable(var);
@@ -139,7 +139,7 @@
       mod()->create<ast::type::Void>(),
       create<ast::BlockStatement>(Source{}, ast::StatementList{}),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
   mod()->AddFunction(func);
 
@@ -437,7 +437,7 @@
       nullptr,                    // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kVertexIdx, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kVertexIdx),
       }));
 
   mod()->AddGlobalVariable(create<ast::Variable>(
@@ -449,7 +449,7 @@
       nullptr,                    // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kInstanceIdx, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kInstanceIdx),
       }));
 
   InitTransform(
diff --git a/src/type_determiner_test.cc b/src/type_determiner_test.cc
index 36eb700..c857083 100644
--- a/src/type_determiner_test.cc
+++ b/src/type_determiner_test.cc
@@ -5338,7 +5338,7 @@
   auto* ep_1 = create<ast::Function>(
       Source{}, mod->RegisterSymbol("ep_1"), "ep_1", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
 
   body = create<ast::BlockStatement>(
@@ -5356,7 +5356,7 @@
   auto* ep_2 = create<ast::Function>(
       Source{}, mod->RegisterSymbol("ep_2"), "ep_2", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
 
   mod->AddFunction(func_b);
diff --git a/src/validator/validator_function_test.cc b/src/validator/validator_function_test.cc
index 561caf5..94db436 100644
--- a/src/validator/validator_function_test.cc
+++ b/src/validator/validator_function_test.cc
@@ -60,7 +60,7 @@
       Source{Source::Location{12, 34}}, mod()->RegisterSymbol("func"), "func",
       params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -79,7 +79,7 @@
       params, &void_type,
       create<ast::BlockStatement>(Source{}, ast::StatementList{}),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -149,7 +149,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod()->RegisterSymbol("func"), "func", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -329,7 +329,7 @@
       Source{Source::Location{12, 34}}, mod()->RegisterSymbol("vtx_main"),
       "vtx_main", params, &i32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
 
   mod()->AddFunction(func);
@@ -361,7 +361,7 @@
       Source{Source::Location{12, 34}}, mod()->RegisterSymbol("vtx_func"),
       "vtx_func", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
 
   mod()->AddFunction(func);
@@ -386,8 +386,8 @@
       Source{Source::Location{12, 34}}, mod()->RegisterSymbol("main"), "main",
       params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod()->AddFunction(func);
@@ -411,7 +411,7 @@
       Source{}, mod()->RegisterSymbol("vtx_func"), "vtx_func", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
diff --git a/src/validator/validator_test.cc b/src/validator/validator_test.cc
index 876fb83..e617607 100644
--- a/src/validator/validator_test.cc
+++ b/src/validator/validator_test.cc
@@ -398,7 +398,7 @@
       Source{}, mod()->RegisterSymbol("my_func"), "my_func", params, &void_type,
       body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
@@ -848,7 +848,7 @@
       Source{}, mod()->RegisterSymbol("func1"), "func1", params1, &void_type,
       body1,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
 
   mod()->AddFunction(func0);
diff --git a/src/validator/validator_type_test.cc b/src/validator/validator_type_test.cc
index 4950b33..46aaa96 100644
--- a/src/validator/validator_type_test.cc
+++ b/src/validator/validator_type_test.cc
@@ -211,7 +211,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod()->RegisterSymbol("func"), "func", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
   mod()->AddFunction(func);
 
diff --git a/src/writer/hlsl/generator_impl_alias_type_test.cc b/src/writer/hlsl/generator_impl_alias_type_test.cc
index 9842bed..a0c53a7 100644
--- a/src/writer/hlsl/generator_impl_alias_type_test.cc
+++ b/src/writer/hlsl/generator_impl_alias_type_test.cc
@@ -58,7 +58,7 @@
           create<ast::StructMember>(
               Source{}, "b", &i32,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(4, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 4)}),
       },
       ast::StructDecorationList{});
 
diff --git a/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc b/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
index d869cc0..7a8236b 100644
--- a/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
+++ b/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
@@ -60,7 +60,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -72,7 +72,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -100,7 +100,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("vtx_main"), "vtx_main", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
 
   mod.AddFunction(func);
@@ -139,7 +139,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -151,7 +151,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -180,7 +180,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("vtx_main"), "vtx_main", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
 
   mod.AddFunction(func);
@@ -219,7 +219,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -231,7 +231,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -260,7 +260,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
 
   mod.AddFunction(func);
@@ -299,7 +299,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -311,7 +311,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -339,7 +339,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -375,7 +375,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -387,7 +387,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -415,7 +415,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
       });
 
   mod.AddFunction(func);
@@ -446,7 +446,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -458,7 +458,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -486,7 +486,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
       });
 
   mod.AddFunction(func);
@@ -524,7 +524,7 @@
       nullptr,                    // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragCoord, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragCoord),
       });
 
   auto* depth_var = create<ast::Variable>(
@@ -536,7 +536,7 @@
       nullptr,                     // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragDepth),
       });
 
   td.RegisterVariableForTesting(coord_var);
@@ -562,7 +562,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
diff --git a/src/writer/hlsl/generator_impl_function_test.cc b/src/writer/hlsl/generator_impl_function_test.cc
index 5668225..60499bf 100644
--- a/src/writer/hlsl/generator_impl_function_test.cc
+++ b/src/writer/hlsl/generator_impl_function_test.cc
@@ -153,7 +153,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -165,7 +165,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -189,7 +189,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -228,7 +228,7 @@
       nullptr,                    // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragCoord, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragCoord),
       });
 
   auto* depth_var = create<ast::Variable>(
@@ -240,7 +240,7 @@
       nullptr,                     // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragDepth),
       });
 
   td.RegisterVariableForTesting(coord_var);
@@ -268,7 +268,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -307,8 +307,8 @@
                             nullptr,                      // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(1, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(coord_var);
@@ -338,7 +338,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -381,8 +381,8 @@
                             nullptr,                      // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(1, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 1),
                             });
 
   mod.AddConstructedType(&s);
@@ -418,7 +418,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -447,11 +447,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -469,8 +469,8 @@
                             nullptr,                            // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(1, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(coord_var);
@@ -500,7 +500,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -525,11 +525,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -547,8 +547,8 @@
                             nullptr,                            // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(1, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(coord_var);
@@ -578,7 +578,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -603,11 +603,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -625,8 +625,8 @@
                             nullptr,                            // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(1, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(coord_var);
@@ -653,7 +653,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main",
       ast::VariableList{}, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -685,7 +685,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -697,7 +697,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   auto* val_var =
@@ -709,7 +709,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -776,7 +776,7 @@
   auto* func_1 = create<ast::Function>(
       Source{}, mod.RegisterSymbol("ep_1"), "ep_1", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func_1);
@@ -822,7 +822,7 @@
       nullptr,                     // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragDepth),
       });
 
   td.RegisterVariableForTesting(depth_var);
@@ -873,7 +873,7 @@
   auto* func_1 = create<ast::Function>(
       Source{}, mod.RegisterSymbol("ep_1"), "ep_1", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func_1);
@@ -913,7 +913,7 @@
       nullptr,                    // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragCoord, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragCoord),
       });
 
   auto* depth_var = create<ast::Variable>(
@@ -925,7 +925,7 @@
       nullptr,                     // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragDepth),
       });
 
   td.RegisterVariableForTesting(coord_var);
@@ -988,7 +988,7 @@
   auto* func_1 = create<ast::Function>(
       Source{}, mod.RegisterSymbol("ep_1"), "ep_1", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func_1);
@@ -1032,8 +1032,8 @@
                             nullptr,                      // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(1, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(coord_var);
@@ -1095,7 +1095,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -1133,8 +1133,8 @@
                             nullptr,                            // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(1, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(coord_var);
@@ -1196,7 +1196,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -1232,7 +1232,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(bar_var);
@@ -1268,7 +1268,7 @@
   auto* func_1 = create<ast::Function>(
       Source{}, mod.RegisterSymbol("ep_1"), "ep_1", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func_1);
@@ -1300,7 +1300,7 @@
       ast::VariableList{}, &void_type,
       create<ast::BlockStatement>(Source{}, ast::StatementList{}),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -1325,7 +1325,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
       });
 
   mod.AddFunction(func);
@@ -1353,8 +1353,8 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
-          create<ast::WorkgroupDecoration>(2u, 4u, 6u, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
+          create<ast::WorkgroupDecoration>(Source{}, 2u, 4u, 6u),
       });
 
   mod.AddFunction(func);
@@ -1427,7 +1427,7 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "d", &f32, a_deco));
 
   ast::StructDecorationList s_decos;
@@ -1447,8 +1447,8 @@
                             nullptr,                            // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(0, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 0),
                             });
 
   mod.AddConstructedType(&s);
@@ -1480,8 +1480,8 @@
     auto* func = create<ast::Function>(
         Source{}, mod.RegisterSymbol("a"), "a", params, &void_type, body,
         ast::FunctionDecorationList{
-            create<ast::StageDecoration>(ast::PipelineStage::kCompute,
-                                         Source{}),
+            create<ast::StageDecoration>(Source{},
+                                         ast::PipelineStage::kCompute),
         });
 
     mod.AddFunction(func);
@@ -1512,8 +1512,8 @@
     auto* func = create<ast::Function>(
         Source{}, mod.RegisterSymbol("b"), "b", params, &void_type, body,
         ast::FunctionDecorationList{
-            create<ast::StageDecoration>(ast::PipelineStage::kCompute,
-                                         Source{}),
+            create<ast::StageDecoration>(Source{},
+                                         ast::PipelineStage::kCompute),
         });
 
     mod.AddFunction(func);
diff --git a/src/writer/hlsl/generator_impl_member_accessor_test.cc b/src/writer/hlsl/generator_impl_member_accessor_test.cc
index 1f9d76d..b8d2a8e 100644
--- a/src/writer/hlsl/generator_impl_member_accessor_test.cc
+++ b/src/writer/hlsl/generator_impl_member_accessor_test.cc
@@ -50,7 +50,7 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList deco;
-  deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "mem", &f32, deco));
 
   auto* strct =
@@ -98,11 +98,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -152,11 +152,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -213,11 +213,11 @@
           create<ast::StructMember>(
               Source{}, "z", &i32,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 0)}),
           create<ast::StructMember>(
               Source{}, "a", &mat,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(4, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 4)}),
       },
       ast::StructDecorationList{});
 
@@ -288,11 +288,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "z", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "a", &mat, b_deco));
 
   auto* str =
@@ -353,11 +353,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "z", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "a", &mat, b_deco));
 
   auto* str =
@@ -414,11 +414,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "z", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "a", &mat, b_deco));
 
   auto* str =
@@ -471,7 +471,7 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList deco;
-  deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &mat, deco));
 
   auto* str =
@@ -524,11 +524,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "z", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(16, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 16));
   members.push_back(create<ast::StructMember>(Source{}, "a", &mat, b_deco));
 
   auto* str =
@@ -584,12 +584,12 @@
   ast::type::I32 i32;
   ast::type::Array ary(&i32, 5,
                        ast::ArrayDecorationList{
-                           create<ast::StrideDecoration>(4, Source{}),
+                           create<ast::StrideDecoration>(Source{}, 4),
                        });
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &ary, a_deco));
 
   auto* str =
@@ -641,12 +641,12 @@
   ast::type::I32 i32;
   ast::type::Array ary(&i32, 5,
                        ast::ArrayDecorationList{
-                           create<ast::StrideDecoration>(4, Source{}),
+                           create<ast::StrideDecoration>(Source{}, 4),
                        });
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &ary, a_deco));
 
   auto* str =
@@ -709,11 +709,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -766,12 +766,12 @@
   ast::type::I32 i32;
   ast::type::Array ary(&i32, 5,
                        ast::ArrayDecorationList{
-                           create<ast::StrideDecoration>(4, Source{}),
+                           create<ast::StrideDecoration>(Source{}, 4),
                        });
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &ary, a_deco));
 
   auto* str =
@@ -830,11 +830,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -891,11 +891,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &ivec3, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(16, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 16));
   members.push_back(create<ast::StructMember>(Source{}, "b", &fvec3, b_deco));
 
   auto* str =
@@ -948,11 +948,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &ivec3, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(16, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 16));
   members.push_back(create<ast::StructMember>(Source{}, "b", &fvec3, b_deco));
 
   auto* str =
@@ -1026,11 +1026,11 @@
           create<ast::StructMember>(
               Source{}, "a", &ivec3,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 0)}),
           create<ast::StructMember>(
               Source{}, "b", &fvec3,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(16, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 16)}),
       },
       ast::StructDecorationList{});
 
@@ -1038,7 +1038,7 @@
 
   ast::type::Array ary(&data, 4,
                        ast::ArrayDecorationList{
-                           create<ast::StrideDecoration>(32, Source{}),
+                           create<ast::StrideDecoration>(Source{}, 32),
                        });
 
   auto* pre_str = create<ast::Struct>(
@@ -1047,7 +1047,7 @@
           create<ast::StructMember>(
               Source{}, "c", &ary,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 0)}),
       },
       ast::StructDecorationList{});
 
@@ -1117,11 +1117,11 @@
           create<ast::StructMember>(
               Source{}, "a", &ivec3,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 0)}),
           create<ast::StructMember>(
               Source{}, "b", &fvec3,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(16, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 16)}),
       },
       ast::StructDecorationList{});
 
@@ -1129,14 +1129,14 @@
 
   ast::type::Array ary(
       &data, 4,
-      ast::ArrayDecorationList{create<ast::StrideDecoration>(32, Source{})});
+      ast::ArrayDecorationList{create<ast::StrideDecoration>(Source{}, 32)});
 
   auto* pre_str = create<ast::Struct>(
       Source{},
       ast::StructMemberList{create<ast::StructMember>(
           Source{}, "c", &ary,
           ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})})},
+              create<ast::StructMemberOffsetDecoration>(Source{}, 0)})},
       ast::StructDecorationList{});
 
   ast::type::Struct pre_struct(mod.RegisterSymbol("Pre"), "Pre", pre_str);
@@ -1207,11 +1207,11 @@
           create<ast::StructMember>(
               Source{}, "a", &ivec3,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 0)}),
           create<ast::StructMember>(
               Source{}, "b", &fvec3,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(16, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 16)}),
       },
       ast::StructDecorationList{});
 
@@ -1219,7 +1219,7 @@
 
   ast::type::Array ary(&data, 4,
                        ast::ArrayDecorationList{
-                           create<ast::StrideDecoration>(32, Source{}),
+                           create<ast::StrideDecoration>(Source{}, 32),
                        });
 
   auto* pre_str = create<ast::Struct>(
@@ -1227,7 +1227,7 @@
       ast::StructMemberList{create<ast::StructMember>(
           Source{}, "c", &ary,
           ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})})},
+              create<ast::StructMemberOffsetDecoration>(Source{}, 0)})},
       ast::StructDecorationList{});
 
   ast::type::Struct pre_struct(mod.RegisterSymbol("Pre"), "Pre", pre_str);
@@ -1297,11 +1297,11 @@
           create<ast::StructMember>(
               Source{}, "a", &ivec3,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 0)}),
           create<ast::StructMember>(
               Source{}, "b", &fvec3,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(16, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 16)}),
       },
       ast::StructDecorationList{});
 
@@ -1309,7 +1309,7 @@
 
   ast::type::Array ary(&data, 4,
                        ast::ArrayDecorationList{
-                           create<ast::StrideDecoration>(32, Source{}),
+                           create<ast::StrideDecoration>(Source{}, 32),
                        });
 
   auto* pre_str = create<ast::Struct>(
@@ -1317,7 +1317,7 @@
       ast::StructMemberList{create<ast::StructMember>(
           Source{}, "c", &ary,
           ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})})},
+              create<ast::StructMemberOffsetDecoration>(Source{}, 0)})},
       ast::StructDecorationList{});
 
   ast::type::Struct pre_struct(mod.RegisterSymbol("Pre"), "Pre", pre_str);
@@ -1387,11 +1387,11 @@
           create<ast::StructMember>(
               Source{}, "a", &ivec3,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 0)}),
           create<ast::StructMember>(
               Source{}, "b", &fvec3,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(16, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 16)}),
       },
       ast::StructDecorationList{});
 
@@ -1399,7 +1399,7 @@
 
   ast::type::Array ary(&data, 4,
                        ast::ArrayDecorationList{
-                           create<ast::StrideDecoration>(32, Source{}),
+                           create<ast::StrideDecoration>(Source{}, 32),
                        });
 
   auto* pre_str = create<ast::Struct>(
@@ -1407,7 +1407,7 @@
       ast::StructMemberList{create<ast::StructMember>(
           Source{}, "c", &ary,
           ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})})},
+              create<ast::StructMemberOffsetDecoration>(Source{}, 0)})},
       ast::StructDecorationList{});
 
   ast::type::Struct pre_struct(mod.RegisterSymbol("Pre"), "Pre", pre_str);
@@ -1487,11 +1487,11 @@
           create<ast::StructMember>(
               Source{}, "a", &ivec3,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 0)}),
           create<ast::StructMember>(
               Source{}, "b", &fvec3,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(16, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 16)}),
       },
       ast::StructDecorationList{});
 
@@ -1499,7 +1499,7 @@
 
   ast::type::Array ary(&data, 4,
                        ast::ArrayDecorationList{
-                           create<ast::StrideDecoration>(32, Source{}),
+                           create<ast::StrideDecoration>(Source{}, 32),
                        });
 
   auto* pre_str = create<ast::Struct>(
@@ -1507,7 +1507,7 @@
       ast::StructMemberList{create<ast::StructMember>(
           Source{}, "c", &ary,
           ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})})},
+              create<ast::StructMemberOffsetDecoration>(Source{}, 0)})},
       ast::StructDecorationList{});
 
   ast::type::Struct pre_struct(mod.RegisterSymbol("Pre"), "Pre", pre_str);
diff --git a/src/writer/hlsl/generator_impl_module_constant_test.cc b/src/writer/hlsl/generator_impl_module_constant_test.cc
index bb2287b..401c6df 100644
--- a/src/writer/hlsl/generator_impl_module_constant_test.cc
+++ b/src/writer/hlsl/generator_impl_module_constant_test.cc
@@ -72,7 +72,7 @@
           create<ast::FloatLiteral>(Source{}, &f32, 3.0f)),  // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::ConstantIdDecoration>(23, Source{}),
+          create<ast::ConstantIdDecoration>(Source{}, 23),
       });
 
   ASSERT_TRUE(gen.EmitProgramConstVariable(out, var)) << gen.error();
@@ -96,7 +96,7 @@
                             nullptr,                   // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::ConstantIdDecoration>(23, Source{}),
+                                create<ast::ConstantIdDecoration>(Source{}, 23),
                             });
 
   ASSERT_TRUE(gen.EmitProgramConstVariable(out, var)) << gen.error();
diff --git a/src/writer/hlsl/generator_impl_type_test.cc b/src/writer/hlsl/generator_impl_type_test.cc
index 9ad6beb..fdd19c8 100644
--- a/src/writer/hlsl/generator_impl_type_test.cc
+++ b/src/writer/hlsl/generator_impl_type_test.cc
@@ -178,7 +178,7 @@
       Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -203,7 +203,7 @@
       Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -220,15 +220,15 @@
   ast::type::F32 f32;
 
   ast::StructMemberDecorationList decos;
-  decos.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
 
   ast::StructMemberList members;
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, decos));
 
-  decos.push_back(create<ast::StructMemberOffsetDecoration>(32, Source{}));
+  decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 32));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, decos));
 
-  decos.push_back(create<ast::StructMemberOffsetDecoration>(128, Source{}));
+  decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 128));
   members.push_back(create<ast::StructMember>(Source{}, "c", &f32, decos));
 
   auto* str =
@@ -281,7 +281,7 @@
       Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   ast::StructDecorationList decos;
diff --git a/src/writer/msl/generator_impl_alias_type_test.cc b/src/writer/msl/generator_impl_alias_type_test.cc
index 1e88617..1726f1c 100644
--- a/src/writer/msl/generator_impl_alias_type_test.cc
+++ b/src/writer/msl/generator_impl_alias_type_test.cc
@@ -58,7 +58,7 @@
       Source{}, "a", &f32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &i32, b_deco));
 
   auto* str =
@@ -83,7 +83,7 @@
       Source{}, "a", &f32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &i32, b_deco));
 
   auto* str =
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 49dd561..d5b4535 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
@@ -59,7 +59,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -71,7 +71,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -99,7 +99,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("vtx_main"), "vtx_main", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
 
   mod.AddFunction(func);
@@ -136,7 +136,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -148,7 +148,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -176,7 +176,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("vtx_main"), "vtx_main", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
 
   mod.AddFunction(func);
@@ -213,7 +213,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -225,7 +225,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -253,7 +253,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -290,7 +290,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -302,7 +302,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -330,7 +330,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -364,7 +364,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -376,7 +376,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -404,7 +404,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
       });
 
   mod.AddFunction(func);
@@ -433,7 +433,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -445,7 +445,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -473,7 +473,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &f32, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
       });
 
   mod.AddFunction(func);
@@ -508,7 +508,7 @@
       nullptr,                    // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragCoord, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragCoord),
       });
 
   auto* depth_var = create<ast::Variable>(
@@ -520,7 +520,7 @@
       nullptr,                     // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragDepth),
       });
 
   td.RegisterVariableForTesting(coord_var);
@@ -547,7 +547,7 @@
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
diff --git a/src/writer/msl/generator_impl_function_test.cc b/src/writer/msl/generator_impl_function_test.cc
index c328b9e..3b003c9 100644
--- a/src/writer/msl/generator_impl_function_test.cc
+++ b/src/writer/msl/generator_impl_function_test.cc
@@ -164,7 +164,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -176,7 +176,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -200,7 +200,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{create<ast::StageDecoration>(
-          ast::PipelineStage::kFragment, Source{})});
+          Source{}, ast::PipelineStage::kFragment)});
 
   mod.AddFunction(func);
 
@@ -241,7 +241,7 @@
       nullptr,                    // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragCoord, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragCoord),
       });
 
   auto* depth_var = create<ast::Variable>(
@@ -253,7 +253,7 @@
       nullptr,                     // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragDepth),
       });
 
   td.RegisterVariableForTesting(coord_var);
@@ -281,7 +281,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -318,8 +318,8 @@
                             nullptr,                      // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(1, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(coord_var);
@@ -350,7 +350,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -376,11 +376,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -400,8 +400,8 @@
                             nullptr,                            // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(1, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(coord_var);
@@ -432,7 +432,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -462,11 +462,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -486,8 +486,8 @@
                             nullptr,                            // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(1, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(coord_var);
@@ -519,7 +519,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -557,7 +557,7 @@
                             nullptr,                    // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   auto* bar_var =
@@ -569,7 +569,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   auto* val_var =
@@ -581,7 +581,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(0, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 0),
                             });
 
   td.RegisterVariableForTesting(foo_var);
@@ -648,7 +648,7 @@
   auto* func_1 = create<ast::Function>(
       Source{}, mod.RegisterSymbol("ep_1"), "ep_1", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func_1);
@@ -697,7 +697,7 @@
       nullptr,                     // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragDepth),
       });
 
   td.RegisterVariableForTesting(depth_var);
@@ -749,7 +749,7 @@
   auto* func_1 = create<ast::Function>(
       Source{}, mod.RegisterSymbol("ep_1"), "ep_1", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func_1);
@@ -792,7 +792,7 @@
       nullptr,                    // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragCoord, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragCoord),
       });
 
   auto* depth_var = create<ast::Variable>(
@@ -804,7 +804,7 @@
       nullptr,                     // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kFragDepth),
       });
 
   td.RegisterVariableForTesting(coord_var);
@@ -867,7 +867,7 @@
   auto* func_1 = create<ast::Function>(
       Source{}, mod.RegisterSymbol("ep_1"), "ep_1", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func_1);
@@ -909,8 +909,8 @@
                             nullptr,                      // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(1, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(coord_var);
@@ -971,7 +971,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -1000,11 +1000,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -1024,8 +1024,8 @@
                             nullptr,                            // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(1, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(coord_var);
@@ -1085,7 +1085,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -1120,11 +1120,11 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -1144,8 +1144,8 @@
                             nullptr,                            // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(1, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(coord_var);
@@ -1205,7 +1205,7 @@
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
       &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func);
@@ -1247,7 +1247,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(1, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 1),
                             });
 
   td.RegisterVariableForTesting(bar_var);
@@ -1283,7 +1283,7 @@
   auto* func_1 = create<ast::Function>(
       Source{}, mod.RegisterSymbol("ep_1"), "ep_1", params, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   mod.AddFunction(func_1);
@@ -1316,7 +1316,7 @@
       Source{}, mod.RegisterSymbol("main"), "main", ast::VariableList{},
       &void_type, create<ast::BlockStatement>(Source{}, ast::StatementList{}),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
       });
 
   mod.AddFunction(func);
@@ -1392,7 +1392,7 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "d", &f32, a_deco));
 
   ast::StructDecorationList s_decos;
@@ -1412,8 +1412,8 @@
                             nullptr,                            // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(0, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 0),
                             });
 
   mod.AddConstructedType(&s);
@@ -1445,8 +1445,8 @@
     auto* func = create<ast::Function>(
         Source{}, mod.RegisterSymbol("a"), "a", params, &void_type, body,
         ast::FunctionDecorationList{
-            create<ast::StageDecoration>(ast::PipelineStage::kCompute,
-                                         Source{}),
+            create<ast::StageDecoration>(Source{},
+                                         ast::PipelineStage::kCompute),
         });
 
     mod.AddFunction(func);
@@ -1476,8 +1476,8 @@
     auto* func = create<ast::Function>(
         Source{}, mod.RegisterSymbol("b"), "b", params, &void_type, body,
         ast::FunctionDecorationList{
-            create<ast::StageDecoration>(ast::PipelineStage::kCompute,
-                                         Source{}),
+            create<ast::StageDecoration>(Source{},
+                                         ast::PipelineStage::kCompute),
         });
 
     mod.AddFunction(func);
diff --git a/src/writer/msl/generator_impl_module_constant_test.cc b/src/writer/msl/generator_impl_module_constant_test.cc
index 80756e3..44e39d2 100644
--- a/src/writer/msl/generator_impl_module_constant_test.cc
+++ b/src/writer/msl/generator_impl_module_constant_test.cc
@@ -74,7 +74,7 @@
           create<ast::FloatLiteral>(Source{}, &f32, 3.0f)),  // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::ConstantIdDecoration>(23, Source{}),
+          create<ast::ConstantIdDecoration>(Source{}, 23),
       });
 
   ASSERT_TRUE(gen.EmitProgramConstVariable(var)) << gen.error();
diff --git a/src/writer/msl/generator_impl_test.cc b/src/writer/msl/generator_impl_test.cc
index 72e0cd3..861473a 100644
--- a/src/writer/msl/generator_impl_test.cc
+++ b/src/writer/msl/generator_impl_test.cc
@@ -54,7 +54,7 @@
       Source{}, mod.RegisterSymbol("my_func"), "my_func", ast::VariableList{},
       &void_type, create<ast::BlockStatement>(Source{}, ast::StatementList{}),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
       });
   mod.AddFunction(func);
 
@@ -160,15 +160,15 @@
   ast::type::F32 f32;
 
   ast::StructMemberDecorationList decos;
-  decos.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
 
   ast::StructMemberList members;
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, decos));
 
-  decos.push_back(create<ast::StructMemberOffsetDecoration>(32, Source{}));
+  decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 32));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, decos));
 
-  decos.push_back(create<ast::StructMemberOffsetDecoration>(128, Source{}));
+  decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 128));
   members.push_back(create<ast::StructMember>(Source{}, "c", &f32, decos));
 
   auto* str =
@@ -185,15 +185,15 @@
   ast::type::Vector fvec(&f32, 3);
 
   ast::StructMemberDecorationList decos;
-  decos.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
 
   ast::StructMemberList members;
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, decos));
 
-  decos.push_back(create<ast::StructMemberOffsetDecoration>(16, Source{}));
+  decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 16));
   members.push_back(create<ast::StructMember>(Source{}, "b", &fvec, decos));
 
-  decos.push_back(create<ast::StructMemberOffsetDecoration>(32, Source{}));
+  decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 32));
   members.push_back(create<ast::StructMember>(Source{}, "c", &f32, decos));
 
   auto* inner_str =
@@ -201,13 +201,13 @@
 
   ast::type::Struct inner_s(mod.RegisterSymbol("Inner"), "Inner", inner_str);
 
-  decos.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "d", &f32, decos));
 
-  decos.push_back(create<ast::StructMemberOffsetDecoration>(32, Source{}));
+  decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 32));
   members.push_back(create<ast::StructMember>(Source{}, "e", &inner_s, decos));
 
-  decos.push_back(create<ast::StructMemberOffsetDecoration>(64, Source{}));
+  decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 64));
   members.push_back(create<ast::StructMember>(Source{}, "f", &f32, decos));
 
   auto* outer_str =
diff --git a/src/writer/msl/generator_impl_type_test.cc b/src/writer/msl/generator_impl_type_test.cc
index b372518..07321f5 100644
--- a/src/writer/msl/generator_impl_type_test.cc
+++ b/src/writer/msl/generator_impl_type_test.cc
@@ -179,7 +179,7 @@
       Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -200,7 +200,7 @@
       Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -226,15 +226,15 @@
           create<ast::StructMember>(
               Source{}, "a", &i32,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(4, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 4)}),
           create<ast::StructMember>(
               Source{}, "b", &f32,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(32, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 32)}),
           create<ast::StructMember>(
               Source{}, "c", &f32,
               ast::StructMemberDecorationList{
-                  create<ast::StructMemberOffsetDecoration>(128, Source{})}),
+                  create<ast::StructMemberOffsetDecoration>(Source{}, 128)}),
       },
       ast::StructDecorationList{});
 
@@ -286,7 +286,7 @@
       Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   ast::StructDecorationList decos;
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 c575744..1027d10 100644
--- a/src/writer/msl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/msl/generator_impl_variable_decl_statement_test.cc
@@ -107,7 +107,7 @@
       Source{}, "a", &f32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
diff --git a/src/writer/spirv/builder_function_decoration_test.cc b/src/writer/spirv/builder_function_decoration_test.cc
index 6ca5f03..fe8fc51 100644
--- a/src/writer/spirv/builder_function_decoration_test.cc
+++ b/src/writer/spirv/builder_function_decoration_test.cc
@@ -45,7 +45,7 @@
       Source{}, mod->RegisterSymbol("main"), "main", {}, &void_type,
       create<ast::BlockStatement>(Source{}, ast::StatementList{}),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -72,7 +72,7 @@
       Source{}, mod->RegisterSymbol("main"), "main", {}, &void_type,
       create<ast::BlockStatement>(Source{}, ast::StatementList{}),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(params.stage, Source{}),
+          create<ast::StageDecoration>(Source{}, params.stage),
       });
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -102,7 +102,7 @@
       Source{}, mod->RegisterSymbol("main"), "main", {}, &void_type,
       create<ast::BlockStatement>(Source{}, ast::StatementList{}),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
 
   auto* v_in =
@@ -191,7 +191,7 @@
   ast::Function func(
       Source{}, mod->RegisterSymbol("main"), "main", {}, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
       });
 
   auto* v_in =
@@ -262,7 +262,7 @@
       Source{}, mod->RegisterSymbol("main"), "main", {}, &void_type,
       create<ast::BlockStatement>(Source{}, ast::StatementList{}),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   ASSERT_TRUE(b.GenerateExecutionModes(&func, 3)) << b.error();
@@ -278,7 +278,7 @@
       Source{}, mod->RegisterSymbol("main"), "main", {}, &void_type,
       create<ast::BlockStatement>(Source{}, ast::StatementList{}),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
       });
 
   ASSERT_TRUE(b.GenerateExecutionModes(&func, 3)) << b.error();
@@ -294,8 +294,8 @@
       Source{}, mod->RegisterSymbol("main"), "main", {}, &void_type,
       create<ast::BlockStatement>(Source{}, ast::StatementList{}),
       ast::FunctionDecorationList{
-          create<ast::WorkgroupDecoration>(2u, 4u, 6u, Source{}),
-          create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
+          create<ast::WorkgroupDecoration>(Source{}, 2u, 4u, 6u),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
       });
 
   ASSERT_TRUE(b.GenerateExecutionModes(&func, 3)) << b.error();
@@ -311,14 +311,14 @@
       Source{}, mod->RegisterSymbol("main1"), "main1", {}, &void_type,
       create<ast::BlockStatement>(Source{}, ast::StatementList{}),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   ast::Function func2(
       Source{}, mod->RegisterSymbol("main2"), "main2", {}, &void_type,
       create<ast::BlockStatement>(Source{}, ast::StatementList{}),
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   ASSERT_TRUE(b.GenerateFunction(&func1)) << b.error();
diff --git a/src/writer/spirv/builder_function_test.cc b/src/writer/spirv/builder_function_test.cc
index c386df2..4564a6b 100644
--- a/src/writer/spirv/builder_function_test.cc
+++ b/src/writer/spirv/builder_function_test.cc
@@ -274,7 +274,7 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "d", &f32, a_deco));
 
   ast::StructDecorationList s_decos;
@@ -294,8 +294,8 @@
                             nullptr,                            // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(0, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 0),
                             });
 
   mod->AddConstructedType(&s);
@@ -328,8 +328,8 @@
     auto* func = create<ast::Function>(
         Source{}, mod->RegisterSymbol("a"), "a", params, &void_type, body,
         ast::FunctionDecorationList{
-            create<ast::StageDecoration>(ast::PipelineStage::kCompute,
-                                         Source{}),
+            create<ast::StageDecoration>(Source{},
+                                         ast::PipelineStage::kCompute),
         });
 
     mod->AddFunction(func);
@@ -360,8 +360,8 @@
     auto* func = create<ast::Function>(
         Source{}, mod->RegisterSymbol("b"), "b", params, &void_type, body,
         ast::FunctionDecorationList{
-            create<ast::StageDecoration>(ast::PipelineStage::kCompute,
-                                         Source{}),
+            create<ast::StageDecoration>(Source{},
+                                         ast::PipelineStage::kCompute),
         });
 
     mod->AddFunction(func);
diff --git a/src/writer/spirv/builder_global_variable_test.cc b/src/writer/spirv/builder_global_variable_test.cc
index 86d8f19..9a5b495 100644
--- a/src/writer/spirv/builder_global_variable_test.cc
+++ b/src/writer/spirv/builder_global_variable_test.cc
@@ -251,7 +251,7 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::LocationDecoration>(5, Source{}),
+                                create<ast::LocationDecoration>(Source{}, 5),
                             });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -277,8 +277,8 @@
                             nullptr,                     // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(2, Source{}),
-                                create<ast::SetDecoration>(3, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 2),
+                                create<ast::SetDecoration>(Source{}, 3),
                             });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -305,7 +305,7 @@
       nullptr,                     // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::BuiltinDecoration>(ast::Builtin::kPosition, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kPosition),
       });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -334,7 +334,7 @@
           create<ast::BoolLiteral>(Source{}, &bool_type, true)),  // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::ConstantIdDecoration>(1200, Source{}),
+          create<ast::ConstantIdDecoration>(Source{}, 1200),
       });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -361,7 +361,7 @@
       nullptr,                   // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::ConstantIdDecoration>(1200, Source{}),
+          create<ast::ConstantIdDecoration>(Source{}, 1200),
       });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -390,7 +390,7 @@
           create<ast::FloatLiteral>(Source{}, &f32, 2.0)),  // constructor
       ast::VariableDecorationList{
           // decorations
-          create<ast::ConstantIdDecoration>(0, Source{}),
+          create<ast::ConstantIdDecoration>(Source{}, 0),
       });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -417,7 +417,7 @@
                             nullptr,                   // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::ConstantIdDecoration>(0, Source{}),
+                                create<ast::ConstantIdDecoration>(Source{}, 0),
                             });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -444,7 +444,7 @@
                             nullptr,                   // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::ConstantIdDecoration>(0, Source{}),
+                                create<ast::ConstantIdDecoration>(Source{}, 0),
                             });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -471,7 +471,7 @@
                             nullptr,                   // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::ConstantIdDecoration>(0, Source{}),
+                                create<ast::ConstantIdDecoration>(Source{}, 0),
                             });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
diff --git a/src/writer/spirv/builder_type_test.cc b/src/writer/spirv/builder_type_test.cc
index 2ed7ffb..2390826 100644
--- a/src/writer/spirv/builder_type_test.cc
+++ b/src/writer/spirv/builder_type_test.cc
@@ -125,7 +125,7 @@
 
   ast::type::Array ary(&i32, 4,
                        ast::ArrayDecorationList{
-                           create<ast::StrideDecoration>(16u, Source{}),
+                           create<ast::StrideDecoration>(Source{}, 16u),
                        });
 
   auto id = b.GenerateTypeIfNeeded(&ary);
@@ -346,9 +346,9 @@
   ast::type::F32 f32;
 
   ast::StructMemberDecorationList a_decos;
-  a_decos.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   ast::StructMemberDecorationList b_decos;
-  b_decos.push_back(create<ast::StructMemberOffsetDecoration>(8, Source{}));
+  b_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 8));
 
   ast::StructMemberList members;
   members.push_back(create<ast::StructMember>(Source{}, "a", &f32, a_decos));
@@ -423,11 +423,11 @@
   ast::type::Matrix glsl_mat4x4(&f32, 4, 4);
 
   ast::StructMemberDecorationList a_decos;
-  a_decos.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   ast::StructMemberDecorationList b_decos;
-  b_decos.push_back(create<ast::StructMemberOffsetDecoration>(16, Source{}));
+  b_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 16));
   ast::StructMemberDecorationList c_decos;
-  c_decos.push_back(create<ast::StructMemberOffsetDecoration>(48, Source{}));
+  c_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 48));
 
   ast::StructMemberList members;
   members.push_back(
@@ -490,11 +490,11 @@
                                 ast::ArrayDecorationList{});  // Runtime array
 
   ast::StructMemberDecorationList a_decos;
-  a_decos.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   ast::StructMemberDecorationList b_decos;
-  b_decos.push_back(create<ast::StructMemberOffsetDecoration>(16, Source{}));
+  b_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 16));
   ast::StructMemberDecorationList c_decos;
-  c_decos.push_back(create<ast::StructMemberOffsetDecoration>(48, Source{}));
+  c_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 48));
 
   ast::StructMemberList members;
   members.push_back(
diff --git a/src/writer/wgsl/generator_impl_alias_type_test.cc b/src/writer/wgsl/generator_impl_alias_type_test.cc
index 7a4da55..1bbc96b 100644
--- a/src/writer/wgsl/generator_impl_alias_type_test.cc
+++ b/src/writer/wgsl/generator_impl_alias_type_test.cc
@@ -48,7 +48,7 @@
       Source{}, "a", &f32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &i32, b_deco));
 
   auto* str =
@@ -77,7 +77,7 @@
       Source{}, "a", &f32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &i32, b_deco));
 
   auto* str =
diff --git a/src/writer/wgsl/generator_impl_function_test.cc b/src/writer/wgsl/generator_impl_function_test.cc
index 061a623..9909f45 100644
--- a/src/writer/wgsl/generator_impl_function_test.cc
+++ b/src/writer/wgsl/generator_impl_function_test.cc
@@ -110,7 +110,7 @@
   ast::Function func(Source{}, mod.RegisterSymbol("my_func"), "my_func", {},
                      &void_type, body,
                      ast::FunctionDecorationList{
-                         create<ast::WorkgroupDecoration>(2u, 4u, 6u, Source{}),
+                         create<ast::WorkgroupDecoration>(Source{}, 2u, 4u, 6u),
                      });
 
   gen.increment_indent();
@@ -134,7 +134,7 @@
   ast::Function func(
       Source{}, mod.RegisterSymbol("my_func"), "my_func", {}, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
       });
 
   gen.increment_indent();
@@ -158,8 +158,8 @@
   ast::Function func(
       Source{}, mod.RegisterSymbol("my_func"), "my_func", {}, &void_type, body,
       ast::FunctionDecorationList{
-          create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
-          create<ast::WorkgroupDecoration>(2u, 4u, 6u, Source{}),
+          create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
+          create<ast::WorkgroupDecoration>(Source{}, 2u, 4u, 6u),
       });
 
   gen.increment_indent();
@@ -197,7 +197,7 @@
 
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
-  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
+  a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
   members.push_back(create<ast::StructMember>(Source{}, "d", &f32, a_deco));
 
   ast::StructDecorationList s_decos;
@@ -217,8 +217,8 @@
                             nullptr,                            // constructor
                             ast::VariableDecorationList{
                                 // decorations
-                                create<ast::BindingDecoration>(0, Source{}),
-                                create<ast::SetDecoration>(0, Source{}),
+                                create<ast::BindingDecoration>(Source{}, 0),
+                                create<ast::SetDecoration>(Source{}, 0),
                             });
 
   mod.AddConstructedType(&s);
@@ -250,8 +250,8 @@
     auto* func = create<ast::Function>(
         Source{}, mod.RegisterSymbol("a"), "a", params, &void_type, body,
         ast::FunctionDecorationList{
-            create<ast::StageDecoration>(ast::PipelineStage::kCompute,
-                                         Source{}),
+            create<ast::StageDecoration>(Source{},
+                                         ast::PipelineStage::kCompute),
         });
 
     mod.AddFunction(func);
@@ -281,8 +281,8 @@
     auto* func = create<ast::Function>(
         Source{}, mod.RegisterSymbol("b"), "b", params, &void_type, body,
         ast::FunctionDecorationList{
-            create<ast::StageDecoration>(ast::PipelineStage::kCompute,
-                                         Source{}),
+            create<ast::StageDecoration>(Source{},
+                                         ast::PipelineStage::kCompute),
         });
 
     mod.AddFunction(func);
diff --git a/src/writer/wgsl/generator_impl_type_test.cc b/src/writer/wgsl/generator_impl_type_test.cc
index 32dbf55..ff533a8 100644
--- a/src/writer/wgsl/generator_impl_type_test.cc
+++ b/src/writer/wgsl/generator_impl_type_test.cc
@@ -107,7 +107,7 @@
   ast::type::Bool b;
   ast::type::Array a(&b, 4,
                      ast::ArrayDecorationList{
-                         create<ast::StrideDecoration>(16u, Source{}),
+                         create<ast::StrideDecoration>(Source{}, 16u),
                      });
 
   ASSERT_TRUE(gen.EmitType(&a)) << gen.error();
@@ -118,8 +118,8 @@
   ast::type::Bool b;
   ast::type::Array a(&b, 4,
                      ast::ArrayDecorationList{
-                         create<ast::StrideDecoration>(16u, Source{}),
-                         create<ast::StrideDecoration>(32u, Source{}),
+                         create<ast::StrideDecoration>(Source{}, 16u),
+                         create<ast::StrideDecoration>(Source{}, 32u),
                      });
 
   ASSERT_TRUE(gen.EmitType(&a)) << gen.error();
@@ -180,7 +180,7 @@
       Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -201,7 +201,7 @@
       Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str =
@@ -227,7 +227,7 @@
       Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
+  b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   ast::StructDecorationList decos;
diff --git a/src/writer/wgsl/generator_impl_variable_test.cc b/src/writer/wgsl/generator_impl_variable_test.cc
index 6583725..3c9878c 100644
--- a/src/writer/wgsl/generator_impl_variable_test.cc
+++ b/src/writer/wgsl/generator_impl_variable_test.cc
@@ -58,7 +58,7 @@
 
   ast::Variable v(Source{}, "a", ast::StorageClass::kNone, &f32, false, nullptr,
                   ast::VariableDecorationList{
-                      create<ast::LocationDecoration>(2, Source{}),
+                      create<ast::LocationDecoration>(Source{}, 2),
                   });
 
   ASSERT_TRUE(gen.EmitVariable(&v)) << gen.error();
@@ -72,11 +72,11 @@
   ast::Variable v(
       Source{}, "a", ast::StorageClass::kNone, &f32, false, nullptr,
       ast::VariableDecorationList{
-          create<ast::BuiltinDecoration>(ast::Builtin::kPosition, Source{}),
-          create<ast::BindingDecoration>(0, Source{}),
-          create<ast::SetDecoration>(1, Source{}),
-          create<ast::LocationDecoration>(2, Source{}),
-          create<ast::ConstantIdDecoration>(42, Source{}),
+          create<ast::BuiltinDecoration>(Source{}, ast::Builtin::kPosition),
+          create<ast::BindingDecoration>(Source{}, 0),
+          create<ast::SetDecoration>(Source{}, 1),
+          create<ast::LocationDecoration>(Source{}, 2),
+          create<ast::ConstantIdDecoration>(Source{}, 42),
       });
 
   ASSERT_TRUE(gen.EmitVariable(&v)) << gen.error();