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

Unified Diff: pkg/front_end/lib/src/fasta/source/outline_builder.dart

Issue 2771983004: Implement character offsets for fields and enum constants. (Closed)
Patch Set: Remove TODO. Created 3 years, 9 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/source/outline_builder.dart
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index f14505d31162da0c070381b73937e3b54d16d987..88acba4b52b609ae9af5c009b072948bc9f30e02 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -8,6 +8,8 @@ import 'package:kernel/ast.dart' show AsyncMarker, ProcedureKind;
import '../parser/parser.dart' show FormalParameterType, optional;
+import '../parser/identifier_context.dart' show IdentifierContext;
+
import '../scanner/token.dart' show Token;
import '../util/link.dart' show Link;
@@ -74,20 +76,36 @@ class OutlineBuilder extends UnhandledListener {
Uri get uri => library.fileUri;
@override
+ int popCharOffset() => pop();
+
+ List<String> popIdentifierList(int count) {
+ if (count == 0) return null;
+ List<String> list = new List<String>.filled(count, null, growable: true);
+ for (int i = count - 1; i >= 0; i--) {
+ popCharOffset();
+ list[i] = pop();
+ }
+ return list;
+ }
+
+ @override
void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
debugEvent("Metadata");
List arguments = pop();
+ popIfNotNull(periodBeforeName); // charOffset.
String postfix = popIfNotNull(periodBeforeName);
List<TypeBuilder> typeArguments = pop();
if (arguments == null) {
+ int charOffset = pop();
String expression = pop();
push(new MetadataBuilder.fromExpression(
- expression, postfix, library, beginToken.charOffset));
+ expression, postfix, library, charOffset));
} else {
+ int charOffset = pop();
String typeName = pop();
push(new MetadataBuilder.fromConstructor(
library.addConstructorReference(
- typeName, typeArguments, postfix, beginToken.next.charOffset),
+ typeName, typeArguments, postfix, charOffset),
arguments,
library,
beginToken.charOffset));
@@ -119,6 +137,7 @@ class OutlineBuilder extends UnhandledListener {
debugEvent("Export");
List<Combinator> combinators = pop();
Unhandled conditionalUris = pop();
+ popCharOffset();
String uri = pop();
List<MetadataBuilder> metadata = pop();
if (uri != null) {
@@ -133,20 +152,15 @@ class OutlineBuilder extends UnhandledListener {
Token semicolon) {
debugEvent("endImport");
List<Combinator> combinators = pop();
+ int prefixOffset = popIfNotNull(asKeyword) ?? -1;
String prefix = popIfNotNull(asKeyword);
Unhandled conditionalUris = pop();
+ popCharOffset();
String uri = pop();
List<MetadataBuilder> metadata = pop();
if (uri != null) {
- library.addImport(
- metadata,
- uri,
- conditionalUris,
- prefix,
- combinators,
- deferredKeyword != null,
- importKeyword.charOffset,
- asKeyword?.next?.charOffset ?? -1);
+ library.addImport(metadata, uri, conditionalUris, prefix, combinators,
+ deferredKeyword != null, importKeyword.charOffset, prefixOffset);
}
checkEmpty(importKeyword.charOffset);
}
@@ -155,11 +169,13 @@ class OutlineBuilder extends UnhandledListener {
void handleRecoverExpression(Token token) {
debugEvent("RecoverExpression");
push(NullValue.Expression);
+ push(token.charOffset);
}
@override
void endPart(Token partKeyword, Token semicolon) {
debugEvent("Part");
+ popCharOffset();
String uri = pop();
List<MetadataBuilder> metadata = pop();
if (uri != null) {
@@ -172,25 +188,68 @@ class OutlineBuilder extends UnhandledListener {
void handleOperatorName(Token operatorKeyword, Token token) {
debugEvent("OperatorName");
push(operatorFromString(token.stringValue));
+ push(token.charOffset);
+ }
+
+ @override
+ void handleIdentifier(Token token, IdentifierContext context) {
+ super.handleIdentifier(token, context);
+ push(token.charOffset);
+ }
+
+ @override
+ void handleNoName(Token token) {
+ super.handleNoName(token);
+ push(token.charOffset);
+ }
+
+ @override
+ void endLiteralString(int interpolationCount, Token endToken) {
+ debugEvent("endLiteralString");
+ if (interpolationCount == 0) {
+ Token token = pop();
+ push(unescapeString(token.lexeme));
+ push(token.charOffset);
+ } else {
+ internalError("String interpolation not implemented.");
+ }
+ }
+
+ @override
+ void handleStringJuxtaposition(int literalCount) {
+ debugEvent("StringJuxtaposition");
+ List<String> list =
+ new List<String>.filled(literalCount, null, growable: false);
+ int charOffset = -1;
+ for (int i = literalCount - 1; i >= 0; i--) {
+ charOffset = pop();
+ list[i] = pop();
+ }
+ push(list.join(""));
+ push(charOffset);
}
@override
void endIdentifierList(int count) {
debugEvent("endIdentifierList");
- push(popList(count) ?? NullValue.IdentifierList);
+ push(popIdentifierList(count) ?? NullValue.IdentifierList);
}
@override
void handleQualified(Token period) {
debugEvent("handleQualified");
+ int charOffset = pop();
String name = pop();
+ charOffset = pop(); // We just want the charOffset of receiver.
String receiver = pop();
push("$receiver.$name");
+ push(charOffset);
}
@override
void endLibraryName(Token libraryKeyword, Token semicolon) {
debugEvent("endLibraryName");
+ popCharOffset();
String name = pop();
List<MetadataBuilder> metadata = pop();
library.name = name;
@@ -214,6 +273,7 @@ class OutlineBuilder extends UnhandledListener {
List<TypeBuilder> interfaces = popList(interfacesCount);
TypeBuilder supertype = pop();
List<TypeVariableBuilder> typeVariables = pop();
+ int charOffset = pop();
String name = pop();
if (typeVariables != null && supertype is MixinApplicationBuilder) {
supertype.typeVariables = typeVariables;
@@ -222,7 +282,7 @@ class OutlineBuilder extends UnhandledListener {
int modifiers = Modifier.validate(pop());
List<MetadataBuilder> metadata = pop();
library.addClass(metadata, modifiers, name, typeVariables, supertype,
- interfaces, classKeyword.next?.charOffset ?? beginToken.charOffset);
+ interfaces, charOffset);
checkEmpty(beginToken.charOffset);
}
@@ -246,6 +306,7 @@ class OutlineBuilder extends UnhandledListener {
List<FormalParameterBuilder> formals = pop();
int formalsOffset = pop();
List<TypeVariableBuilder> typeVariables = pop();
+ int charOffset = pop();
String name = pop();
TypeBuilder returnType = pop();
int modifiers =
@@ -261,7 +322,7 @@ class OutlineBuilder extends UnhandledListener {
formals,
asyncModifier,
computeProcedureKind(getOrSet),
- beginToken.charOffset,
+ charOffset,
formalsOffset,
endToken.charOffset,
nativeMethodName,
@@ -298,6 +359,7 @@ class OutlineBuilder extends UnhandledListener {
List<FormalParameterBuilder> formals = pop();
int formalsOffset = pop();
List<TypeVariableBuilder> typeVariables = pop();
+ int charOffset = pop();
dynamic nameOrOperator = pop();
if (Operator.subtract == nameOrOperator && formals == null) {
nameOrOperator = Operator.unaryMinus;
@@ -324,7 +386,7 @@ class OutlineBuilder extends UnhandledListener {
formals,
asyncModifier,
kind,
- beginToken.charOffset,
+ charOffset,
formalsOffset,
endToken.charOffset,
nativeMethodName,
@@ -352,6 +414,7 @@ class OutlineBuilder extends UnhandledListener {
List<TypeBuilder> interfaces = popIfNotNull(implementsKeyword);
TypeBuilder mixinApplication = pop();
List<TypeVariableBuilder> typeVariables = pop();
+ int charOffset = pop();
String name = pop();
if (typeVariables != null && mixinApplication is MixinApplicationBuilder) {
mixinApplication.typeVariables = typeVariables;
@@ -360,7 +423,7 @@ class OutlineBuilder extends UnhandledListener {
int modifiers = Modifier.validate(pop());
List<MetadataBuilder> metadata = pop();
library.addNamedMixinApplication(metadata, name, typeVariables, modifiers,
- mixinApplication, interfaces, beginToken.charOffset);
+ mixinApplication, interfaces, charOffset);
checkEmpty(beginToken.charOffset);
}
@@ -379,8 +442,9 @@ class OutlineBuilder extends UnhandledListener {
void handleType(Token beginToken, Token endToken) {
debugEvent("Type");
List<TypeBuilder> arguments = pop();
+ int charOffset = pop();
String name = pop();
- push(library.addNamedType(name, arguments, beginToken.charOffset));
+ push(library.addNamedType(name, arguments, charOffset));
}
@override
@@ -405,18 +469,13 @@ class OutlineBuilder extends UnhandledListener {
void endFormalParameter(Token covariantKeyword, Token thisKeyword,
Token nameToken, FormalParameterType kind) {
debugEvent("FormalParameter");
+ int charOffset = pop();
String name = pop();
TypeBuilder type = pop();
int modifiers = Modifier.validate(pop());
List<MetadataBuilder> metadata = pop();
- // TODO(ahe): Needs begin token.
push(library.addFormalParameter(
- metadata,
- modifiers,
- type,
- name,
- thisKeyword != null,
- thisKeyword?.charOffset ?? nameToken?.charOffset ?? -1));
+ metadata, modifiers, type, name, thisKeyword != null, charOffset));
}
@override
@@ -438,10 +497,12 @@ class OutlineBuilder extends UnhandledListener {
pop(); // Function type parameters.
pop(); // Formals offset
pop(); // Type variables.
+ int charOffset = pop();
String name = pop();
pop(); // Return type.
push(NullValue.Type);
push(name);
+ push(charOffset);
}
@override
@@ -502,11 +563,12 @@ class OutlineBuilder extends UnhandledListener {
@override
void endEnum(Token enumKeyword, Token endBrace, int count) {
- List<String> constants = popList(count);
+ List constantNamesAndOffsets = popList(count * 2);
+ int charOffset = pop();
String name = pop();
List<MetadataBuilder> metadata = pop();
- library.addEnum(
- metadata, name, constants, enumKeyword.charOffset, endBrace.charOffset);
+ library.addEnum(metadata, name, constantNamesAndOffsets, charOffset,
+ endBrace.charOffset);
checkEmpty(enumKeyword.charOffset);
}
@@ -534,15 +596,18 @@ class OutlineBuilder extends UnhandledListener {
List<TypeVariableBuilder> typeVariables;
String name;
TypeBuilder returnType;
+ int charOffset;
if (equals == null) {
formals = pop();
pop(); // formals offset
typeVariables = pop();
+ charOffset = pop();
name = pop();
returnType = pop();
} else {
var type = pop();
typeVariables = pop();
+ charOffset = pop();
name = pop();
if (type is FunctionTypeBuilder) {
// TODO(ahe): We need to start a nested declaration when parsing the
@@ -559,19 +624,19 @@ class OutlineBuilder extends UnhandledListener {
}
}
List<MetadataBuilder> metadata = pop();
- library.addFunctionTypeAlias(metadata, returnType, name, typeVariables,
- formals, typedefKeyword.charOffset);
+ library.addFunctionTypeAlias(
+ metadata, returnType, name, typeVariables, formals, charOffset);
checkEmpty(typedefKeyword.charOffset);
}
@override
void endTopLevelFields(int count, Token beginToken, Token endToken) {
debugEvent("endTopLevelFields");
- List<String> names = popList(count);
+ List namesAndOffsets = popList(count * 2);
TypeBuilder type = pop();
int modifiers = Modifier.validate(pop());
List<MetadataBuilder> metadata = pop();
- library.addFields(metadata, modifiers, type, names);
+ library.addFields(metadata, modifiers, type, namesAndOffsets);
checkEmpty(beginToken.charOffset);
}
@@ -579,27 +644,29 @@ class OutlineBuilder extends UnhandledListener {
void endFields(
int count, Token covariantToken, Token beginToken, Token endToken) {
debugEvent("Fields");
- List<String> names = popList(count);
+ List namesAndOffsets = popList(count * 2);
TypeBuilder type = pop();
int modifiers = Modifier.validate(pop());
List<MetadataBuilder> metadata = pop();
- library.addFields(metadata, modifiers, type, names);
+ library.addFields(metadata, modifiers, type, namesAndOffsets);
}
@override
void endTypeVariable(Token token, Token extendsOrSuper) {
debugEvent("endTypeVariable");
TypeBuilder bound = pop();
+ int charOffset = pop();
String name = pop();
// TODO(paulberry): type variable metadata should not be ignored. See
// dartbug.com/28981.
/* List<MetadataBuilder> metadata = */ pop();
- push(library.addTypeVariable(name, bound, token.charOffset));
+ push(library.addTypeVariable(name, bound, charOffset));
}
@override
void endPartOf(Token partKeyword, Token semicolon, bool hasName) {
debugEvent("endPartOf");
+ popCharOffset();
String containingLibrary = pop();
List<MetadataBuilder> metadata = pop();
if (hasName) {
@@ -613,11 +680,13 @@ class OutlineBuilder extends UnhandledListener {
void endConstructorReference(
Token start, Token periodBeforeName, Token endToken) {
debugEvent("ConstructorReference");
+ popIfNotNull(periodBeforeName); // charOffset.
String suffix = popIfNotNull(periodBeforeName);
List<TypeBuilder> typeArguments = pop();
+ int charOffset = pop();
String name = pop();
push(library.addConstructorReference(
- name, typeArguments, suffix, start.charOffset));
+ name, typeArguments, suffix, charOffset));
}
@override
@@ -647,7 +716,7 @@ class OutlineBuilder extends UnhandledListener {
formals,
asyncModifier,
redirectionTarget,
- beginToken.charOffset,
+ factoryKeyword.next.charOffset,
formalsOffset,
endToken.charOffset,
nativeMethodName);

Powered by Google App Engine
This is Rietveld 408576698