mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-04 22:02:52 +01:00
Start avoiding parse diagnostics on error tokens (#4431)
An invalid parse due to an error token isn't likely a great diagnostic as it will already have been diagnosed by the lexer. A common case to start handling that is when the parser encounters an invalid token when expecting an expression. This removes a number of unhelpful diagnostics after the lexer has done a good job diagnosing. This also means that there may be parse tree errors that aren't diagnosed when there are lexer-diagnosed errors, so track that. Follow-up to #4430 that almost finishes addressing its diagnostic TODO.
This commit is contained in:
@@ -73,7 +73,7 @@ auto HandleExprInPostfix(Context& context) -> void {
|
||||
// Parses a primary expression, which is either a terminal portion of an
|
||||
// expression tree, such as an identifier or literal, or a parenthesized
|
||||
// expression.
|
||||
switch (context.PositionKind()) {
|
||||
switch (auto token_kind = context.PositionKind()) {
|
||||
case Lex::TokenKind::Identifier: {
|
||||
context.AddLeafNode(NodeKind::IdentifierNameExpr, context.Consume());
|
||||
context.PushState(state);
|
||||
@@ -208,11 +208,15 @@ auto HandleExprInPostfix(Context& context) -> void {
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
// If not already diagnosed in the lexer, diagnose it here.
|
||||
if (token_kind != Lex::TokenKind::Error) {
|
||||
CARBON_DIAGNOSTIC(ExpectedExpr, Error, "expected expression");
|
||||
context.emitter().Emit(*context.position(), ExpectedExpr);
|
||||
}
|
||||
|
||||
// Add a node to keep the parse tree balanced.
|
||||
context.AddLeafNode(NodeKind::InvalidParse, *context.position(),
|
||||
/*has_error=*/true);
|
||||
CARBON_DIAGNOSTIC(ExpectedExpr, Error, "expected expression");
|
||||
context.emitter().Emit(*context.position(), ExpectedExpr);
|
||||
context.ReturnErrorOnState();
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user