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

Unified Diff: pkg/dart_parser/lib/src/parser.dart

Issue 2642903003: Update parser and scanner. (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 | « pkg/dart_parser/lib/src/class_member_parser.dart ('k') | pkg/dart_parser/lib/src/top_level_parser.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/dart_parser/lib/src/parser.dart
diff --git a/pkg/dart_parser/lib/src/parser.dart b/pkg/dart_parser/lib/src/parser.dart
index c578bff6250f27e407b53d1d94cb39bfe5e4947f..12b020295a6dc29583c4aeb99bf97c93aee3dfe5 100644
--- a/pkg/dart_parser/lib/src/parser.dart
+++ b/pkg/dart_parser/lib/src/parser.dart
@@ -115,11 +115,7 @@ class Parser {
bool asyncAwaitKeywordsEnabled;
- final bool enableGenericMethodSyntax;
-
- Parser(this.listener,
- {this.asyncAwaitKeywordsEnabled: false,
- this.enableGenericMethodSyntax: false});
+ Parser(this.listener, {this.asyncAwaitKeywordsEnabled: false});
Token parseUnit(Token token) {
listener.beginCompilationUnit(token);
@@ -383,30 +379,12 @@ class Parser {
Token parseTypedef(Token token) {
Token typedefKeyword = token;
- if (optional('=', peekAfterType(token.next))) {
- // TODO(aprelev@gmail.com): Remove deprecated 'typedef' mixin application,
- // remove corresponding diagnostic from members.dart.
- listener.beginNamedMixinApplication(token);
- token = parseIdentifier(token.next);
- token = parseTypeVariablesOpt(token);
- token = expect('=', token);
- token = parseModifiers(token);
- token = parseMixinApplication(token);
- Token implementsKeyword = null;
- if (optional('implements', token)) {
- implementsKeyword = token;
- token = parseTypeList(token.next);
- }
- listener.endNamedMixinApplication(
- typedefKeyword, implementsKeyword, token);
- } else {
- listener.beginFunctionTypeAlias(token);
- token = parseReturnTypeOpt(token.next);
- token = parseIdentifier(token);
- token = parseTypeVariablesOpt(token);
- token = parseFormalParameters(token);
- listener.endFunctionTypeAlias(typedefKeyword, token);
- }
+ listener.beginFunctionTypeAlias(token);
+ token = parseReturnTypeOpt(token.next);
+ token = parseIdentifier(token);
+ token = parseTypeVariablesOpt(token);
+ token = parseFormalParameters(token);
+ listener.endFunctionTypeAlias(typedefKeyword, token);
return expect(';', token);
}
@@ -465,6 +443,15 @@ class Parser {
Token parseFormalParameter(Token token, FormalParameterType type) {
token = parseMetadataStar(token, forParameter: true);
listener.beginFormalParameter(token);
+
+ // Skip over `covariant` token, if the next token is an identifier or
+ // modifier.
+ // This enables the case where `covariant` is the name of the parameter:
+ // void foo(covariant);
+ if (identical(token.stringValue, 'covariant') &&
+ (token.next.isIdentifier() || isModifier(token.next))) {
+ token = token.next;
+ }
token = parseModifiers(token);
// TODO(ahe): Validate that there are formal parameters if void.
token = parseReturnTypeOpt(token);
@@ -481,7 +468,7 @@ class Parser {
listener.handleNoTypeVariables(token);
token = parseFormalParameters(token);
listener.handleFunctionTypedFormalParameter(token);
- } else if (enableGenericMethodSyntax && optional('<', token)) {
+ } else if (optional('<', token)) {
listener.beginFunctionTypedFormalParameter(token);
token = parseTypeVariablesOpt(token);
token = parseFormalParameters(token);
@@ -600,7 +587,7 @@ class Parser {
/// Returns token after match if [token] matches identifier ('.' identifier)?,
/// and otherwise returns null. Does not produce listener events.
Token tryParseQualified(Token token) {
- if (!identical(token.kind, IDENTIFIER_TOKEN)) return null;
+ if (!isValidTypeReference(token)) return null;
token = token.next;
if (!identical(token.kind, PERIOD_TOKEN)) return token;
token = token.next;
@@ -705,17 +692,10 @@ class Parser {
var isMixinApplication = optional('=', peekAfterType(token.next));
if (isMixinApplication) {
listener.beginNamedMixinApplication(begin);
- token = parseIdentifier(token.next);
- token = parseTypeVariablesOpt(token);
- token = expect('=', token);
} else {
listener.beginClassDeclaration(begin);
}
- // TODO(aprelev@gmail.com): Once 'typedef' named mixin application is
- // removed, move modifiers for named mixin application to the bottom of
- // listener stack. This is so stacks for class declaration and named
- // mixin application look similar.
int modifierCount = 0;
if (abstractKeyword != null) {
parseModifier(abstractKeyword);
@@ -724,6 +704,9 @@ class Parser {
listener.handleModifiers(modifierCount);
if (isMixinApplication) {
+ token = parseIdentifier(token.next);
+ token = parseTypeVariablesOpt(token);
+ token = expect('=', token);
return parseNamedMixinApplication(token, classKeyword);
} else {
return parseClass(begin, classKeyword);
@@ -799,8 +782,7 @@ class Parser {
listener.beginTypeVariable(token);
token = parseIdentifier(token);
Token extendsOrSuper = null;
- if (optional('extends', token) ||
- (enableGenericMethodSyntax && optional('super', token))) {
+ if (optional('extends', token) || optional('super', token)) {
extendsOrSuper = token;
token = parseType(token.next);
} else {
@@ -1027,9 +1009,29 @@ class Parser {
return null;
}
+ /// Removes the optional `covariant` token from the modifiers, if there
+ /// is no `static` in the list, and `covariant` is the first modifier.
+ Link<Token> removeOptCovariantTokenIfNotStatic(Link<Token> modifiers) {
+ if (modifiers.isEmpty ||
+ !identical(modifiers.first.stringValue, 'covariant')) {
+ return modifiers;
+ }
+ for (Token modifier in modifiers.tail) {
+ if (identical(modifier.stringValue, 'static')) {
+ return modifiers;
+ }
+ }
+ return modifiers.tail;
+ }
+
Token parseFields(Token start, Link<Token> modifiers, Token type,
Token getOrSet, Token name, bool isTopLevel) {
bool hasType = type != null;
+
+ if (getOrSet == null && !isTopLevel) {
+ modifiers = removeOptCovariantTokenIfNotStatic(modifiers);
+ }
+
Token varFinalOrConst =
expectVarFinalOrConst(modifiers, hasType, !isTopLevel);
bool isVar = false;
@@ -1108,7 +1110,7 @@ class Parser {
}
Token token = parseIdentifier(name);
- if (enableGenericMethodSyntax && getOrSet == null) {
+ if (getOrSet == null) {
token = parseTypeVariablesOpt(token);
} else {
listener.handleNoTypeVariables(token);
@@ -1393,7 +1395,7 @@ class Parser {
if (isFactoryDeclaration(token)) {
token = parseFactoryMethod(token);
listener.endMember();
- assert (token != null);
+ assert(token != null);
return token;
}
@@ -1440,7 +1442,7 @@ class Parser {
(identical(value, '.')) ||
(identical(value, '{')) ||
(identical(value, '=>')) ||
- (enableGenericMethodSyntax && identical(value, '<'))) {
+ (identical(value, '<'))) {
isField = false;
break;
} else if (identical(value, ';')) {
@@ -1535,7 +1537,7 @@ class Parser {
}
token = parseQualifiedRestOpt(token);
- if (enableGenericMethodSyntax && getOrSet == null) {
+ if (getOrSet == null) {
token = parseTypeVariablesOpt(token);
} else {
listener.handleNoTypeVariables(token);
@@ -1626,7 +1628,7 @@ class Parser {
}
token = parseQualifiedRestOpt(token);
listener.endFunctionName(token);
- if (enableGenericMethodSyntax && getOrSet == null) {
+ if (getOrSet == null) {
token = parseTypeVariablesOpt(token);
} else {
listener.handleNoTypeVariables(token);
@@ -1671,11 +1673,7 @@ class Parser {
listener.beginFunctionName(token);
token = parseIdentifier(token);
listener.endFunctionName(token);
- if (enableGenericMethodSyntax) {
- token = parseTypeVariablesOpt(token);
- } else {
- listener.handleNoTypeVariables(token);
- }
+ token = parseTypeVariablesOpt(token);
token = parseFormalParameters(token);
listener.handleNoInitializers();
bool previousAsyncAwaitKeywordsEnabled = asyncAwaitKeywordsEnabled;
@@ -1951,8 +1949,7 @@ class Parser {
// by '{', '=>', 'async', or 'sync'.
return parseFunctionDeclaration(token);
}
- } else if (enableGenericMethodSyntax &&
- identical(afterIdKind, LT_TOKEN)) {
+ } else if (identical(afterIdKind, LT_TOKEN)) {
// We are looking at "type identifier '<'".
BeginGroupToken beginAngle = afterId;
Token endAngle = beginAngle.endGroup;
@@ -1987,7 +1984,7 @@ class Parser {
identical(afterParens, 'sync')) {
return parseFunctionDeclaration(token);
}
- } else if (enableGenericMethodSyntax && optional('<', token.next)) {
+ } else if (optional('<', token.next)) {
BeginGroupToken beginAngle = token.next;
Token endAngle = beginAngle.endGroup;
if (endAngle != null &&
@@ -2501,8 +2498,7 @@ class Parser {
Token parseLiteralListOrMapOrFunction(Token token, Token constKeyword) {
assert(optional('<', token));
BeginGroupToken begin = token;
- if (enableGenericMethodSyntax &&
- constKeyword == null &&
+ if (constKeyword == null &&
begin.endGroup != null &&
identical(begin.endGroup.next.kind, OPEN_PAREN_TOKEN)) {
token = parseTypeVariablesOpt(token);
@@ -2545,7 +2541,7 @@ class Parser {
}
bool isFunctionDeclaration(Token token) {
- if (enableGenericMethodSyntax && optional('<', token)) {
+ if (optional('<', token)) {
BeginGroupToken begin = token;
if (begin.endGroup == null) return false;
token = begin.endGroup.next;
@@ -2694,7 +2690,7 @@ class Parser {
Token parseSend(Token token) {
listener.beginSend(token);
token = parseIdentifier(token);
- if (enableGenericMethodSyntax && isValidMethodTypeArguments(token)) {
+ if (isValidMethodTypeArguments(token)) {
token = parseTypeArgumentsOpt(token);
} else {
listener.handleNoTypeArguments(token);
« no previous file with comments | « pkg/dart_parser/lib/src/class_member_parser.dart ('k') | pkg/dart_parser/lib/src/top_level_parser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698