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

Unified Diff: pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart

Issue 2765943002: Improve handling of complicated getters and setters. (Closed)
Patch Set: Update status files. 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
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/body_builder.dart ('k') | pkg/front_end/test/fasta/compile.status » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/body_builder.dart ('k') | pkg/front_end/test/fasta/compile.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698