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

Unified Diff: pkg/front_end/lib/src/fasta/analyzer/ast_builder.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/analyzer/ast_builder.dart
diff --git a/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart b/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
index 558e49fcbb586950c26ae186594cd59c6d439fa3..76f75fc96f7bc05ee0abbe5daddfac89a785fdb5 100644
--- a/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
+++ b/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
@@ -29,6 +29,8 @@ import '../kernel/kernel_builder.dart'
import '../parser/parser.dart' show optional;
+import '../parser/identifier_context.dart' show IdentifierContext;
+
import '../quote.dart';
import '../source/outline_builder.dart' show asyncMarkerFromTokens;
@@ -53,16 +55,9 @@ class AstBuilder extends ScopeListener {
final ElementStore elementStore;
- bool isFirstIdentifier = false;
-
@override
final Uri uri;
- /// If `true`, the first call to [handleIdentifier] should push a
- /// List<SimpleIdentifier> on the stack, and [handleQualified] should append
- /// to the list.
- var accumulateIdentifierComponents = false;
-
AstBuilder(this.library, this.member, this.elementStore, Scope scope,
[Uri uri])
: uri = uri ?? library.fileUri,
@@ -132,22 +127,18 @@ class AstBuilder extends ScopeListener {
push(ast.methodInvocation(null, null, null, null, arguments));
}
- void beginExpression(Token token) {
- isFirstIdentifier = true;
- }
-
- void handleIdentifier(Token token) {
+ void handleIdentifier(Token token, IdentifierContext context) {
debugEvent("handleIdentifier");
String name = token.value;
SimpleIdentifier identifier = ast.simpleIdentifier(toAnalyzerToken(token));
- if (accumulateIdentifierComponents) {
- if (isFirstIdentifier) {
+ if (context.inLibraryOrPartOfDeclaration) {
+ if (!context.isContinuation) {
push([identifier]);
} else {
push(identifier);
}
} else {
- if (isFirstIdentifier) {
+ if (context.isScopeReference) {
Builder builder = scope.lookup(name, token.charOffset, uri);
if (builder != null) {
Element element = elementStore[builder];
@@ -157,7 +148,6 @@ class AstBuilder extends ScopeListener {
}
push(identifier);
}
- isFirstIdentifier = false;
}
void endSend(Token token) {
@@ -407,10 +397,6 @@ class AstBuilder extends ScopeListener {
push(ast.awaitExpression(toAnalyzerToken(beginToken), pop()));
}
- void beginLiteralSymbol(Token token) {
- isFirstIdentifier = false;
- }
-
void handleLiteralBool(Token token) {
debugEvent("LiteralBool");
bool value = identical(token.stringValue, "true");
@@ -461,20 +447,7 @@ class AstBuilder extends ScopeListener {
// TODO(paulberry,ahe): what if the type doesn't resolve to a class
// element?
KernelClassElement cls = name.staticElement;
- if (cls == null) {
- // TODO(paulberry): This is a kludge. Ideally we should already have
- // set the static element at the time that handleIdentifier was called.
- Builder builder = scope.lookup(name.name, beginToken.charOffset, uri);
- if (builder == null) {
- internalError("Undefined name: $name");
- }
- cls = elementStore[builder];
- assert(cls != null);
- if (name is SimpleIdentifier) {
- name.staticElement = cls;
- }
- }
- push(ast.typeName(name, arguments)..type = cls.rawType);
+ push(ast.typeName(name, arguments)..type = cls?.rawType);
}
void handleAsOperator(Token operator, Token endToken) {
@@ -877,8 +850,8 @@ class AstBuilder extends ScopeListener {
}
@override
- void endNamedMixinApplication(
- Token beginToken, Token equalsToken, Token implementsKeyword, Token endToken) {
+ void endNamedMixinApplication(Token beginToken, Token equalsToken,
+ Token implementsKeyword, Token endToken) {
debugEvent("NamedMixinApplication");
ImplementsClause implementsClause;
if (implementsKeyword != null) {
@@ -923,12 +896,6 @@ class AstBuilder extends ScopeListener {
}
@override
- void beginLibraryName(Token token) {
- accumulateIdentifierComponents = true;
- isFirstIdentifier = true;
- }
-
- @override
void endLibraryName(Token libraryKeyword, Token semicolon) {
debugEvent("LibraryName");
List<SimpleIdentifier> libraryName = pop();
@@ -938,25 +905,22 @@ class AstBuilder extends ScopeListener {
Comment comment = null;
push(ast.libraryDirective(comment, metadata,
toAnalyzerToken(libraryKeyword), name, toAnalyzerToken(semicolon)));
- accumulateIdentifierComponents = false;
}
@override
void handleQualified(Token period) {
SimpleIdentifier identifier = pop();
- if (accumulateIdentifierComponents) {
- List<SimpleIdentifier> list = pop();
- list.add(identifier);
- push(list);
+ var prefix = pop();
+ if (prefix is List) {
+ // We're just accumulating components into a list.
+ prefix.add(identifier);
+ push(prefix);
+ } else if (prefix is SimpleIdentifier) {
+ // TODO(paulberry): resolve [identifier].
+ push(ast.prefixedIdentifier(prefix, toAnalyzerToken(period), identifier));
} else {
- var prefix = pop();
- if (prefix is SimpleIdentifier) {
- // TODO(paulberry): resolve [identifier].
- push(ast.prefixedIdentifier(prefix, toAnalyzerToken(period), identifier));
- } else {
- // TODO(paulberry): implement.
- logEvent('Qualified with >1 dot');
- }
+ // TODO(paulberry): implement.
+ logEvent('Qualified with >1 dot');
}
}
@@ -972,12 +936,6 @@ class AstBuilder extends ScopeListener {
}
@override
- void beginPartOf(Token token) {
- accumulateIdentifierComponents = true;
- isFirstIdentifier = true;
- }
-
- @override
void endPartOf(Token partKeyword, Token semicolon) {
debugEvent("PartOf");
List<SimpleIdentifier> libraryName = pop();
@@ -991,7 +949,6 @@ class AstBuilder extends ScopeListener {
Comment comment = null;
push(ast.partOfDirective(comment, metadata, toAnalyzerToken(partKeyword),
toAnalyzerToken(ofKeyword), uri, name, toAnalyzerToken(semicolon)));
- accumulateIdentifierComponents = false;
}
void endUnnamedFunction(Token token) {
@@ -1119,7 +1076,7 @@ class AstBuilder extends ScopeListener {
debugEvent("VoidKeyword");
// TODO(paulberry): is this sufficient, or do we need to hook the "void"
// keyword up to an element?
- handleIdentifier(token);
+ handleIdentifier(token, IdentifierContext.typeReference);
handleNoTypeArguments(token);
endType(token, token);
}

Powered by Google App Engine
This is Rietveld 408576698