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

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

Issue 2759173002: Switch to IdentifierContext. (Closed)
Patch Set: Status file. 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
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 50658378e4e55d873045e76eb43bf29f18fa089a..3ffc0c3ccc394b68551bb28d4ba347cf8a83f2e8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart
@@ -12,6 +12,8 @@ import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart' show CoreTypes;
+import '../builder/scope.dart' show AccessErrorBuilder, ProblemBuilder;
+
import '../errors.dart' show internalError, printUnexpected;
import 'frontend_accessors.dart' as kernel
@@ -54,7 +56,7 @@ abstract class BuilderHelper {
Expression buildStaticInvocation(Procedure target, Arguments arguments);
- Expression buildProblemExpression(Builder builder, String name);
+ Expression buildProblemExpression(ProblemBuilder builder, int charOffset);
}
abstract class BuilderAccessor implements Accessor {
@@ -347,7 +349,7 @@ class SendAccessor extends IncompleteSend {
return buildThrowNoSuchMethodError(arguments);
}
if (builder.hasProblem) {
- result = helper.buildProblemExpression(builder, name.name);
+ result = helper.buildProblemExpression(builder, charOffset);
} else {
Member target = builder.target;
if (target != null) {
@@ -427,37 +429,24 @@ 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, name.name)
- ..fileOffset = 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);
@@ -573,6 +562,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) {
@@ -725,7 +735,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/lib/src/fasta/kernel/kernel_library_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698