Index: pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart |
diff --git a/pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart b/pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart |
index cc0b9364fddddffb42ed67c26753f7965337d8ca..0ef849036add23a128e7707c15cddc435b411b97 100644 |
--- a/pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart |
+++ b/pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart |
@@ -12,7 +12,7 @@ import 'package:kernel/ast.dart'; |
import 'package:kernel/core_types.dart' show CoreTypes; |
-import '../builder/scope.dart' show ProblemBuilder; |
+import '../builder/scope.dart' show AccessErrorBuilder, ProblemBuilder; |
import '../errors.dart' show internalError, printUnexpected; |
@@ -429,36 +429,21 @@ class IncompletePropertyAccessor extends IncompleteSend { |
} |
if (receiver is KernelClassBuilder) { |
Builder builder = receiver.findStaticBuilder(name.name, charOffset, uri); |
- Member getter = builder?.target; |
- Member setter; |
if (builder == null) { |
- builder = receiver.findStaticBuilder(name.name, charOffset, uri, |
- isSetter: true); |
- if (builder == null) { |
- return buildThrowNoSuchMethodError(null); |
- } |
- setter = builder.target; |
- } |
- if (builder.hasProblem) { |
- return helper.buildProblemExpression(builder, charOffset); |
- } |
- if (getter is Field) { |
- if (!getter.isFinal && !getter.isConst) { |
- setter = getter; |
- } |
- } else if (getter is Procedure) { |
- if (getter.isGetter) { |
- builder = receiver.findStaticBuilder(name.name, charOffset, uri, |
- isSetter: true); |
- if (builder != null && !builder.hasProblem) { |
- setter = builder.target; |
- } |
- } |
+ // If we find a setter, [builder] is an [AccessErrorBuilder], not null. |
+ return buildThrowNoSuchMethodError(null); |
} |
- if (getter == null && setter == null) { |
- return internalError("No accessor for '$name'."); |
+ Builder setter; |
+ if (builder.isSetter) { |
+ setter = builder; |
+ } else if (builder.isGetter) { |
+ setter = receiver.findStaticBuilder(name.name, charOffset, uri, |
+ isSetter: true); |
+ } else if (builder.isField && !builder.isFinal) { |
+ setter = builder; |
} |
- return new StaticAccessor(helper, charOffset, getter, setter); |
+ return new StaticAccessor.fromBuilder( |
+ helper, builder, charOffset, setter); |
} |
return PropertyAccessor.make(helper, charOffset, helper.toValue(receiver), |
name, null, null, isNullAware); |
@@ -574,6 +559,27 @@ class StaticAccessor extends kernel.StaticAccessor with BuilderAccessor { |
assert(readTarget != null || writeTarget != null); |
} |
+ factory StaticAccessor.fromBuilder(BuilderHelper helper, Builder builder, |
+ int charOffset, Builder builderSetter) { |
+ if (builder is AccessErrorBuilder) { |
+ AccessErrorBuilder error = builder; |
+ builder = error.builder; |
+ // We should only see an access error here if we've looked up a setter |
+ // when not explicitly looking for a setter. |
+ assert(builder.isSetter); |
+ } else if (builder.target == null) { |
+ return internalError("Unhandled: ${builder}"); |
+ } |
+ Member getter = builder.target.hasGetter ? builder.target : null; |
+ Member setter = builder.target.hasSetter ? builder.target : null; |
+ if (setter == null) { |
+ if (builderSetter?.target?.hasSetter ?? false) { |
+ setter = builderSetter.target; |
+ } |
+ } |
+ return new StaticAccessor(helper, charOffset, getter, setter); |
+ } |
+ |
String get plainNameForRead => (readTarget ?? writeTarget).name.name; |
Expression doInvocation(int charOffset, Arguments arguments) { |
@@ -726,7 +732,17 @@ class VariableAccessor extends kernel.VariableAccessor with BuilderAccessor { |
Expression throwNoSuchMethodError(String name, Arguments arguments, Uri uri, |
int charOffset, CoreTypes coreTypes, |
{bool isSuper: false, isGetter: false, isSetter: false}) { |
- printUnexpected(uri, charOffset, "Method not found: '$name'."); |
+ String errorName = name; |
+ if (isSuper) { |
+ errorName = "super.$name"; |
+ } |
+ if (isGetter) { |
+ printUnexpected(uri, charOffset, "Getter not found: '$errorName'."); |
+ } else if (isSetter) { |
+ printUnexpected(uri, charOffset, "Setter not found: '$errorName'."); |
+ } else { |
+ printUnexpected(uri, charOffset, "Method not found: '$name'."); |
+ } |
Constructor constructor = |
coreTypes.getClass("dart:core", "NoSuchMethodError").constructors.first; |
return new Throw(new ConstructorInvocation( |