Convert SuperIndexAccessor to SuperIndexedAccessGenerator

Change-Id: I0b4b53373b248e88058f0353a293d57a6eae766e
Reviewed-on: https://dart-review.googlesource.com/55124
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
This commit is contained in:
Peter von der Ahé 2018-05-16 10:45:08 +00:00 committed by Peter von der Ahé
parent 21ae1a0ab7
commit 331d31f56c
3 changed files with 28 additions and 31 deletions

View file

@ -99,7 +99,7 @@ import 'expression_generator.dart'
ReadOnlyAccessor,
SendAccessor,
StaticAccessor,
SuperIndexAccessor,
SuperIndexedAccessGenerator,
ThisAccessor,
ThisPropertyAccessGenerator,
TypeDeclarationAccessor,
@ -2416,7 +2416,7 @@ abstract class BodyBuilder<Expression, Statement, Arguments>
Expression index = popForValue();
var receiver = pop();
if (receiver is ThisAccessor && receiver.isSuper) {
push(new SuperIndexAccessor(
push(new SuperIndexedAccessGenerator(
this,
openSquareBracket,
toKernelExpression(index),

View file

@ -883,15 +883,23 @@ class ThisIndexedAccessGenerator<Arguments> extends Generator<Arguments> {
String toString() => "ThisIndexedAccessGenerator()";
}
class _SuperIndexAccessor<Arguments> extends Accessor<Arguments> {
kernel.Expression index;
VariableDeclaration indexVariable;
Member getter, setter;
class SuperIndexedAccessGenerator<Arguments> extends Generator<Arguments> {
final kernel.Expression index;
_SuperIndexAccessor(BuilderHelper<dynamic, dynamic, Arguments> helper,
this.index, this.getter, this.setter, Token token)
final Member getter;
final Member setter;
VariableDeclaration indexVariable;
SuperIndexedAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
Token token, this.index, this.getter, this.setter)
: super(helper, token);
String get plainNameForRead => "[]";
String get plainNameForWrite => "[]=";
indexAccess() {
indexVariable ??= new VariableDeclaration.forValue(index);
return new VariableGet(indexVariable);
@ -984,6 +992,18 @@ class _SuperIndexAccessor<Arguments> extends Accessor<Arguments> {
kernel.Expression body, ShadowComplexAssignment complexAssignment) {
return super._finish(makeLet(indexVariable, body), complexAssignment);
}
kernel.Expression doInvocation(int offset, Arguments arguments) {
return helper.buildMethodInvocation(
buildSimpleRead(), callName, arguments, offset,
isImplicitCall: true);
}
String toString() => "SuperIndexedAccessGenerator()";
@override
ShadowComplexAssignment startComplexAssignment(kernel.Expression rhs) =>
new ShadowIndexAssign(null, index, rhs, isSuper: true);
}
class _StaticAccessor<Arguments> extends Accessor<Arguments> {

View file

@ -864,29 +864,6 @@ class DeferredAccessor<Arguments> extends _DeferredAccessor<Arguments>
}
}
class SuperIndexAccessor<Arguments> extends _SuperIndexAccessor<Arguments>
with FastaAccessor<Arguments> {
SuperIndexAccessor(BuilderHelper<dynamic, dynamic, Arguments> helper,
Token token, kernel.Expression index, Member getter, Member setter)
: super(helper, index, getter, setter, token);
String get plainNameForRead => "[]";
String get plainNameForWrite => "[]=";
kernel.Expression doInvocation(int offset, Arguments arguments) {
return helper.buildMethodInvocation(
buildSimpleRead(), callName, arguments, offset,
isImplicitCall: true);
}
toString() => "SuperIndexAccessor()";
@override
ShadowComplexAssignment startComplexAssignment(kernel.Expression rhs) =>
new ShadowIndexAssign(null, index, rhs, isSuper: true);
}
int adjustForImplicitCall(String name, int offset) {
// Normally the offset is at the start of the token, but in this case,
// because we insert a '.call', we want it at the end instead.