| 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);
|
| }
|
| }
|
|
|