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

Side by Side 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 unified diff | 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library fasta.parser.parser; 5 library fasta.parser.parser;
6 6
7 import '../fasta_codes.dart' show Code, Message, Template; 7 import '../fasta_codes.dart' show Code, Message, Template;
8 8
9 import '../fasta_codes.dart' as fasta; 9 import '../fasta_codes.dart' as fasta;
10 10
11 import '../scanner.dart' show ErrorToken, Token; 11 import '../scanner.dart' show ErrorToken, Token;
12 12
13 import '../scanner/recover.dart' show closeBraceFor, skipToEof; 13 import '../scanner/recover.dart' show closeBraceFor, skipToEof;
14 14
15 import '../../scanner/token.dart' 15 import '../../scanner/token.dart'
16 show 16 show
17 ASSIGNMENT_PRECEDENCE, 17 ASSIGNMENT_PRECEDENCE,
18 BeginToken, 18 BeginToken,
19 CASCADE_PRECEDENCE, 19 CASCADE_PRECEDENCE,
20 EQUALITY_PRECEDENCE, 20 EQUALITY_PRECEDENCE,
21 POSTFIX_PRECEDENCE, 21 POSTFIX_PRECEDENCE,
22 RELATIONAL_PRECEDENCE, 22 RELATIONAL_PRECEDENCE,
23 SyntheticStringToken,
24 SyntheticToken,
23 TokenType; 25 TokenType;
24 26
25 import '../scanner/token.dart' show isUserDefinableOperator; 27 import '../scanner/token.dart' show isUserDefinableOperator;
26 28
27 import '../scanner/token_constants.dart' 29 import '../scanner/token_constants.dart'
28 show 30 show
29 COMMA_TOKEN, 31 COMMA_TOKEN,
30 DOUBLE_TOKEN, 32 DOUBLE_TOKEN,
31 EOF_TOKEN, 33 EOF_TOKEN,
32 EQ_TOKEN, 34 EQ_TOKEN,
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 } 351 }
350 listener.endDottedName(count, firstIdentifier); 352 listener.endDottedName(count, firstIdentifier);
351 return token; 353 return token;
352 } 354 }
353 355
354 /// export uri conditional-uris* combinator* ';' 356 /// export uri conditional-uris* combinator* ';'
355 Token parseExport(Token token) { 357 Token parseExport(Token token) {
356 Token exportKeyword = token; 358 Token exportKeyword = token;
357 listener.beginExport(exportKeyword); 359 listener.beginExport(exportKeyword);
358 assert(optional('export', token)); 360 assert(optional('export', token));
359 token = parseLiteralStringOrRecoverExpression(token.next); 361 token = ensureParseLiteralString(token.next);
360 token = parseConditionalUris(token); 362 token = parseConditionalUris(token);
361 token = parseCombinators(token); 363 token = parseCombinators(token);
362 Token semicolon = token; 364 Token semicolon = ensureSemicolon(token);
363 token = expect(';', token);
364 listener.endExport(exportKeyword, semicolon); 365 listener.endExport(exportKeyword, semicolon);
365 return token; 366 return semicolon.next;
366 } 367 }
367 368
368 Token parseCombinators(Token token) { 369 Token parseCombinators(Token token) {
369 listener.beginCombinators(token); 370 listener.beginCombinators(token);
370 int count = 0; 371 int count = 0;
371 while (true) { 372 while (true) {
372 String value = token.stringValue; 373 String value = token.stringValue;
373 if (identical('hide', value)) { 374 if (identical('hide', value)) {
374 token = parseHide(token); 375 token = parseHide(token);
375 } else if (identical('show', value)) { 376 } else if (identical('show', value)) {
(...skipping 1539 matching lines...) Expand 10 before | Expand all | Expand 10 after
1915 listener.beginInitializer(token); 1916 listener.beginInitializer(token);
1916 if (optional('assert', token)) { 1917 if (optional('assert', token)) {
1917 token = parseAssert(token, Assert.Initializer); 1918 token = parseAssert(token, Assert.Initializer);
1918 } else { 1919 } else {
1919 token = parseExpression(token); 1920 token = parseExpression(token);
1920 } 1921 }
1921 listener.endInitializer(token); 1922 listener.endInitializer(token);
1922 return token; 1923 return token;
1923 } 1924 }
1924 1925
1926 Token ensureParseLiteralString(Token token) {
1927 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
1928 reportRecoverableErrorWithToken(token, fasta.templateExpectedString);
1929 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
1930 new SyntheticStringToken(TokenType.STRING, '""', token.charOffset, 0),
1931 token);
1932 }
1933 return parseLiteralString(token);
1934 }
1935
1936 Token ensureSemicolon(Token token) {
1937 if (optional(';', token)) return token;
1938 reportRecoverableError(
1939 token, fasta.templateExpectedButGot.withArguments(';'));
1940 return listener.rewriter.insertTokenBefore(
1941 new SyntheticToken(TokenType.SEMICOLON, token.charOffset), token);
1942 }
1943
1925 Token parseLiteralStringOrRecoverExpression(Token token) { 1944 Token parseLiteralStringOrRecoverExpression(Token token) {
1926 if (identical(token.kind, STRING_TOKEN)) { 1945 if (identical(token.kind, STRING_TOKEN)) {
1927 return parseLiteralString(token); 1946 return parseLiteralString(token);
1928 } else if (token is ErrorToken) { 1947 } else if (token is ErrorToken) {
1929 return reportErrorToken(token, false); 1948 return reportErrorToken(token, false);
1930 } else { 1949 } else {
1931 reportRecoverableErrorWithToken(token, fasta.templateExpectedString); 1950 reportRecoverableErrorWithToken(token, fasta.templateExpectedString);
1932 return parseRecoverExpression( 1951 return parseRecoverExpression(
1933 token, fasta.templateExpectedString.withArguments(token)); 1952 token, fasta.templateExpectedString.withArguments(token));
1934 } 1953 }
(...skipping 2130 matching lines...) Expand 10 before | Expand all | Expand 10 after
4065 } 4084 }
4066 4085
4067 Token reportUnexpectedToken(Token token) { 4086 Token reportUnexpectedToken(Token token) {
4068 return reportUnrecoverableErrorWithToken( 4087 return reportUnrecoverableErrorWithToken(
4069 token, fasta.templateUnexpectedToken); 4088 token, fasta.templateUnexpectedToken);
4070 } 4089 }
4071 } 4090 }
4072 4091
4073 // TODO(ahe): Remove when analyzer supports generalized function syntax. 4092 // TODO(ahe): Remove when analyzer supports generalized function syntax.
4074 typedef _MessageWithArgument<T> = Message Function(T); 4093 typedef _MessageWithArgument<T> = Message Function(T);
OLDNEW
« 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