[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) {