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

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

Issue 2711463005: Add contextual information about identifiers to the parser listener API. (Closed)
Patch Set: Fix broken import Created 3 years, 10 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
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 2a327ae81f3e903054749ef8117315c213dcb965..83a1e5fb4d261e212605c9376b09e1d8d37e4281 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -74,6 +74,8 @@ import 'listener.dart' show
import 'error_kind.dart' show
ErrorKind;
+import 'identifier_context.dart' show IdentifierContext;
+
/// Returns true if [token] is the symbol or keyword [value].
bool optional(String value, Token token) {
return identical(value, token.stringValue);
@@ -167,7 +169,8 @@ class Parser {
Token libraryKeyword = token;
listener.beginLibraryName(libraryKeyword);
assert(optional('library', token));
- token = parseQualified(token.next);
+ token = parseQualified(token.next, IdentifierContext.libraryName,
+ IdentifierContext.libraryNameContinuation);
Token semicolon = token;
token = expect(';', token);
listener.endLibraryName(libraryKeyword, semicolon);
@@ -189,7 +192,8 @@ class Parser {
Token asKeyword;
if (optional('as', token)) {
asKeyword = token;
- token = parseIdentifier(token.next);
+ token = parseIdentifier(
+ token.next, IdentifierContext.importPrefixDeclaration);
}
token = parseCombinators(token);
Token semicolon = token;
@@ -230,10 +234,11 @@ class Parser {
Token parseDottedName(Token token) {
listener.beginDottedName(token);
Token firstIdentifier = token;
- token = parseIdentifier(token);
+ token = parseIdentifier(token, IdentifierContext.dottedName);
int count = 1;
while (optional('.', token)) {
- token = parseIdentifier(token.next);
+ token =
+ parseIdentifier(token.next, IdentifierContext.dottedNameContinuation);
count++;
}
listener.endDottedName(count, firstIdentifier);
@@ -295,10 +300,10 @@ class Parser {
/// identifier (, identifier)*
Token parseIdentifierList(Token token) {
listener.beginIdentifierList(token);
- token = parseIdentifier(token);
+ token = parseIdentifier(token, IdentifierContext.combinator);
int count = 1;
while (optional(',', token)) {
- token = parseIdentifier(token.next);
+ token = parseIdentifier(token.next, IdentifierContext.combinator);
count++;
}
listener.endIdentifierList(count);
@@ -343,7 +348,8 @@ class Parser {
assert(optional('part', token));
assert(optional('of', token.next));
Token partKeyword = token;
- token = parseQualified(token.next.next);
+ token = parseQualified(token.next.next, IdentifierContext.partName,
+ IdentifierContext.partNameContinuation);
Token semicolon = token;
token = expect(';', token);
listener.endPartOf(partKeyword, semicolon);
@@ -369,13 +375,15 @@ class Parser {
listener.beginMetadata(token);
Token atToken = token;
assert(optional('@', token));
- token = parseIdentifier(token.next);
- token = parseQualifiedRestOpt(token);
+ token = parseIdentifier(token.next, IdentifierContext.metadataReference);
+ token =
+ parseQualifiedRestOpt(token, IdentifierContext.metadataContinuation);
token = parseTypeArgumentsOpt(token);
Token period = null;
if (optional('.', token)) {
period = token;
- token = parseIdentifier(token.next);
+ token = parseIdentifier(
+ token.next, IdentifierContext.metadataContinuationAfterTypeArguments);
}
token = parseArgumentsOpt(token);
listener.endMetadata(atToken, period, token);
@@ -386,7 +394,7 @@ class Parser {
Token typedefKeyword = token;
listener.beginFunctionTypeAlias(token);
token = parseReturnTypeOpt(token.next);
- token = parseIdentifier(token);
+ token = parseIdentifier(token, IdentifierContext.typedefDeclaration);
token = parseTypeVariablesOpt(token);
token = parseFormalParameters(token);
listener.endFunctionTypeAlias(typedefKeyword, token);
@@ -483,8 +491,11 @@ class Parser {
// TODO(ahe): Validate field initializers are only used in
// constructors, and not for function-typed arguments.
token = expect('.', token.next);
+ token = parseIdentifier(token, IdentifierContext.fieldInitializer);
+ } else {
+ token =
+ parseIdentifier(token, IdentifierContext.formalParameterDeclaration);
}
- token = parseIdentifier(token);
if (optional('(', token)) {
listener.beginFunctionTypedFormalParameter(token);
listener.handleNoTypeVariables(token);
@@ -643,26 +654,28 @@ class Parser {
return syntheticToken;
}
- Token parseQualified(Token token) {
- token = parseIdentifier(token);
+ Token parseQualified(Token token, IdentifierContext context,
+ IdentifierContext continuationContext) {
+ token = parseIdentifier(token, context);
while (optional('.', token)) {
- token = parseQualifiedRest(token);
+ token = parseQualifiedRest(token, continuationContext);
}
return token;
}
- Token parseQualifiedRestOpt(Token token) {
+ Token parseQualifiedRestOpt(
+ Token token, IdentifierContext continuationContext) {
if (optional('.', token)) {
- return parseQualifiedRest(token);
+ return parseQualifiedRest(token, continuationContext);
} else {
return token;
}
}
- Token parseQualifiedRest(Token token) {
+ Token parseQualifiedRest(Token token, IdentifierContext context) {
assert(optional('.', token));
Token period = token;
- token = parseIdentifier(token.next);
+ token = parseIdentifier(token.next, context);
listener.handleQualified(period);
return token;
}
@@ -686,16 +699,16 @@ class Parser {
Token parseEnum(Token token) {
listener.beginEnum(token);
Token enumKeyword = token;
- token = parseIdentifier(token.next);
+ token = parseIdentifier(token.next, IdentifierContext.enumDeclaration);
token = expect('{', token);
int count = 0;
if (!optional('}', token)) {
- token = parseIdentifier(token);
+ token = parseIdentifier(token, IdentifierContext.enumValueDeclaration);
count++;
while (optional(',', token)) {
token = token.next;
if (optional('}', token)) break;
- token = parseIdentifier(token);
+ token = parseIdentifier(token, IdentifierContext.enumValueDeclaration);
count++;
}
}
@@ -720,11 +733,12 @@ class Parser {
listener.handleModifiers(modifierCount);
bool isMixinApplication = optional('=', peekAfterType(token));
Token name = token.next;
- token = parseIdentifier(name);
if (isMixinApplication) {
+ token = parseIdentifier(name, IdentifierContext.namedMixinDeclaration);
listener.beginNamedMixinApplication(begin, name);
} else {
+ token = parseIdentifier(name, IdentifierContext.classDeclaration);
listener.beginClassDeclaration(begin, name);
}
@@ -787,11 +801,11 @@ class Parser {
return token.next;
}
- Token parseIdentifier(Token token) {
+ Token parseIdentifier(Token token, IdentifierContext context) {
if (!token.isIdentifier()) {
token = reportUnrecoverableError(token, ErrorKind.ExpectedIdentifier);
}
- listener.handleIdentifier(token);
+ listener.handleIdentifier(token, context);
return token.next;
}
@@ -805,7 +819,7 @@ class Parser {
Token parseTypeVariable(Token token) {
listener.beginTypeVariable(token);
- token = parseIdentifier(token);
+ token = parseIdentifier(token, IdentifierContext.typeVariableDeclaration);
Token extendsOrSuper = null;
if (optional('extends', token) || optional('super', token)) {
extendsOrSuper = token;
@@ -849,8 +863,9 @@ class Parser {
Token parseType(Token token) {
Token begin = token;
if (isValidTypeReference(token)) {
- token = parseIdentifier(token);
- token = parseQualifiedRestOpt(token);
+ token = parseIdentifier(token, IdentifierContext.typeReference);
+ token = parseQualifiedRestOpt(
+ token, IdentifierContext.typeReferenceContinuation);
} else {
token = reportUnrecoverableError(token, ErrorKind.ExpectedType);
listener.handleInvalidTypeReference(token);
@@ -1090,12 +1105,15 @@ class Parser {
}
}
- Token token = parseIdentifier(name);
+ IdentifierContext context = isTopLevel
+ ? IdentifierContext.topLevelVariableDeclaration
+ : IdentifierContext.fieldDeclaration;
+ Token token = parseIdentifier(name, context);
int fieldCount = 1;
token = parseFieldInitializerOpt(token);
while (optional(',', token)) {
- token = parseIdentifier(token.next);
+ token = parseIdentifier(token.next, context);
token = parseFieldInitializerOpt(token);
++fieldCount;
}
@@ -1135,7 +1153,8 @@ class Parser {
} else {
parseReturnTypeOpt(type);
}
- Token token = parseIdentifier(name);
+ Token token =
+ parseIdentifier(name, IdentifierContext.topLevelFunctionDeclaration);
if (getOrSet == null) {
token = parseTypeVariablesOpt(token);
@@ -1574,10 +1593,11 @@ class Parser {
{'modifier': staticModifier});
}
} else {
- token = parseIdentifier(name);
+ token = parseIdentifier(name, IdentifierContext.methodDeclaration);
}
- token = parseQualifiedRestOpt(token);
+ token = parseQualifiedRestOpt(
+ token, IdentifierContext.methodDeclarationContinuation);
if (getOrSet == null) {
token = parseTypeVariablesOpt(token);
} else {
@@ -1632,7 +1652,7 @@ class Parser {
listener.handleOperatorName(operator, token);
return token.next;
} else {
- return parseIdentifier(token);
+ return parseIdentifier(token, IdentifierContext.operatorName);
}
}
@@ -1647,7 +1667,8 @@ class Parser {
if (optional('operator', token)) {
token = parseOperatorName(token);
} else {
- token = parseIdentifier(token);
+ token =
+ parseIdentifier(token, IdentifierContext.localAccessorDeclaration);
ahe 2017/02/22 09:46:20 Not 100% sure, but I think dart2js sometimes uses
}
} else if (optional('operator', token)) {
// operator <op> (...
@@ -1664,10 +1685,12 @@ class Parser {
if (optional('operator', token)) {
token = parseOperatorName(token);
} else {
- token = parseIdentifier(token);
+ token =
+ parseIdentifier(token, IdentifierContext.localFunctionDeclaration);
}
}
- token = parseQualifiedRestOpt(token);
+ token = parseQualifiedRestOpt(
+ token, IdentifierContext.localFunctionDeclarationContinuation);
listener.endFunctionName(token);
if (getOrSet == null) {
token = parseTypeVariablesOpt(token);
@@ -1708,7 +1731,7 @@ class Parser {
listener.handleModifiers(0);
token = parseReturnTypeOpt(token);
listener.beginFunctionName(token);
- token = parseIdentifier(token);
+ token = parseIdentifier(token, IdentifierContext.functionExpressionName);
listener.endFunctionName(token);
token = parseTypeVariablesOpt(token);
token = parseFormalParameters(token);
@@ -1725,13 +1748,15 @@ class Parser {
Token parseConstructorReference(Token token) {
Token start = token;
listener.beginConstructorReference(start);
- token = parseIdentifier(token);
- token = parseQualifiedRestOpt(token);
+ token = parseIdentifier(token, IdentifierContext.constructorReference);
+ token = parseQualifiedRestOpt(
+ token, IdentifierContext.constructorReferenceContinuation);
token = parseTypeArgumentsOpt(token);
Token period = null;
if (optional('.', token)) {
period = token;
- token = parseIdentifier(token.next);
+ token = parseIdentifier(token.next,
+ IdentifierContext.constructorReferenceContinuationAfterTypeArguments);
}
listener.endConstructorReference(start, period, token);
return token;
@@ -2096,7 +2121,7 @@ class Parser {
}
Token parseLabel(Token token) {
- token = parseIdentifier(token);
+ token = parseIdentifier(token, IdentifierContext.labelDeclaration);
Token colon = token;
token = expect(':', token);
listener.handleLabel(colon);
@@ -2297,7 +2322,7 @@ class Parser {
if (optional('[', token)) {
token = parseArgumentOrIndexStar(token);
} else if (token.isIdentifier()) {
- token = parseSend(token);
+ token = parseSend(token, IdentifierContext.expressionContinuation);
listener.handleBinaryExpression(cascadeOperator);
} else {
return reportUnrecoverableError(token, ErrorKind.UnexpectedToken);
@@ -2307,7 +2332,7 @@ class Parser {
mark = token;
if (optional('.', token)) {
Token period = token;
- token = parseSend(token.next);
+ token = parseSend(token.next, IdentifierContext.expressionContinuation);
listener.handleBinaryExpression(period);
}
token = parseArgumentOrIndexStar(token);
@@ -2608,7 +2633,9 @@ class Parser {
}
Token parseSendOrFunctionLiteral(Token token) {
- if (!mayParseFunctionExpressions) return parseSend(token);
+ if (!mayParseFunctionExpressions) {
+ return parseSend(token, IdentifierContext.expression);
+ }
Token peek = peekAfterIfType(token);
if (peek != null &&
identical(peek.kind, IDENTIFIER_TOKEN) &&
@@ -2617,7 +2644,7 @@ class Parser {
} else if (isFunctionDeclaration(token.next)) {
return parseFunctionExpression(token);
} else {
- return parseSend(token);
+ return parseSend(token, IdentifierContext.expression);
}
}
@@ -2717,10 +2744,11 @@ class Parser {
return token.next;
} else {
int count = 1;
- token = parseIdentifier(token);
+ token = parseIdentifier(token, IdentifierContext.literalSymbol);
while (identical(token.stringValue, '.')) {
count++;
- token = parseIdentifier(token.next);
+ token = parseIdentifier(
+ token.next, IdentifierContext.literalSymbolContinuation);
}
listener.endLiteralSymbol(hashToken, count);
return token;
@@ -2768,9 +2796,9 @@ class Parser {
return token.next;
}
- Token parseSend(Token token) {
+ Token parseSend(Token token, IdentifierContext context) {
listener.beginSend(token);
- token = parseIdentifier(token);
+ token = parseIdentifier(token, context);
if (isValidMethodTypeArguments(token)) {
token = parseTypeArgumentsOpt(token);
} else {
@@ -2818,7 +2846,8 @@ class Parser {
}
Token colon = null;
if (optional(':', token.next.next)) {
- token = parseIdentifier(token.next);
+ token = parseIdentifier(
+ token.next, IdentifierContext.namedArgumentReference);
colon = token;
}
token = parseExpression(token.next);
@@ -2895,7 +2924,7 @@ class Parser {
Token parseOptionallyInitializedIdentifier(Token token) {
listener.beginInitializedIdentifier(token);
- token = parseIdentifier(token);
+ token = parseIdentifier(token, IdentifierContext.localVariableDeclaration);
token = parseVariableInitializerOpt(token);
listener.endInitializedIdentifier();
return token;
@@ -3216,7 +3245,7 @@ class Parser {
token = token.next;
bool hasTarget = false;
if (token.isIdentifier()) {
- token = parseIdentifier(token);
+ token = parseIdentifier(token, IdentifierContext.labelReference);
hasTarget = true;
}
listener.handleBreakStatement(hasTarget, breakKeyword, token);
@@ -3248,7 +3277,7 @@ class Parser {
token = token.next;
bool hasTarget = false;
if (token.isIdentifier()) {
- token = parseIdentifier(token);
+ token = parseIdentifier(token, IdentifierContext.labelReference);
hasTarget = true;
}
listener.handleContinueStatement(hasTarget, continueKeyword, token);
« no previous file with comments | « pkg/front_end/lib/src/fasta/parser/main.dart ('k') | pkg/front_end/lib/src/fasta/source/stack_listener.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698