Convert IndexAccessor to IndexedAccessGenerator

Change-Id: Ib5c1ef8b78543a0d9e0a98e10d6c1315409d9246
Reviewed-on: https://dart-review.googlesource.com/55122
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 fbb9f525be
commit 7e7c795919
3 changed files with 44 additions and 57 deletions

View file

@ -92,7 +92,7 @@ import 'expression_generator.dart'
IncompleteError,
IncompletePropertyAccessor,
IncompleteSend,
IndexAccessor,
IndexedAccessGenerator,
LargeIntAccessor,
LoadLibraryAccessor,
ParenthesizedExpression,
@ -2423,7 +2423,7 @@ abstract class BodyBuilder<Expression, Statement, Arguments>
lookupInstanceMember(indexGetName, isSuper: true),
lookupInstanceMember(indexSetName, isSuper: true)));
} else {
push(IndexAccessor.make<Arguments>(
push(IndexedAccessGenerator.make<Arguments>(
this,
openSquareBracket,
toKernelExpression(toValue(receiver)),

View file

@ -626,31 +626,46 @@ class SuperPropertyAccessGenerator<Arguments> extends Generator<Arguments> {
String toString() => "SuperPropertyAccessGenerator()";
}
class _IndexAccessor<Arguments> extends Accessor<Arguments> {
kernel.Expression receiver;
kernel.Expression index;
VariableDeclaration receiverVariable;
VariableDeclaration indexVariable;
Procedure getter, setter;
class IndexedAccessGenerator<Arguments> extends Generator<Arguments> {
final kernel.Expression receiver;
static Accessor<Arguments> make<Arguments>(
final kernel.Expression index;
final Procedure getter;
final Procedure setter;
VariableDeclaration receiverVariable;
VariableDeclaration indexVariable;
IndexedAccessGenerator.internal(
BuilderHelper<dynamic, dynamic, Arguments> helper,
Token token,
this.receiver,
this.index,
this.getter,
this.setter)
: super(helper, token);
static FastaAccessor<Arguments> make<Arguments>(
BuilderHelper<dynamic, dynamic, Arguments> helper,
Token token,
kernel.Expression receiver,
kernel.Expression index,
Procedure getter,
Procedure setter,
{Token token}) {
Procedure setter) {
if (helper.forest.isThisExpression(receiver)) {
return new _ThisIndexAccessor(helper, index, getter, setter, token);
return new ThisIndexAccessor(helper, token, index, getter, setter);
} else {
return new _IndexAccessor.internal(
helper, receiver, index, getter, setter, token);
return new IndexedAccessGenerator.internal(
helper, token, receiver, index, getter, setter);
}
}
_IndexAccessor.internal(BuilderHelper<dynamic, dynamic, Arguments> helper,
this.receiver, this.index, this.getter, this.setter, Token token)
: super(helper, token);
String get plainNameForRead => "[]";
String get plainNameForWrite => "[]=";
kernel.Expression _makeSimpleRead() {
var read = new ShadowMethodInvocation(
@ -744,6 +759,18 @@ class _IndexAccessor<Arguments> extends Accessor<Arguments> {
makeLet(receiverVariable, makeLet(indexVariable, body)),
complexAssignment);
}
kernel.Expression doInvocation(int offset, Arguments arguments) {
return helper.buildMethodInvocation(
buildSimpleRead(), callName, arguments, forest.readOffset(arguments),
isImplicitCall: true);
}
@override
ShadowComplexAssignment startComplexAssignment(kernel.Expression rhs) =>
new ShadowIndexAssign(receiver, index, rhs);
String toString() => "IndexedAccessGenerator()";
}
/// Special case of [_IndexAccessor] to avoid creating an indirect access to

View file

@ -741,46 +741,6 @@ class IncompletePropertyAccessor<Arguments> extends IncompleteSend<Arguments> {
}
}
class IndexAccessor<Arguments> extends _IndexAccessor<Arguments>
with FastaAccessor<Arguments> {
final BuilderHelper<dynamic, dynamic, Arguments> helper;
IndexAccessor.internal(this.helper, Token token, kernel.Expression receiver,
kernel.Expression index, Procedure getter, Procedure setter)
: super.internal(helper, receiver, index, getter, setter, token);
String get plainNameForRead => "[]";
String get plainNameForWrite => "[]=";
kernel.Expression doInvocation(int offset, Arguments arguments) {
return helper.buildMethodInvocation(
buildSimpleRead(), callName, arguments, forest.readOffset(arguments),
isImplicitCall: true);
}
toString() => "IndexAccessor()";
static FastaAccessor<Arguments> make<Arguments>(
BuilderHelper<dynamic, dynamic, Arguments> helper,
Token token,
kernel.Expression receiver,
kernel.Expression index,
Procedure getter,
Procedure setter) {
if (helper.forest.isThisExpression(receiver)) {
return new ThisIndexAccessor(helper, token, index, getter, setter);
} else {
return new IndexAccessor.internal(
helper, token, receiver, index, getter, setter);
}
}
@override
ShadowComplexAssignment startComplexAssignment(kernel.Expression rhs) =>
new ShadowIndexAssign(receiver, index, rhs);
}
class StaticAccessor<Arguments> extends _StaticAccessor<Arguments>
with FastaAccessor<Arguments> {
StaticAccessor(BuilderHelper<dynamic, dynamic, Arguments> helper, Token token,