Convert ThisAccessor to ThisAccessGenerator
Change-Id: I097c330712c789a65a1ce9c6a57ef0c81a3a32ed
Reviewed-on: https://dart-review.googlesource.com/55893
Commit-Queue: Peter von der Ahé <ahe@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 79c86c9..db8e623 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -102,7 +102,7 @@
SendAccessor,
StaticAccessGenerator,
SuperIndexedAccessGenerator,
- ThisAccessor,
+ ThisAccessGenerator,
ThisPropertyAccessGenerator,
TypeDeclarationAccessor,
UnresolvedAccessor,
@@ -1014,8 +1014,8 @@
Expression argument = popForValue();
var receiver = pop();
bool isSuper = false;
- if (receiver is ThisAccessor && receiver.isSuper) {
- ThisAccessor thisAccessorReceiver = receiver;
+ if (receiver is ThisAccessGenerator && receiver.isSuper) {
+ ThisAccessGenerator thisAccessorReceiver = receiver;
isSuper = true;
receiver = forest.thisExpression(thisAccessorReceiver.token);
}
@@ -2417,7 +2417,7 @@
debugEvent("IndexedExpression");
Expression index = popForValue();
var receiver = pop();
- if (receiver is ThisAccessor && receiver.isSuper) {
+ if (receiver is ThisAccessGenerator && receiver.isSuper) {
push(new SuperIndexedAccessGenerator(
this,
openSquareBracket,
@@ -2457,7 +2457,7 @@
}
bool isSuper = false;
Expression receiverValue;
- if (receiver is ThisAccessor && receiver.isSuper) {
+ if (receiver is ThisAccessGenerator && receiver.isSuper) {
isSuper = true;
receiverValue = forest.thisExpression(receiver.token);
} else {
@@ -2935,7 +2935,7 @@
void handleThisExpression(Token token, IdentifierContext context) {
debugEvent("ThisExpression");
if (context.isScopeReference && isInstanceContext) {
- push(new ThisAccessor(this, token, inInitializer));
+ push(new ThisAccessGenerator(this, token, inInitializer));
} else {
push(new IncompleteError(this, token, fasta.messageThisAsIdentifier));
}
@@ -2947,7 +2947,7 @@
if (context.isScopeReference && isInstanceContext) {
Member member = this.member.target;
member.transformerFlags |= TransformerFlag.superCalls;
- push(new ThisAccessor(this, token, inInitializer, isSuper: true));
+ push(new ThisAccessGenerator(this, token, inInitializer, isSuper: true));
} else {
push(new IncompleteError(this, token, fasta.messageSuperAsIdentifier));
}
@@ -4679,7 +4679,7 @@
return node.name;
} else if (node is Builder) {
return node.fullNameForErrors;
- } else if (node is ThisAccessor) {
+ } else if (node is ThisAccessGenerator) {
return node.isSuper ? "super" : "this";
} else if (node is FastaAccessor) {
return node.plainNameForRead;
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 674ea02..291cf8a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -1540,6 +1540,180 @@
}
}
+class ThisAccessGenerator<Arguments> extends Generator<Arguments> {
+ final bool isInitializer;
+
+ final bool isSuper;
+
+ ThisAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
+ Token token, this.isInitializer,
+ {this.isSuper: false})
+ : super(helper, token);
+
+ String get plainNameForRead {
+ return unsupported("${isSuper ? 'super' : 'this'}.plainNameForRead",
+ offsetForToken(token), uri);
+ }
+
+ String get debugName => "ThisAccessGenerator";
+
+ kernel.Expression buildSimpleRead() {
+ if (!isSuper) {
+ return forest.thisExpression(token);
+ } else {
+ return helper.buildCompileTimeError(messageSuperAsExpression,
+ offsetForToken(token), lengthForToken(token));
+ }
+ }
+
+ @override
+ Initializer buildFieldInitializer(Map<String, int> initializedFields) {
+ String keyword = isSuper ? "super" : "this";
+ int offset = offsetForToken(token);
+ return helper.buildInvalidInitializer(
+ helper.deprecated_buildCompileTimeError(
+ "Can't use '$keyword' here, did you mean '$keyword()'?", offset),
+ offset);
+ }
+
+ buildPropertyAccess(
+ IncompleteSend send, int operatorOffset, bool isNullAware) {
+ Name name = send.name;
+ Arguments arguments = send.arguments;
+ int offset = offsetForToken(send.token);
+ if (isInitializer && send is SendAccessor) {
+ if (isNullAware) {
+ helper.deprecated_addCompileTimeError(
+ operatorOffset, "Expected '.'\nTry removing '?'.");
+ }
+ return buildConstructorInitializer(offset, name, arguments);
+ }
+ Member getter = helper.lookupInstanceMember(name, isSuper: isSuper);
+ if (send is SendAccessor) {
+ // Notice that 'this' or 'super' can't be null. So we can ignore the
+ // value of [isNullAware].
+ if (getter == null) {
+ helper.warnUnresolvedMethod(name, offsetForToken(send.token),
+ isSuper: isSuper);
+ }
+ return helper.buildMethodInvocation(forest.thisExpression(null), name,
+ send.arguments, offsetForToken(send.token),
+ isSuper: isSuper, interfaceTarget: getter);
+ } else {
+ Member setter =
+ helper.lookupInstanceMember(name, isSuper: isSuper, isSetter: true);
+ if (isSuper) {
+ return new SuperPropertyAccessGenerator(
+ helper, send.token, name, getter, setter);
+ } else {
+ return new ThisPropertyAccessGenerator(
+ helper, send.token, name, getter, setter);
+ }
+ }
+ }
+
+ doInvocation(int offset, Arguments arguments) {
+ if (isInitializer) {
+ return buildConstructorInitializer(offset, new Name(""), arguments);
+ } else if (isSuper) {
+ return helper.buildCompileTimeError(
+ messageSuperAsExpression, offset, noLength);
+ } else {
+ return helper.buildMethodInvocation(
+ forest.thisExpression(null), callName, arguments, offset,
+ isImplicitCall: true);
+ }
+ }
+
+ Initializer buildConstructorInitializer(
+ int offset, Name name, Arguments arguments) {
+ Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper);
+ LocatedMessage argMessage;
+ if (constructor != null) {
+ argMessage = helper.checkArguments(
+ new FunctionTypeAccessor.fromNode(constructor.function),
+ arguments,
+ CalleeDesignation.Constructor,
+ offset, <TypeParameter>[]);
+ }
+ if (constructor == null || argMessage != null) {
+ return helper.buildInvalidInitializer(
+ buildThrowNoSuchMethodError(
+ storeOffset(forest.literalNull(null), offset), arguments,
+ isSuper: isSuper,
+ name: name.name,
+ offset: offset,
+ argMessage: argMessage),
+ offset);
+ } else if (isSuper) {
+ return helper.buildSuperInitializer(
+ false, constructor, arguments, offset);
+ } else {
+ return helper.buildRedirectingInitializer(constructor, arguments, offset);
+ }
+ }
+
+ kernel.Expression buildAssignment(kernel.Expression value,
+ {bool voidContext: false}) {
+ return buildAssignmentError();
+ }
+
+ kernel.Expression buildNullAwareAssignment(
+ kernel.Expression value, DartType type, int offset,
+ {bool voidContext: false}) {
+ return buildAssignmentError();
+ }
+
+ kernel.Expression buildCompoundAssignment(
+ Name binaryOperator, kernel.Expression value,
+ {int offset: TreeNode.noOffset,
+ bool voidContext: false,
+ Procedure interfaceTarget,
+ bool isPreIncDec: false}) {
+ return buildAssignmentError();
+ }
+
+ kernel.Expression buildPrefixIncrement(Name binaryOperator,
+ {int offset: TreeNode.noOffset,
+ bool voidContext: false,
+ Procedure interfaceTarget}) {
+ return buildAssignmentError();
+ }
+
+ kernel.Expression buildPostfixIncrement(Name binaryOperator,
+ {int offset: TreeNode.noOffset,
+ bool voidContext: false,
+ Procedure interfaceTarget}) {
+ return buildAssignmentError();
+ }
+
+ kernel.Expression buildAssignmentError() {
+ String message =
+ isSuper ? "Can't assign to 'super'." : "Can't assign to 'this'.";
+ return helper.deprecated_buildCompileTimeError(
+ message, offsetForToken(token));
+ }
+
+ @override
+ kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ return unimplemented("_makeRead", offsetForToken(token), uri);
+ }
+
+ @override
+ kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
+ ShadowComplexAssignment complexAssignment) {
+ return unimplemented("_makeWrite", offsetForToken(token), uri);
+ }
+
+ @override
+ void printOn(StringSink sink) {
+ sink.write(", isInitializer: ");
+ sink.write(isInitializer);
+ sink.write(", isSuper: ");
+ sink.write(isSuper);
+ }
+}
+
kernel.Expression makeLet(
VariableDeclaration variable, kernel.Expression body) {
if (variable == null) return body;
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart
index b2466b4..603841f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart
@@ -277,172 +277,6 @@
}
}
-class ThisAccessor<Arguments> extends FastaAccessor<Arguments>
- with GeneratorImpl {
- final BuilderHelper<dynamic, dynamic, Arguments> helper;
-
- final Token token;
-
- final bool isInitializer;
-
- final bool isSuper;
-
- ThisAccessor(this.helper, this.token, this.isInitializer,
- {this.isSuper: false});
-
- String get plainNameForRead {
- return unsupported("${isSuper ? 'super' : 'this'}.plainNameForRead",
- offsetForToken(token), uri);
- }
-
- String get debugName => "ThisAccessor";
-
- kernel.Expression buildSimpleRead() {
- if (!isSuper) {
- return forest.thisExpression(token);
- } else {
- return helper.buildCompileTimeError(messageSuperAsExpression,
- offsetForToken(token), lengthForToken(token));
- }
- }
-
- @override
- Initializer buildFieldInitializer(Map<String, int> initializedFields) {
- String keyword = isSuper ? "super" : "this";
- int offset = offsetForToken(token);
- return helper.buildInvalidInitializer(
- helper.deprecated_buildCompileTimeError(
- "Can't use '$keyword' here, did you mean '$keyword()'?", offset),
- offset);
- }
-
- buildPropertyAccess(
- IncompleteSend send, int operatorOffset, bool isNullAware) {
- Name name = send.name;
- Arguments arguments = send.arguments;
- int offset = offsetForToken(send.token);
- if (isInitializer && send is SendAccessor) {
- if (isNullAware) {
- helper.deprecated_addCompileTimeError(
- operatorOffset, "Expected '.'\nTry removing '?'.");
- }
- return buildConstructorInitializer(offset, name, arguments);
- }
- Member getter = helper.lookupInstanceMember(name, isSuper: isSuper);
- if (send is SendAccessor) {
- // Notice that 'this' or 'super' can't be null. So we can ignore the
- // value of [isNullAware].
- if (getter == null) {
- helper.warnUnresolvedMethod(name, offsetForToken(send.token),
- isSuper: isSuper);
- }
- return helper.buildMethodInvocation(forest.thisExpression(null), name,
- send.arguments, offsetForToken(send.token),
- isSuper: isSuper, interfaceTarget: getter);
- } else {
- Member setter =
- helper.lookupInstanceMember(name, isSuper: isSuper, isSetter: true);
- if (isSuper) {
- return new SuperPropertyAccessGenerator(
- helper, send.token, name, getter, setter);
- } else {
- return new ThisPropertyAccessGenerator(
- helper, send.token, name, getter, setter);
- }
- }
- }
-
- doInvocation(int offset, Arguments arguments) {
- if (isInitializer) {
- return buildConstructorInitializer(offset, new Name(""), arguments);
- } else if (isSuper) {
- return helper.buildCompileTimeError(
- messageSuperAsExpression, offset, noLength);
- } else {
- return helper.buildMethodInvocation(
- forest.thisExpression(null), callName, arguments, offset,
- isImplicitCall: true);
- }
- }
-
- Initializer buildConstructorInitializer(
- int offset, Name name, Arguments arguments) {
- Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper);
- LocatedMessage argMessage;
- if (constructor != null) {
- argMessage = helper.checkArguments(
- new FunctionTypeAccessor.fromNode(constructor.function),
- arguments,
- CalleeDesignation.Constructor,
- offset, <TypeParameter>[]);
- }
- if (constructor == null || argMessage != null) {
- return helper.buildInvalidInitializer(
- buildThrowNoSuchMethodError(
- storeOffset(forest.literalNull(null), offset), arguments,
- isSuper: isSuper,
- name: name.name,
- offset: offset,
- argMessage: argMessage),
- offset);
- } else if (isSuper) {
- return helper.buildSuperInitializer(
- false, constructor, arguments, offset);
- } else {
- return helper.buildRedirectingInitializer(constructor, arguments, offset);
- }
- }
-
- kernel.Expression buildAssignment(kernel.Expression value,
- {bool voidContext: false}) {
- return buildAssignmentError();
- }
-
- kernel.Expression buildNullAwareAssignment(
- kernel.Expression value, DartType type, int offset,
- {bool voidContext: false}) {
- return buildAssignmentError();
- }
-
- kernel.Expression buildCompoundAssignment(
- Name binaryOperator, kernel.Expression value,
- {int offset: TreeNode.noOffset,
- bool voidContext: false,
- Procedure interfaceTarget,
- bool isPreIncDec: false}) {
- return buildAssignmentError();
- }
-
- kernel.Expression buildPrefixIncrement(Name binaryOperator,
- {int offset: TreeNode.noOffset,
- bool voidContext: false,
- Procedure interfaceTarget}) {
- return buildAssignmentError();
- }
-
- kernel.Expression buildPostfixIncrement(Name binaryOperator,
- {int offset: TreeNode.noOffset,
- bool voidContext: false,
- Procedure interfaceTarget}) {
- return buildAssignmentError();
- }
-
- kernel.Expression buildAssignmentError() {
- String message =
- isSuper ? "Can't assign to 'super'." : "Can't assign to 'this'.";
- return helper.deprecated_buildCompileTimeError(
- message, offsetForToken(token));
- }
-
- @override
- void printOn(StringSink sink) {
- sink.write(", isInitializer: ");
- sink.write(isInitializer);
- sink.write(", isSuper: ");
- sink.write(isSuper);
- }
-}
-
abstract class IncompleteSend<Arguments> extends FastaAccessor<Arguments>
with GeneratorImpl {
final BuilderHelper<dynamic, dynamic, Arguments> helper;
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index 0c9f272..de65fd9 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -61,7 +61,7 @@
StaticAccessGenerator,
SuperIndexedAccessGenerator,
SuperPropertyAccessGenerator,
- ThisAccessor,
+ ThisAccessGenerator,
ThisIndexedAccessGenerator,
ThisPropertyAccessGenerator,
TypeDeclarationAccessor,
@@ -123,7 +123,8 @@
KernelBodyBuilder helper = new KernelBodyBuilder(
libraryBuilder, null, null, null, null, null, null, false, uri, null);
- FastaAccessor accessor = new ThisAccessor<Arguments>(helper, token, false);
+ FastaAccessor accessor =
+ new ThisAccessGenerator<Arguments>(helper, token, false);
Library library = new Library(uri);
Class cls = new Class();
@@ -193,8 +194,9 @@
"LoadLibraryGenerator(offset: 4,"
" builder: Instance of 'LoadLibraryBuilder')",
new LoadLibraryGenerator<Arguments>(helper, token, loadLibraryBuilder));
- check("ThisAccessor(offset: 4, isInitializer: false, isSuper: false)",
- new ThisAccessor<Arguments>(helper, token, false));
+ check(
+ "ThisAccessGenerator(offset: 4, isInitializer: false, isSuper: false)",
+ new ThisAccessGenerator<Arguments>(helper, token, false));
check("IncompleteError(offset: 4, message: Unspecified)",
new IncompleteError<Arguments>(helper, token, message));
check("SendAccessor(offset: 4, name: bar, arguments: (\"arg\"))",
@@ -204,7 +206,7 @@
check(
"DeferredAccessGenerator(offset: 4, "
"builder: Instance of 'PrefixBuilder',"
- " accessor: ThisAccessor(offset: 4, isInitializer: false,"
+ " accessor: ThisAccessGenerator(offset: 4, isInitializer: false,"
" isSuper: false))",
new DeferredAccessGenerator<Arguments>(
helper, token, prefixBuilder, accessor));