[tint][wgsl] Expand module-scope declaration sources to cover whole decl

Expand 'var', 'override', 'const' and 'struct' declaration sources to
cover the span from the first token to the last token. Each of these
have a name which has the same source range as before.

Bug: tint:2127
Change-Id: I4e671e23d006b8fb6e12c9d2ce12c7fca39b0e6b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/179102
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/lang/wgsl/reader/parser/global_constant_decl_test.cc b/src/tint/lang/wgsl/reader/parser/global_constant_decl_test.cc
index c80de54..904da07 100644
--- a/src/tint/lang/wgsl/reader/parser/global_constant_decl_test.cc
+++ b/src/tint/lang/wgsl/reader/parser/global_constant_decl_test.cc
@@ -61,9 +61,14 @@
     ast::CheckIdentifier(c->type, "f32");
 
     EXPECT_EQ(c->source.range.begin.line, 1u);
-    EXPECT_EQ(c->source.range.begin.column, 7u);
+    EXPECT_EQ(c->source.range.begin.column, 1u);
     EXPECT_EQ(c->source.range.end.line, 1u);
-    EXPECT_EQ(c->source.range.end.column, 8u);
+    EXPECT_EQ(c->source.range.end.column, 19u);
+
+    EXPECT_EQ(c->name->source.range.begin.line, 1u);
+    EXPECT_EQ(c->name->source.range.begin.column, 7u);
+    EXPECT_EQ(c->name->source.range.end.line, 1u);
+    EXPECT_EQ(c->name->source.range.end.column, 8u);
 
     ASSERT_NE(c->initializer, nullptr);
     EXPECT_TRUE(c->initializer->Is<ast::LiteralExpression>());
@@ -85,9 +90,14 @@
     EXPECT_EQ(c->type, nullptr);
 
     EXPECT_EQ(c->source.range.begin.line, 1u);
-    EXPECT_EQ(c->source.range.begin.column, 7u);
+    EXPECT_EQ(c->source.range.begin.column, 1u);
     EXPECT_EQ(c->source.range.end.line, 1u);
-    EXPECT_EQ(c->source.range.end.column, 8u);
+    EXPECT_EQ(c->source.range.end.column, 13u);
+
+    EXPECT_EQ(c->name->source.range.begin.line, 1u);
+    EXPECT_EQ(c->name->source.range.begin.column, 7u);
+    EXPECT_EQ(c->name->source.range.end.line, 1u);
+    EXPECT_EQ(c->name->source.range.end.column, 8u);
 
     ASSERT_NE(c->initializer, nullptr);
     EXPECT_TRUE(c->initializer->Is<ast::LiteralExpression>());
@@ -137,9 +147,14 @@
     ast::CheckIdentifier(override->type, "f32");
 
     EXPECT_EQ(override->source.range.begin.line, 1u);
-    EXPECT_EQ(override->source.range.begin.column, 17u);
+    EXPECT_EQ(override->source.range.begin.column, 8u);
     EXPECT_EQ(override->source.range.end.line, 1u);
-    EXPECT_EQ(override->source.range.end.column, 18u);
+    EXPECT_EQ(override->source.range.end.column, 29u);
+
+    EXPECT_EQ(override->name->source.range.begin.line, 1u);
+    EXPECT_EQ(override->name->source.range.begin.column, 17u);
+    EXPECT_EQ(override->name->source.range.end.line, 1u);
+    EXPECT_EQ(override->name->source.range.end.column, 18u);
 
     ASSERT_NE(override->initializer, nullptr);
     EXPECT_TRUE(override->initializer->Is<ast::LiteralExpression>());
@@ -167,9 +182,14 @@
     ast::CheckIdentifier(override->type, "f32");
 
     EXPECT_EQ(override->source.range.begin.line, 1u);
-    EXPECT_EQ(override->source.range.begin.column, 18u);
+    EXPECT_EQ(override->source.range.begin.column, 9u);
     EXPECT_EQ(override->source.range.end.line, 1u);
-    EXPECT_EQ(override->source.range.end.column, 19u);
+    EXPECT_EQ(override->source.range.end.column, 30u);
+
+    EXPECT_EQ(override->name->source.range.begin.line, 1u);
+    EXPECT_EQ(override->name->source.range.begin.column, 18u);
+    EXPECT_EQ(override->name->source.range.end.line, 1u);
+    EXPECT_EQ(override->name->source.range.end.column, 19u);
 
     ASSERT_NE(override->initializer, nullptr);
     EXPECT_TRUE(override->initializer->Is<ast::LiteralExpression>());
@@ -197,9 +217,14 @@
     ast::CheckIdentifier(override->type, "f32");
 
     EXPECT_EQ(override->source.range.begin.line, 1u);
-    EXPECT_EQ(override->source.range.begin.column, 10u);
+    EXPECT_EQ(override->source.range.begin.column, 1u);
     EXPECT_EQ(override->source.range.end.line, 1u);
-    EXPECT_EQ(override->source.range.end.column, 11u);
+    EXPECT_EQ(override->source.range.end.column, 22u);
+
+    EXPECT_EQ(override->name->source.range.begin.line, 1u);
+    EXPECT_EQ(override->name->source.range.begin.column, 10u);
+    EXPECT_EQ(override->name->source.range.end.line, 1u);
+    EXPECT_EQ(override->name->source.range.end.column, 11u);
 
     ASSERT_NE(override->initializer, nullptr);
     EXPECT_TRUE(override->initializer->Is<ast::LiteralExpression>());
diff --git a/src/tint/lang/wgsl/reader/parser/global_variable_decl_test.cc b/src/tint/lang/wgsl/reader/parser/global_variable_decl_test.cc
index 4105d12..d53b6f7 100644
--- a/src/tint/lang/wgsl/reader/parser/global_variable_decl_test.cc
+++ b/src/tint/lang/wgsl/reader/parser/global_variable_decl_test.cc
@@ -48,9 +48,14 @@
     ast::CheckIdentifier(var->declared_address_space, "private");
 
     EXPECT_EQ(var->source.range.begin.line, 1u);
-    EXPECT_EQ(var->source.range.begin.column, 14u);
+    EXPECT_EQ(var->source.range.begin.column, 1u);
     EXPECT_EQ(var->source.range.end.line, 1u);
-    EXPECT_EQ(var->source.range.end.column, 15u);
+    EXPECT_EQ(var->source.range.end.column, 21u);
+
+    EXPECT_EQ(var->name->source.range.begin.line, 1u);
+    EXPECT_EQ(var->name->source.range.begin.column, 14u);
+    EXPECT_EQ(var->name->source.range.end.line, 1u);
+    EXPECT_EQ(var->name->source.range.end.column, 15u);
 
     ASSERT_EQ(var->initializer, nullptr);
 }
@@ -72,9 +77,14 @@
     ast::CheckIdentifier(var->declared_address_space, "private");
 
     EXPECT_EQ(var->source.range.begin.line, 1u);
-    EXPECT_EQ(var->source.range.begin.column, 14u);
+    EXPECT_EQ(var->source.range.begin.column, 1u);
     EXPECT_EQ(var->source.range.end.line, 1u);
-    EXPECT_EQ(var->source.range.end.column, 15u);
+    EXPECT_EQ(var->source.range.end.column, 26u);
+
+    EXPECT_EQ(var->name->source.range.begin.line, 1u);
+    EXPECT_EQ(var->name->source.range.begin.column, 14u);
+    EXPECT_EQ(var->name->source.range.end.line, 1u);
+    EXPECT_EQ(var->name->source.range.end.column, 15u);
 
     ASSERT_NE(var->initializer, nullptr);
     ASSERT_TRUE(var->initializer->Is<ast::FloatLiteralExpression>());
@@ -97,9 +107,14 @@
     ast::CheckIdentifier(var->declared_address_space, "uniform");
 
     EXPECT_EQ(var->source.range.begin.line, 1u);
-    EXPECT_EQ(var->source.range.begin.column, 36u);
+    EXPECT_EQ(var->source.range.begin.column, 23u);
     EXPECT_EQ(var->source.range.end.line, 1u);
-    EXPECT_EQ(var->source.range.end.column, 37u);
+    EXPECT_EQ(var->source.range.end.column, 43u);
+
+    EXPECT_EQ(var->name->source.range.begin.line, 1u);
+    EXPECT_EQ(var->name->source.range.begin.column, 36u);
+    EXPECT_EQ(var->name->source.range.end.line, 1u);
+    EXPECT_EQ(var->name->source.range.end.column, 37u);
 
     ASSERT_EQ(var->initializer, nullptr);
 
@@ -127,9 +142,14 @@
     ast::CheckIdentifier(var->declared_address_space, "uniform");
 
     EXPECT_EQ(var->source.range.begin.line, 1u);
-    EXPECT_EQ(var->source.range.begin.column, 36u);
+    EXPECT_EQ(var->source.range.begin.column, 23u);
     EXPECT_EQ(var->source.range.end.line, 1u);
-    EXPECT_EQ(var->source.range.end.column, 37u);
+    EXPECT_EQ(var->source.range.end.column, 43u);
+
+    EXPECT_EQ(var->name->source.range.begin.line, 1u);
+    EXPECT_EQ(var->name->source.range.begin.column, 36u);
+    EXPECT_EQ(var->name->source.range.end.line, 1u);
+    EXPECT_EQ(var->name->source.range.end.column, 37u);
 
     ASSERT_EQ(var->initializer, nullptr);
 
diff --git a/src/tint/lang/wgsl/reader/parser/parser.cc b/src/tint/lang/wgsl/reader/parser/parser.cc
index 315d701..b15b06b 100644
--- a/src/tint/lang/wgsl/reader/parser/parser.cc
+++ b/src/tint/lang/wgsl/reader/parser/parser.cc
@@ -666,6 +666,7 @@
 // global_variable_decl
 //  : variable_attribute_list* variable_decl (EQUAL expression)?
 Maybe<const ast::Variable*> Parser::global_variable_decl(AttributeList& attrs) {
+    MultiTokenSource decl_source(this);
     auto decl = variable_decl();
     if (decl.errored) {
         return Failure::kErrored;
@@ -688,7 +689,7 @@
 
     TINT_DEFER(attrs.Clear());
 
-    return builder_.create<ast::Var>(decl->source,                // source
+    return builder_.create<ast::Var>(decl_source(),               // source
                                      builder_.Ident(decl->name),  // symbol
                                      decl->type,                  // type
                                      decl->address_space,         // address space
@@ -705,6 +706,7 @@
 Maybe<const ast::Variable*> Parser::global_constant_decl(AttributeList& attrs) {
     bool is_overridable = false;
     const char* use = nullptr;
+    MultiTokenSource decl_source(this);
     Source source;
     if (match(Token::Type::kConst)) {
         use = "'const' declaration";
@@ -746,17 +748,17 @@
 
     TINT_DEFER(attrs.Clear());
     if (is_overridable) {
-        return builder_.Override(decl->name->source,  // source
-                                 decl->name,          // symbol
-                                 decl->type,          // type
-                                 initializer,         // initializer
-                                 std::move(attrs));   // attributes
+        return builder_.Override(decl_source(),      // source
+                                 decl->name,         // symbol
+                                 decl->type,         // type
+                                 initializer,        // initializer
+                                 std::move(attrs));  // attributes
     }
-    return builder_.GlobalConst(decl->name->source,  // source
-                                decl->name,          // symbol
-                                decl->type,          // type
-                                initializer,         // initializer
-                                std::move(attrs));   // attributes
+    return builder_.GlobalConst(decl_source(),      // source
+                                decl->name,         // symbol
+                                decl->type,         // type
+                                initializer,        // initializer
+                                std::move(attrs));  // attributes
 }
 
 // variable_decl
@@ -974,7 +976,7 @@
 // struct_decl
 //   : STRUCT IDENT struct_body_decl
 Maybe<const ast::Struct*> Parser::struct_decl() {
-    auto& t = peek();
+    MultiTokenSource source(this);
 
     if (!match(Token::Type::kStruct)) {
         return Failure::kNoMatch;
@@ -990,7 +992,7 @@
         return Failure::kErrored;
     }
 
-    return builder_.Structure(t.source(), name.value, std::move(body.value));
+    return builder_.Structure(source(), name.value, std::move(body.value));
 }
 
 // struct_body_decl
diff --git a/src/tint/lang/wgsl/reader/parser/struct_decl_test.cc b/src/tint/lang/wgsl/reader/parser/struct_decl_test.cc
index 9733936..353e5fe 100644
--- a/src/tint/lang/wgsl/reader/parser/struct_decl_test.cc
+++ b/src/tint/lang/wgsl/reader/parser/struct_decl_test.cc
@@ -46,6 +46,16 @@
     ASSERT_EQ(s->members.Length(), 2u);
     EXPECT_EQ(s->members[0]->name->symbol, p->builder().Symbols().Register("a"));
     EXPECT_EQ(s->members[1]->name->symbol, p->builder().Symbols().Register("b"));
+
+    EXPECT_EQ(s->source.range.begin.line, 2u);
+    EXPECT_EQ(s->source.range.begin.column, 1u);
+    EXPECT_EQ(s->source.range.end.line, 5u);
+    EXPECT_EQ(s->source.range.end.column, 2u);
+
+    EXPECT_EQ(s->name->source.range.begin.line, 2u);
+    EXPECT_EQ(s->name->source.range.begin.column, 8u);
+    EXPECT_EQ(s->name->source.range.end.line, 2u);
+    EXPECT_EQ(s->name->source.range.end.column, 9u);
 }
 
 TEST_F(WGSLParserTest, StructDecl_Unicode_Parses) {