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}