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

Unified Diff: pkg/front_end/lib/src/fasta/parser/parser.dart

Issue 3001993002: improve fasta export directive recovery (Closed)
Patch Set: Created 3 years, 4 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 | « pkg/front_end/lib/src/fasta/parser/listener.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/front_end/lib/src/fasta/parser/parser.dart
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index f7e2e1f90c1ca2e2ecc07d131512ef7aaa3a7661..9560cd4aa3454ee6af4fcd7a7beee9bf97405d01 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -20,6 +20,8 @@ import '../../scanner/token.dart'
EQUALITY_PRECEDENCE,
POSTFIX_PRECEDENCE,
RELATIONAL_PRECEDENCE,
+ SyntheticStringToken,
+ SyntheticToken,
TokenType;
import '../scanner/token.dart' show isUserDefinableOperator;
@@ -356,13 +358,12 @@ class Parser {
Token exportKeyword = token;
listener.beginExport(exportKeyword);
assert(optional('export', token));
- token = parseLiteralStringOrRecoverExpression(token.next);
+ token = ensureParseLiteralString(token.next);
token = parseConditionalUris(token);
token = parseCombinators(token);
- Token semicolon = token;
- token = expect(';', token);
+ Token semicolon = ensureSemicolon(token);
listener.endExport(exportKeyword, semicolon);
- return token;
+ return semicolon.next;
}
Token parseCombinators(Token token) {
@@ -1922,6 +1923,24 @@ class Parser {
return token;
}
+ Token ensureParseLiteralString(Token token) {
+ if (!identical(token.kind, STRING_TOKEN)) {
ahe 2017/08/21 12:51:37 Don't need to use identical on int.
danrubel 2017/08/21 14:51:02 Fair enough. I was just following what you already
+ reportRecoverableErrorWithToken(token, fasta.templateExpectedString);
+ token = listener.rewriter.insertTokenBefore(
ahe 2017/08/21 12:51:37 Something is off here. If the parser does the rewr
danrubel 2017/08/21 14:51:02 Yeah. I had the parser holding onto the rewriter b
+ new SyntheticStringToken(TokenType.STRING, '""', token.charOffset, 0),
+ token);
+ }
+ return parseLiteralString(token);
+ }
+
+ Token ensureSemicolon(Token token) {
+ if (optional(';', token)) return token;
+ reportRecoverableError(
+ token, fasta.templateExpectedButGot.withArguments(';'));
+ return listener.rewriter.insertTokenBefore(
+ new SyntheticToken(TokenType.SEMICOLON, token.charOffset), token);
+ }
+
Token parseLiteralStringOrRecoverExpression(Token token) {
if (identical(token.kind, STRING_TOKEN)) {
return parseLiteralString(token);
« no previous file with comments | « pkg/front_end/lib/src/fasta/parser/listener.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698