| 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(
|
|
|