Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(168)

Unified Diff: pkg/compiler/lib/src/parser/element_listener.dart

Issue 2649923002: Update listener error handling. (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/compiler/lib/src/parser/member_listener.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/parser/element_listener.dart
diff --git a/pkg/compiler/lib/src/parser/element_listener.dart b/pkg/compiler/lib/src/parser/element_listener.dart
index 7852b571dffe24a6daf097966165f823cb30afa4..8111f2333d902435cbdcf7b6629ed3dac90b6bd2 100644
--- a/pkg/compiler/lib/src/parser/element_listener.dart
+++ b/pkg/compiler/lib/src/parser/element_listener.dart
@@ -29,8 +29,8 @@ import 'package:dart_scanner/src/precedence.dart' as Precedence show
BAD_INPUT_INFO;
import '../tree/tree.dart';
import '../util/util.dart' show Link, LinkBuilder;
-import 'package:dart_parser/dart_parser.dart' show
- closeBraceFor, Listener, ParserError;
+import 'package:dart_parser/dart_parser.dart'
+ show ErrorKind, Listener, ParserError, closeBraceFor;
import 'partial_elements.dart'
show
PartialClassElement,
@@ -461,16 +461,16 @@ class ElementListener extends Listener {
// and report that something is missing *after* it.
Token preceding = findPrecedingToken(token);
if (preceding == token) {
- reportError(
+ reportErrorMessageToken(
token, MessageKind.MISSING_TOKEN_BEFORE_THIS, {'token': string});
} else {
- reportError(
+ reportErrorMessageToken(
preceding, MessageKind.MISSING_TOKEN_AFTER_THIS, {'token': string});
}
return token;
} else {
reportFatalError(
- token,
+ reporter.spanFromToken(token),
MessageTemplate.TEMPLATES[MessageKind.MISSING_TOKEN_BEFORE_THIS]
.message({'token': string}, true).toString());
}
@@ -537,13 +537,15 @@ class ElementListener extends Listener {
@override
Token expectedIdentifier(Token token) {
if (token is KeywordToken) {
- reportError(token, MessageKind.EXPECTED_IDENTIFIER_NOT_RESERVED_WORD,
+ reportErrorMessageToken(token,
+ MessageKind.EXPECTED_IDENTIFIER_NOT_RESERVED_WORD,
{'keyword': token.value});
} else if (token is ErrorToken) {
reportErrorToken(token);
return synthesizeIdentifier(token);
} else {
- reportFatalError(token, "Expected identifier, but got '${token.value}'.");
+ reportFatalError(reporter.spanFromToken(token),
+ "Expected identifier, but got '${token.value}'.");
}
return token;
}
@@ -555,7 +557,8 @@ class ElementListener extends Listener {
reportErrorToken(token);
return synthesizeIdentifier(token);
} else {
- reportFatalError(token, "Expected a type, but got '${token.value}'.");
+ reportFatalError(reporter.spanFromToken(token),
+ "Expected a type, but got '${token.value}'.");
return skipToEof(token);
}
}
@@ -568,7 +571,8 @@ class ElementListener extends Listener {
return token.next;
} else {
reportFatalError(
- token, "Expected an expression, but got '${token.value}'.");
+ reporter.spanFromToken(token),
+ "Expected an expression, but got '${token.value}'.");
pushNode(null);
return skipToEof(token);
}
@@ -583,7 +587,7 @@ class ElementListener extends Listener {
if (token.info == Precedence.BAD_INPUT_INFO) {
message = token.value;
}
- reportFatalError(token, message);
+ reportFatalError(reporter.spanFromToken(token), message);
}
return skipToEof(token);
}
@@ -604,7 +608,8 @@ class ElementListener extends Listener {
} else {
String printString = token.value;
reportFatalError(
- token, "Expected a function body, but got '$printString'.");
+ reporter.spanFromToken(token),
+ "Expected a function body, but got '$printString'.");
}
return skipToEof(token);
}
@@ -615,7 +620,8 @@ class ElementListener extends Listener {
reportErrorToken(token);
} else {
reportFatalError(
- token, "Expected a class body, but got '${token.value}'.");
+ reporter.spanFromToken(token),
+ "Expected a class body, but got '${token.value}'.");
}
return skipToEof(token);
}
@@ -631,7 +637,8 @@ class ElementListener extends Listener {
reportErrorToken(token);
} else {
reportFatalError(
- token, "Expected a declaration, but got '${token.value}'.");
+ reporter.spanFromToken(token),
+ "Expected a declaration, but got '${token.value}'.");
}
return skipToEof(token);
}
@@ -643,7 +650,7 @@ class ElementListener extends Listener {
} else {
String begin = token.value;
String end = closeBraceFor(begin);
- reportError(
+ reportErrorMessageToken(
token, MessageKind.UNMATCHED_TOKEN, {'begin': begin, 'end': end});
}
Token next = token.next;
@@ -653,8 +660,7 @@ class ElementListener extends Listener {
return next;
}
- // TODO(ahe): XXX
- void recoverableError(/* Spannable */ node, String message) {
+ void recoverableError(Spannable node, String message) {
// TODO(johnniwinther): Make recoverable errors non-fatal.
reportFatalError(node, message);
}
@@ -795,22 +801,14 @@ class ElementListener extends Listener {
/// Don't call this method. Should only be used as a last resort when there
/// is no feasible way to recover from a parser error.
- // TODO(ahe): XXX
- void reportFatalError(/* Spannable */ spannable, String message) {
- reportError(spannable, MessageKind.GENERIC, {'text': message});
+ void reportFatalError(SourceSpan span, String message) {
+ reportErrorMessageHelper(span, MessageKind.GENERIC, {'text': message});
// Some parse errors are infeasible to recover from, so we throw an error.
- throw new ParserError(spannable, null, {'text': message}); // TODO(ahe): XXX
+ throw new ParserError(
+ span.begin, span.end, ErrorKind.Unspecified, {'text': message});
}
- // TODO(ahe): XXX
- @override
- void reportError(token, kind, [Map arguments = const {}]) {
- super.reportError(token, kind, arguments);
- }
-
- // TODO(ahe): XXX
- @override
- void reportErrorHelper(/* Spannable */ spannable, /* MessageKind */ errorCode,
+ void reportErrorMessageHelper(Spannable spannable, MessageKind errorCode,
[Map arguments = const {}]) {
if (currentMemberHasParseError) return; // Error already reported.
if (suppressParseErrors) return;
@@ -822,6 +820,107 @@ class ElementListener extends Listener {
void reportErrorMessageToken(Token token, MessageKind errorCode,
[Map arguments = const {}]) {
- reportErrorHelper(reporter.spanFromToken(token), errorCode, arguments);
+ if (token is ErrorToken) {
+ reportErrorToken(token);
+ } else {
+ reportErrorMessageHelper(
+ reporter.spanFromToken(token), errorCode, arguments);
+ }
+ }
+
+ void reportErrorHelper(Token token, ErrorKind kind, Map arguments) {
+ SourceSpan span = reporter.spanFromToken(token);
+ MessageKind errorCode;
+ switch (kind) {
+ case ErrorKind.EmptyNamedParameterList:
+ errorCode = MessageKind.EMPTY_NAMED_PARAMETER_LIST;
+ break;
+
+ case ErrorKind.EmptyOptionalParameterList:
+ errorCode = MessageKind.EMPTY_OPTIONAL_PARAMETER_LIST;
+ break;
+
+ case ErrorKind.ExpectedBody:
+ errorCode = MessageKind.BODY_EXPECTED;
+ break;
+
+ case ErrorKind.ExpectedHexDigit:
+ errorCode = MessageKind.HEX_DIGIT_EXPECTED;
+ break;
+
+ case ErrorKind.ExpectedOpenParens:
+ errorCode = MessageKind.GENERIC;
+ arguments = {"text": "Expected '('."};
+ break;
+
+ case ErrorKind.ExpectedString:
+ errorCode = MessageKind.STRING_EXPECTED;
+ break;
+
+ case ErrorKind.ExtraneousModifier:
+ errorCode = MessageKind.EXTRANEOUS_MODIFIER;
+ break;
+
+ case ErrorKind.ExtraneousModifierReplace:
+ errorCode = MessageKind.EXTRANEOUS_MODIFIER_REPLACE;
+ break;
+
+ case ErrorKind.InvalidAwaitFor:
+ errorCode = MessageKind.INVALID_AWAIT_FOR;
+ break;
+
+ case ErrorKind.InvalidInputCharacter:
+ errorCode = MessageKind.BAD_INPUT_CHARACTER;
+ break;
+
+ case ErrorKind.InvalidSyncModifier:
+ errorCode = MessageKind.INVALID_SYNC_MODIFIER;
+ break;
+
+ case ErrorKind.InvalidVoid:
+ errorCode = MessageKind.VOID_NOT_ALLOWED;
+ break;
+
+ case ErrorKind.MalformedStringLiteral:
+ errorCode = MessageKind.MALFORMED_STRING_LITERAL;
+ break;
+
+ case ErrorKind.MissingExponent:
+ errorCode = MessageKind.EXPONENT_MISSING;
+ break;
+
+ case ErrorKind.PositionalParameterWithEquals:
+ errorCode = MessageKind.POSITIONAL_PARAMETER_WITH_EQUALS;
+ break;
+
+ case ErrorKind.RequiredParameterWithDefault:
+ errorCode = MessageKind.REQUIRED_PARAMETER_WITH_DEFAULT;
+ break;
+
+ case ErrorKind.UnmatchedToken:
+ errorCode = MessageKind.UNMATCHED_TOKEN;
+ break;
+
+ case ErrorKind.UnsupportedPrefixPlus:
+ errorCode = MessageKind.UNSUPPORTED_PREFIX_PLUS;
+ break;
+
+ case ErrorKind.UnterminatedComment:
+ errorCode = MessageKind.UNTERMINATED_COMMENT;
+ break;
+
+ case ErrorKind.UnterminatedString:
+ errorCode = MessageKind.UNTERMINATED_STRING;
+ break;
+
+ case ErrorKind.UnterminatedToken:
+ errorCode = MessageKind.UNTERMINATED_TOKEN;
+ break;
+
+ case ErrorKind.Unspecified:
+ errorCode = MessageKind.GENERIC;
+ break;
+ }
+ reportErrorMessageHelper(span, errorCode, arguments);
}
}
« no previous file with comments | « no previous file | pkg/compiler/lib/src/parser/member_listener.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698