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 19cbda29b0755b886d3ad236fa404742a3c75704..26554d07036160a76aa908880917b2b49b8038e5 100644 |
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart |
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart |
@@ -719,8 +719,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
this.scope.parent == enclosingScope); |
// This deals with this kind of initializer: `C(a) : a = a;` |
Scope scope = inInitializer ? enclosingScope : this.scope; |
- Builder builder = scope.lookup(name, token.charOffset, uri); |
- push(builderToFirstExpression(builder, name, token.charOffset)); |
+ push(scopeLookup(scope, name, token.charOffset)); |
return; |
} else if (context.inDeclaration) { |
if (context == IdentifierContext.topLevelVariableDeclaration || |
@@ -735,12 +734,17 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
push(new Identifier(name)..fileOffset = token.charOffset); |
} |
+ /// Look up [name] in [scope] using [charOffset] to report any |
+ /// problems. [isQualified] should be true if [name] is a qualified access |
+ /// (which implies that it shouldn't be turned into a [ThisPropertyAccessor] |
+ /// if the name doesn't resolve in the scope). |
@override |
- builderToFirstExpression(Builder builder, String name, int charOffset, |
- {bool isPrefix: false}) { |
+ scopeLookup(Scope scope, String name, int charOffset, |
+ {bool isQualified: false}) { |
+ Builder builder = scope.lookup(name, charOffset, uri); |
if (builder == null || (!isInstanceContext && builder.isInstanceMember)) { |
Name n = new Name(name, library.library); |
- if (!isPrefix && isInstanceContext) { |
+ if (!isQualified && isInstanceContext) { |
assert(builder == null); |
if (constantExpressionRequired) { |
addCompileTimeError(charOffset, "Not a constant expression."); |
@@ -776,12 +780,6 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
return new StaticAccessor(this, charOffset, builder.target, null); |
} else if (builder is PrefixBuilder) { |
return builder; |
- } else if (builder is MixedAccessor) { |
- if (constantExpressionRequired && !builder.getter.target.isConst) { |
- addCompileTimeError(charOffset, "Not a constant expression."); |
- } |
- return new StaticAccessor( |
- this, charOffset, builder.getter.target, builder.setter.target); |
} else { |
if (builder.hasProblem && builder is! AccessErrorBuilder) return builder; |
Builder setter; |
@@ -1278,9 +1276,8 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
builder = scope.lookup(prefix, beginToken.charOffset, uri); |
} |
if (builder is PrefixBuilder) { |
- name = builderToFirstExpression( |
- builder.exports[suffix], suffix, beginToken.charOffset, |
- isPrefix: true); |
+ name = scopeLookup(builder.exports, suffix, beginToken.charOffset, |
+ isQualified: true); |
} else { |
push(const DynamicType()); |
addCompileTimeError(beginToken.charOffset, |
@@ -1658,9 +1655,8 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
var prefix = type[0]; |
identifier = type[1]; |
if (prefix is PrefixBuilder) { |
- // TODO(ahe): Handle privacy in prefix.exports. |
- type = builderToFirstExpression( |
- prefix.exports[identifier.name], identifier.name, start.charOffset); |
+ type = scopeLookup(prefix.exports, identifier.name, start.charOffset, |
+ isQualified: true); |
identifier = null; |
} else if (prefix is ClassBuilder) { |
type = prefix; |