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

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

Issue 2790743004: Handle unresolved identifiers with an accessor. (Closed)
Patch Set: Update 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
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/body_builder.dart ('k') | tests/co19/co19-kernel.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/fasta_accessors.dart
diff --git a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
index 6bfae59e08c1d243a5ed6772550eb6f13861eb98..c6e7e93e69459914c5790eb982220dd67ee29d87 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
@@ -88,7 +88,7 @@ abstract class FastaAccessor implements Accessor {
isSetter: true);
}
- /* Expression | FastaAccessor */ doInvocation(
+ /* Expression | FastaAccessor | Initializer */ doInvocation(
int offset, Arguments arguments);
/* Expression | FastaAccessor */ buildPropertyAccess(
@@ -106,8 +106,8 @@ abstract class FastaAccessor implements Accessor {
/* Expression | FastaAccessor */ buildThrowNoSuchMethodError(
Arguments arguments,
{bool isSuper: false,
- isGetter: false,
- isSetter: false,
+ bool isGetter: false,
+ bool isSetter: false,
String name,
int offset}) {
return helper.throwNoSuchMethodError(
@@ -118,7 +118,7 @@ abstract class FastaAccessor implements Accessor {
bool get isThisPropertyAccessor => false;
}
-abstract class CompileTimeErrorAccessor implements FastaAccessor {
+abstract class ErrorAccessor implements FastaAccessor {
@override
Expression get builtBinary => internalError("Unsupported operation.");
@@ -135,23 +135,35 @@ abstract class CompileTimeErrorAccessor implements FastaAccessor {
internalError("Unsupported operation.");
}
- Expression buildError();
+ /// Pass [arguments] that must be evaluated before throwing an error. At
+ /// most one of [isGetter] and [isSetter] should be true and they're passed
+ /// to [BuilderHelper.buildThrowNoSuchMethodError] if it is used.
+ Expression buildError(Arguments arguments,
+ {bool isGetter: false, bool isSetter: false, int offset});
Name get name => internalError("Unsupported operation.");
+ @override
String get plainNameForRead => name.name;
withReceiver(Object receiver, {bool isNullAware}) => this;
+ @override
Initializer buildFieldInitializer(
Map<String, FieldInitializer> initializers) {
- return new LocalInitializer(new VariableDeclaration.forValue(buildError()));
+ return new LocalInitializer(new VariableDeclaration.forValue(
+ buildError(new Arguments.empty(), isSetter: true)));
}
- doInvocation(int offset, Arguments arguments) => this;
+ @override
+ doInvocation(int offset, Arguments arguments) {
+ return buildError(arguments, offset: offset);
+ }
+ @override
buildPropertyAccess(IncompleteSend send, bool isNullAware) => this;
+ @override
buildThrowNoSuchMethodError(Arguments arguments,
{bool isSuper: false,
isGetter: false,
@@ -161,41 +173,55 @@ abstract class CompileTimeErrorAccessor implements FastaAccessor {
return this;
}
+ @override
Expression buildAssignment(Expression value, {bool voidContext: false}) {
- return buildError();
+ return buildError(new Arguments(<Expression>[value]), isSetter: true);
}
+ @override
Expression buildCompoundAssignment(Name binaryOperator, Expression value,
{int offset: TreeNode.noOffset,
bool voidContext: false,
Procedure interfaceTarget}) {
- return buildError();
+ return buildError(new Arguments(<Expression>[value]), isGetter: true);
}
+ @override
Expression buildPrefixIncrement(Name binaryOperator,
{int offset: TreeNode.noOffset,
bool voidContext: false,
Procedure interfaceTarget}) {
- return buildError();
+ return buildError(new Arguments(<Expression>[new IntLiteral(1)]),
+ isGetter: true);
}
+ @override
Expression buildPostfixIncrement(Name binaryOperator,
{int offset: TreeNode.noOffset,
bool voidContext: false,
Procedure interfaceTarget}) {
- return buildError();
+ return buildError(new Arguments(<Expression>[new IntLiteral(1)]),
+ isGetter: true);
}
+ @override
Expression buildNullAwareAssignment(Expression value, DartType type,
{bool voidContext: false}) {
- return buildError();
+ return buildError(new Arguments(<Expression>[value]), isSetter: true);
}
- Expression buildSimpleRead() => buildError();
+ @override
+ Expression buildSimpleRead() =>
+ buildError(new Arguments.empty(), isGetter: true);
- Expression makeInvalidRead() => buildError();
+ @override
+ Expression makeInvalidRead() =>
+ buildError(new Arguments.empty(), isGetter: true);
- Expression makeInvalidWrite(Expression value) => buildError();
+ @override
+ Expression makeInvalidWrite(Expression value) {
+ return buildError(new Arguments(<Expression>[value]), isSetter: true);
+ }
}
class ThisAccessor extends FastaAccessor {
@@ -361,15 +387,20 @@ abstract class IncompleteSend extends FastaAccessor {
withReceiver(Object receiver, {bool isNullAware});
}
-class IncompleteError extends IncompleteSend with CompileTimeErrorAccessor {
+class IncompleteError extends IncompleteSend with ErrorAccessor {
final Object error;
IncompleteError(BuilderHelper helper, int offset, this.error)
: super(helper, offset, null);
- Expression buildError() {
- return helper.buildCompileTimeError(error, offset);
+ @override
+ Expression buildError(Arguments arguments,
+ {bool isGetter: false, bool isSetter: false, int offset}) {
+ return helper.buildCompileTimeError(error, offset ?? this.offset);
}
+
+ @override
+ doInvocation(int offset, Arguments arguments) => this;
}
class SendAccessor extends IncompleteSend {
@@ -408,7 +439,7 @@ class SendAccessor extends IncompleteSend {
Expression result;
if (receiver is KernelClassBuilder) {
Builder builder = receiver.findStaticBuilder(name.name, offset, uri);
- if (builder == null) {
+ if (builder == null || builder is AccessErrorBuilder) {
return buildThrowNoSuchMethodError(arguments);
}
if (builder.hasProblem) {
@@ -802,6 +833,31 @@ class ParenthesizedExpression extends ReadOnlyAccessor {
}
}
+class UnresolvedAccessor extends FastaAccessor with ErrorAccessor {
+ @override
+ final int offset;
+
+ @override
+ final BuilderHelper helper;
+
+ @override
+ final Name name;
+
+ UnresolvedAccessor(this.helper, this.name, this.offset);
+
+ Expression doInvocation(int charOffset, Arguments arguments) {
+ return buildError(arguments, offset: charOffset);
+ }
+
+ @override
+ Expression buildError(Arguments arguments,
+ {bool isGetter: false, bool isSetter: false, int offset}) {
+ return helper.throwNoSuchMethodError(
+ plainNameForRead, arguments, offset ?? this.offset,
+ isGetter: isGetter, isSetter: isSetter);
+ }
+}
+
bool isFieldOrGetter(Member member) {
return member is Field || (member is Procedure && member.isGetter);
}
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/body_builder.dart ('k') | tests/co19/co19-kernel.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698