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