Skip to content

Commit 5b76532

Browse files
committed
[wgsl] pass expected token to functions that might not match any tokens
This improves errors making them more general where appropriate.
1 parent 52b2a43 commit 5b76532

File tree

3 files changed

+48
-19
lines changed

3 files changed

+48
-19
lines changed

naga/src/front/wgsl/error.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ pub enum ExpectedToken<'a> {
135135
Identifier,
136136
AfterIdentListComma,
137137
AfterIdentListArg,
138+
/// LHS expression (identifier component_or_swizzle_specifier?, (`lhs_expression`) component_or_swizzle_specifier?, &`lhs_expression`, *`lhs_expression`)
138139
LhsExpression,
139140
/// Expected: constant, parenthesized expression, identifier
140141
PrimaryExpression,
@@ -152,6 +153,12 @@ pub enum ExpectedToken<'a> {
152153
Function,
153154
/// The `diagnostic` identifier of the `@diagnostic(…)` attribute.
154155
DiagnosticAttribute,
156+
/// statement
157+
Statement,
158+
/// for loop init statement (variable_or_value_statement, variable_updating_statement, func_call_statement)
159+
ForInit,
160+
/// for loop update statement (variable_updating_statement, func_call_statement)
161+
ForUpdate,
155162
}
156163

157164
#[derive(Clone, Copy, Debug, Error, PartialEq)]
@@ -500,7 +507,7 @@ impl<'a> Error<'a> {
500507
Token::End => "end".to_string(),
501508
},
502509
ExpectedToken::Identifier => "identifier".to_string(),
503-
ExpectedToken::LhsExpression => "assignment destination".to_string(),
510+
ExpectedToken::LhsExpression => "LHS expression (identifier component_or_swizzle_specifier?, (`lhs_expression`) component_or_swizzle_specifier?, &`lhs_expression`, *`lhs_expression`)".to_string(),
504511
ExpectedToken::PrimaryExpression => "expression".to_string(),
505512
ExpectedToken::Assignment => "assignment or increment/decrement".to_string(),
506513
ExpectedToken::SwitchItem => concat!(
@@ -528,6 +535,9 @@ impl<'a> Error<'a> {
528535
ExpectedToken::DiagnosticAttribute => {
529536
"the `diagnostic` attribute identifier".to_string()
530537
}
538+
ExpectedToken::Statement => "statement".to_string(),
539+
ExpectedToken::ForInit => "for loop initializer statement (`var`/`let`/`const` declaration, assignment, `i++`/`i--` statement, function call)".to_string(),
540+
ExpectedToken::ForUpdate => "for loop update statement (assignment, `i++`/`i--` statement, function call)".to_string(),
531541
};
532542
ParseError {
533543
message: format!(

naga/src/front/wgsl/parse/mod.rs

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -641,25 +641,29 @@ impl Parser {
641641
lexer: &mut Lexer<'a>,
642642
ctx: &mut ExpressionContext<'a, '_, '_>,
643643
token: Option<TokenSpan<'a>>,
644+
expected_token: ExpectedToken<'a>,
644645
) -> Result<'a, Handle<ast::Expression<'a>>> {
645646
self.track_recursion(|this| {
646647
this.push_rule_span(Rule::LhsExpr, lexer);
647648
let token = token.unwrap_or_else(|| lexer.next());
648649
let expr = match token {
649650
(Token::Operation('*'), _) => {
650-
let expr = this.lhs_expression(lexer, ctx, None)?;
651+
let expr =
652+
this.lhs_expression(lexer, ctx, None, ExpectedToken::LhsExpression)?;
651653
let expr = ast::Expression::Deref(expr);
652654
let span = this.peek_rule_span(lexer);
653655
ctx.expressions.append(expr, span)
654656
}
655657
(Token::Operation('&'), _) => {
656-
let expr = this.lhs_expression(lexer, ctx, None)?;
658+
let expr =
659+
this.lhs_expression(lexer, ctx, None, ExpectedToken::LhsExpression)?;
657660
let expr = ast::Expression::AddrOf(expr);
658661
let span = this.peek_rule_span(lexer);
659662
ctx.expressions.append(expr, span)
660663
}
661664
(Token::Paren('('), span) => {
662-
let expr = this.lhs_expression(lexer, ctx, None)?;
665+
let expr =
666+
this.lhs_expression(lexer, ctx, None, ExpectedToken::LhsExpression)?;
663667
lexer.expect(Token::Paren(')'))?;
664668
this.component_or_swizzle_specifier(span, lexer, ctx, expr)?
665669
}
@@ -675,10 +679,7 @@ impl Parser {
675679
this.component_or_swizzle_specifier(span, lexer, ctx, ident)?
676680
}
677681
(_, span) => {
678-
return Err(Box::new(Error::Unexpected(
679-
span,
680-
ExpectedToken::LhsExpression,
681-
)));
682+
return Err(Box::new(Error::Unexpected(span, expected_token)));
682683
}
683684
};
684685

@@ -1032,6 +1033,7 @@ impl Parser {
10321033
ctx: &mut ExpressionContext<'a, '_, '_>,
10331034
block: &mut ast::Block<'a>,
10341035
token: TokenSpan<'a>,
1036+
expected_token: ExpectedToken<'a>,
10351037
) -> Result<'a, ()> {
10361038
match token {
10371039
(Token::Word("_"), span) => {
@@ -1046,7 +1048,7 @@ impl Parser {
10461048
}
10471049
_ => {}
10481050
}
1049-
let target = self.lhs_expression(lexer, ctx, Some(token))?;
1051+
let target = self.lhs_expression(lexer, ctx, Some(token), expected_token)?;
10501052

10511053
let (op, value) = match lexer.next() {
10521054
(Token::Operation('='), _) => {
@@ -1146,9 +1148,10 @@ impl Parser {
11461148
context: &mut ExpressionContext<'a, '_, '_>,
11471149
block: &mut ast::Block<'a>,
11481150
token: TokenSpan<'a>,
1151+
expected_token: ExpectedToken<'a>,
11491152
) -> Result<'a, ()> {
11501153
if !self.maybe_func_call_statement(lexer, context, block, token)? {
1151-
self.variable_updating_statement(lexer, context, block, token)?;
1154+
self.variable_updating_statement(lexer, context, block, token, expected_token)?;
11521155
}
11531156
Ok(())
11541157
}
@@ -1164,6 +1167,7 @@ impl Parser {
11641167
ctx: &mut ExpressionContext<'a, '_, '_>,
11651168
block: &mut ast::Block<'a>,
11661169
token: TokenSpan<'a>,
1170+
expected_token: ExpectedToken<'a>,
11671171
) -> Result<'a, ()> {
11681172
let local_decl = match token {
11691173
(Token::Word("let"), _) => {
@@ -1213,7 +1217,13 @@ impl Parser {
12131217
})
12141218
}
12151219
token => {
1216-
return self.func_call_or_variable_updating_statement(lexer, ctx, block, token);
1220+
return self.func_call_or_variable_updating_statement(
1221+
lexer,
1222+
ctx,
1223+
block,
1224+
token,
1225+
expected_token,
1226+
);
12171227
}
12181228
};
12191229

@@ -1420,7 +1430,11 @@ impl Parser {
14201430
if !lexer.next_if(Token::Separator(';')) {
14211431
let token = lexer.next();
14221432
this.variable_or_value_or_func_call_or_variable_updating_statement(
1423-
lexer, ctx, block, token,
1433+
lexer,
1434+
ctx,
1435+
block,
1436+
token,
1437+
ExpectedToken::ForInit,
14241438
)?;
14251439
lexer.expect(Token::Separator(';'))?;
14261440
};
@@ -1455,6 +1469,7 @@ impl Parser {
14551469
ctx,
14561470
&mut continuing,
14571471
token,
1472+
ExpectedToken::ForUpdate,
14581473
)?;
14591474
lexer.expect(Token::Paren(')'))?;
14601475
}
@@ -1508,7 +1523,11 @@ impl Parser {
15081523
}
15091524
token => {
15101525
this.variable_or_value_or_func_call_or_variable_updating_statement(
1511-
lexer, ctx, block, token,
1526+
lexer,
1527+
ctx,
1528+
block,
1529+
token,
1530+
ExpectedToken::Statement,
15121531
)?;
15131532
lexer.expect(Token::Separator(';'))?;
15141533
this.pop_rule_span(lexer);

naga/tests/naga/wgsl_errors.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -396,11 +396,11 @@ fn bad_for_initializer() {
396396
for ({};;) {}
397397
}
398398
"#,
399-
r#"error: expected assignment destination, found "{"
399+
r#"error: expected for loop initializer statement (`var`/`let`/`const` declaration, assignment, `i++`/`i--` statement, function call), found "{"
400400
┌─ wgsl:3:22
401401
402402
3 │ for ({};;) {}
403-
│ ^ expected assignment destination
403+
│ ^ expected for loop initializer statement (`var`/`let`/`const` declaration, assignment, `i++`/`i--` statement, function call)
404404
405405
"#,
406406
);
@@ -2569,11 +2569,11 @@ fn binary_statement() {
25692569
3 + 5;
25702570
}
25712571
",
2572-
r###"error: expected assignment destination, found "3"
2572+
r###"error: expected statement, found "3"
25732573
┌─ wgsl:3:13
25742574
25752575
3 │ 3 + 5;
2576-
│ ^ expected assignment destination
2576+
│ ^ expected statement
25772577
25782578
"###,
25792579
);
@@ -2587,11 +2587,11 @@ fn assign_to_expr() {
25872587
3 + 5 = 10;
25882588
}
25892589
",
2590-
r###"error: expected assignment destination, found "3"
2590+
r###"error: expected statement, found "3"
25912591
┌─ wgsl:3:13
25922592
25932593
3 │ 3 + 5 = 10;
2594-
│ ^ expected assignment destination
2594+
│ ^ expected statement
25952595
25962596
"###,
25972597
);

0 commit comments

Comments
 (0)