Sync the `global_decl` grammar rule

This Cl updates the parser implementation of the `global_decl` rule.
The `type_alias` rule is renamed to `type_alias_decl` and the `struct`
parsing is moved out of the synchronization to `;` code as a `struct`
no longer has a trailling `;`.

Bug: tint:1633
Change-Id: I44b25035cbe0ea0963ec73400986205e1623060e
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/98065
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Auto-Submit: Dan Sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
This commit is contained in:
dan sinclair 2022-08-04 17:57:26 +00:00 committed by Dawn LUCI CQ
parent c2a052eaa4
commit b8893b4c2f
3 changed files with 21 additions and 22 deletions

View File

@ -440,7 +440,7 @@ Maybe<bool> ParserImpl::enable_directive() {
// : SEMICOLON // : SEMICOLON
// | global_variable_decl SEMICOLON // | global_variable_decl SEMICOLON
// | global_constant_decl SEMICOLON // | global_constant_decl SEMICOLON
// | type_alias SEMICOLON // | type_alias_decl SEMICOLON
// | struct_decl // | struct_decl
// | function_decl // | function_decl
// | static_assert_statement SEMICOLON // | static_assert_statement SEMICOLON
@ -450,7 +450,6 @@ Maybe<bool> ParserImpl::global_decl() {
} }
bool errored = false; bool errored = false;
auto attrs = attribute_list(); auto attrs = attribute_list();
if (attrs.errored) { if (attrs.errored) {
errored = true; errored = true;
@ -490,7 +489,7 @@ Maybe<bool> ParserImpl::global_decl() {
return true; return true;
} }
auto ta = type_alias(); auto ta = type_alias_decl();
if (ta.errored) { if (ta.errored) {
return Failure::kErrored; return Failure::kErrored;
} }
@ -503,15 +502,6 @@ Maybe<bool> ParserImpl::global_decl() {
return true; return true;
} }
auto str = struct_decl();
if (str.errored) {
return Failure::kErrored;
}
if (str.matched) {
builder_.AST().AddTypeDecl(str.value);
return true;
}
auto assertion = static_assert_stmt(); auto assertion = static_assert_stmt();
if (assertion.errored) { if (assertion.errored) {
return Failure::kErrored; return Failure::kErrored;
@ -534,6 +524,15 @@ Maybe<bool> ParserImpl::global_decl() {
return expect_attributes_consumed(attrs.value); return expect_attributes_consumed(attrs.value);
} }
auto str = struct_decl();
if (str.errored) {
errored = true;
}
if (str.matched) {
builder_.AST().AddTypeDecl(str.value);
return true;
}
auto func = function_decl(attrs.value); auto func = function_decl(attrs.value);
if (func.errored) { if (func.errored) {
errored = true; errored = true;
@ -1021,9 +1020,9 @@ Maybe<ParserImpl::VariableQualifier> ParserImpl::variable_qualifier() {
return vq; return vq;
} }
// type_alias // type_alias_decl
// : TYPE IDENT EQUAL type_decl // : TYPE IDENT EQUAL type_decl
Maybe<const ast::Alias*> ParserImpl::type_alias() { Maybe<const ast::Alias*> ParserImpl::type_alias_decl() {
if (!peek_is(Token::Type::kType)) { if (!peek_is(Token::Type::kType)) {
return Failure::kNoMatch; return Failure::kNoMatch;
} }

View File

@ -420,9 +420,9 @@ class ParserImpl {
/// Parses a `variable_qualifier` grammar element /// Parses a `variable_qualifier` grammar element
/// @returns the variable qualifier information /// @returns the variable qualifier information
Maybe<VariableQualifier> variable_qualifier(); Maybe<VariableQualifier> variable_qualifier();
/// Parses a `type_alias` grammar element /// Parses a `type_alias_decl` grammar element
/// @returns the type alias or nullptr on error /// @returns the type alias or nullptr on error
Maybe<const ast::Alias*> type_alias(); Maybe<const ast::Alias*> type_alias_decl();
/// Parses a `type_decl` grammar element /// Parses a `type_decl` grammar element
/// @returns the parsed Type or nullptr if none matched. /// @returns the parsed Type or nullptr if none matched.
Maybe<const ast::Type*> type_decl(); Maybe<const ast::Type*> type_decl();

View File

@ -20,7 +20,7 @@ namespace {
TEST_F(ParserImplTest, TypeDecl_ParsesType) { TEST_F(ParserImplTest, TypeDecl_ParsesType) {
auto p = parser("type a = i32"); auto p = parser("type a = i32");
auto t = p->type_alias(); auto t = p->type_alias_decl();
EXPECT_FALSE(p->has_error()); EXPECT_FALSE(p->has_error());
EXPECT_FALSE(t.errored); EXPECT_FALSE(t.errored);
EXPECT_TRUE(t.matched); EXPECT_TRUE(t.matched);
@ -35,7 +35,7 @@ TEST_F(ParserImplTest, TypeDecl_ParsesType) {
TEST_F(ParserImplTest, TypeDecl_Parses_Ident) { TEST_F(ParserImplTest, TypeDecl_Parses_Ident) {
auto p = parser("type a = B"); auto p = parser("type a = B");
auto t = p->type_alias(); auto t = p->type_alias_decl();
EXPECT_FALSE(p->has_error()); EXPECT_FALSE(p->has_error());
EXPECT_FALSE(t.errored); EXPECT_FALSE(t.errored);
EXPECT_TRUE(t.matched); EXPECT_TRUE(t.matched);
@ -54,7 +54,7 @@ TEST_F(ParserImplTest, TypeDecl_Unicode_Parses_Ident) {
auto p = parser("type " + ident + " = i32"); auto p = parser("type " + ident + " = i32");
auto t = p->type_alias(); auto t = p->type_alias_decl();
EXPECT_FALSE(p->has_error()); EXPECT_FALSE(p->has_error());
EXPECT_FALSE(t.errored); EXPECT_FALSE(t.errored);
EXPECT_TRUE(t.matched); EXPECT_TRUE(t.matched);
@ -68,7 +68,7 @@ TEST_F(ParserImplTest, TypeDecl_Unicode_Parses_Ident) {
TEST_F(ParserImplTest, TypeDecl_MissingIdent) { TEST_F(ParserImplTest, TypeDecl_MissingIdent) {
auto p = parser("type = i32"); auto p = parser("type = i32");
auto t = p->type_alias(); auto t = p->type_alias_decl();
EXPECT_TRUE(t.errored); EXPECT_TRUE(t.errored);
EXPECT_FALSE(t.matched); EXPECT_FALSE(t.matched);
EXPECT_TRUE(p->has_error()); EXPECT_TRUE(p->has_error());
@ -78,7 +78,7 @@ TEST_F(ParserImplTest, TypeDecl_MissingIdent) {
TEST_F(ParserImplTest, TypeDecl_InvalidIdent) { TEST_F(ParserImplTest, TypeDecl_InvalidIdent) {
auto p = parser("type 123 = i32"); auto p = parser("type 123 = i32");
auto t = p->type_alias(); auto t = p->type_alias_decl();
EXPECT_TRUE(t.errored); EXPECT_TRUE(t.errored);
EXPECT_FALSE(t.matched); EXPECT_FALSE(t.matched);
EXPECT_TRUE(p->has_error()); EXPECT_TRUE(p->has_error());
@ -88,7 +88,7 @@ TEST_F(ParserImplTest, TypeDecl_InvalidIdent) {
TEST_F(ParserImplTest, TypeDecl_MissingEqual) { TEST_F(ParserImplTest, TypeDecl_MissingEqual) {
auto p = parser("type a i32"); auto p = parser("type a i32");
auto t = p->type_alias(); auto t = p->type_alias_decl();
EXPECT_TRUE(t.errored); EXPECT_TRUE(t.errored);
EXPECT_FALSE(t.matched); EXPECT_FALSE(t.matched);
EXPECT_TRUE(p->has_error()); EXPECT_TRUE(p->has_error());