| Index: pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| index 93e10fb018195c5729e0803e9c208cdb678d2f11..eb3293679c144ca580d42acaba414182fd435cf2 100644
|
| --- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| @@ -110,8 +110,6 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
|
|
| Scope formalParameterScope;
|
|
|
| - bool isFirstIdentifier = false;
|
| -
|
| bool inInitializer = false;
|
|
|
| bool inCatchClause = false;
|
| @@ -153,7 +151,6 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
|
|
| @override
|
| void push(Object node) {
|
| - isFirstIdentifier = false;
|
| inInitializer = false;
|
| super.push(node);
|
| }
|
| @@ -715,16 +712,10 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| }
|
|
|
| @override
|
| - void beginExpression(Token token) {
|
| - debugEvent("beginExpression");
|
| - isFirstIdentifier = true;
|
| - }
|
| -
|
| - @override
|
| void handleIdentifier(Token token, IdentifierContext context) {
|
| debugEvent("handleIdentifier");
|
| String name = token.lexeme;
|
| - if (isFirstIdentifier) {
|
| + if (context.isScopeReference) {
|
| assert(!inInitializer ||
|
| this.scope == enclosingScope ||
|
| this.scope.parent == enclosingScope);
|
| @@ -1150,11 +1141,6 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| push(new MapEntry(key, value));
|
| }
|
|
|
| - @override
|
| - void beginLiteralSymbol(Token token) {
|
| - isFirstIdentifier = false;
|
| - }
|
| -
|
| String symbolPartToString(name) {
|
| if (name is Identifier) {
|
| return name.name;
|
| @@ -1181,15 +1167,26 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| push(new SymbolLiteral(value));
|
| }
|
|
|
| - DartType toKernelType(String name, List<DartType> arguments, int charOffset) {
|
| + DartType kernelTypeFromString(
|
| + String name, List<DartType> arguments, int charOffset) {
|
| Builder builder = scope.lookup(name, charOffset, uri);
|
| - if (builder is TypeDeclarationBuilder) {
|
| - return builder.buildTypesWithBuiltArguments(library, arguments);
|
| - }
|
| if (builder == null) {
|
| warning("Type not found: '$name'.", charOffset);
|
| + return const DynamicType();
|
| + } else {
|
| + return kernelTypeFromBuilder(builder, arguments, charOffset);
|
| + }
|
| + }
|
| +
|
| + DartType kernelTypeFromBuilder(
|
| + Builder builder, List<DartType> arguments, int charOffset) {
|
| + if (builder is TypeDeclarationBuilder) {
|
| + return builder.buildTypesWithBuiltArguments(library, arguments);
|
| + } else if (builder.hasProblem) {
|
| + ProblemBuilder problem = builder;
|
| + addCompileTimeError(charOffset, problem.message);
|
| } else {
|
| - warning("Not a type: '$name'.", charOffset);
|
| + warning("Not a type: '${builder.fullNameForErrors}'.", charOffset);
|
| }
|
| // TODO(ahe): Create an error somehow.
|
| return const DynamicType();
|
| @@ -1220,7 +1217,9 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| builder = scope.lookup(prefix, beginToken.charOffset, uri);
|
| }
|
| if (builder is PrefixBuilder) {
|
| - name = builder.exports[suffix];
|
| + name = builderToFirstExpression(
|
| + builder.exports[suffix], suffix, beginToken.charOffset,
|
| + isPrefix: true);
|
| } else {
|
| push(const DynamicType());
|
| addCompileTimeError(beginToken.charOffset,
|
| @@ -1243,8 +1242,12 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| push(name.buildTypesWithBuiltArguments(library, arguments));
|
| } else if (name is TypeBuilder) {
|
| push(name.build(library));
|
| + } else if (name is Builder) {
|
| + push(kernelTypeFromBuilder(name, arguments, beginToken.charOffset));
|
| + } else if (name is String) {
|
| + push(kernelTypeFromString(name, arguments, beginToken.charOffset));
|
| } else {
|
| - push(toKernelType(name, arguments, beginToken.charOffset));
|
| + internalError("Unhandled: '${name.runtimeType}'.");
|
| }
|
| if (peek() is TypeParameterType) {
|
| TypeParameterType type = peek();
|
| @@ -1721,7 +1724,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| @override
|
| void handleThisExpression(Token token, IdentifierContext context) {
|
| debugEvent("ThisExpression");
|
| - if (isFirstIdentifier && isInstanceContext) {
|
| + if (context.isScopeReference && isInstanceContext) {
|
| push(new ThisAccessor(this, token.charOffset, inInitializer));
|
| } else {
|
| push(new IncompleteError(
|
| @@ -1732,7 +1735,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| @override
|
| void handleSuperExpression(Token token, IdentifierContext context) {
|
| debugEvent("SuperExpression");
|
| - if (isFirstIdentifier && isInstanceContext) {
|
| + if (context.isScopeReference && isInstanceContext) {
|
| Member member = this.member.target;
|
| member.transformerFlags |= TransformerFlag.superCalls;
|
| push(new ThisAccessor(this, token.charOffset, inInitializer,
|
|
|