diff --git a/pkg/analysis_server/analysis_server.iml b/pkg/analysis_server/analysis_server.iml
index 93bf109e18d..ebdecda424c 100644
--- a/pkg/analysis_server/analysis_server.iml
+++ b/pkg/analysis_server/analysis_server.iml
@@ -58,5 +58,6 @@
+
\ No newline at end of file
diff --git a/pkg/analyzer_cli/analyzer_cli.iml b/pkg/analyzer_cli/analyzer_cli.iml
index 8eaae91197b..f948623c6bf 100644
--- a/pkg/analyzer_cli/analyzer_cli.iml
+++ b/pkg/analyzer_cli/analyzer_cli.iml
@@ -47,5 +47,6 @@
+
\ No newline at end of file
diff --git a/pkg/front_end/front_end.iml b/pkg/front_end/front_end.iml
index 84264eee55b..44f509a6b3f 100644
--- a/pkg/front_end/front_end.iml
+++ b/pkg/front_end/front_end.iml
@@ -21,5 +21,6 @@
+
\ No newline at end of file
diff --git a/pkg/front_end/lib/src/fasta/builder/ast_factory.dart b/pkg/front_end/lib/src/fasta/builder/ast_factory.dart
index 4a14a4bce02..d6ba3266fef 100644
--- a/pkg/front_end/lib/src/fasta/builder/ast_factory.dart
+++ b/pkg/front_end/lib/src/fasta/builder/ast_factory.dart
@@ -107,12 +107,25 @@ abstract class AstFactory {
{DartType keyType: const DynamicType(),
DartType valueType: const DynamicType()});
+ /// Creates a method invocation of form `x.foo(y)`.
+ MethodInvocation methodInvocation(
+ Expression receiver, Name name, Arguments arguments,
+ [Procedure interfaceTarget]);
+
/// Create an expression of form `!x`.
Not not(Token token, Expression operand);
/// Creates a null literal expression.
NullLiteral nullLiteral(Token token);
+ /// Creates a read of a property.
+ PropertyGet propertyGet(Expression receiver, Name name,
+ [Member interfaceTarget]);
+
+ /// Creates a write of a property.
+ PropertySet propertySet(Expression receiver, Name name, Expression value,
+ [Member interfaceTarget]);
+
/// Create a `rethrow` expression.
Rethrow rethrowExpression(Token keyword);
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 57a8e10651a..5259c1dc331 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -621,7 +621,7 @@ class BodyBuilder extends ScopeListener implements BuilderHelper {
return receiver.doInvocation(charOffset, arguments);
} else {
return buildMethodInvocation(
- toValue(receiver), callName, arguments, charOffset);
+ astFactory, toValue(receiver), callName, arguments, charOffset);
}
}
@@ -684,8 +684,8 @@ class BodyBuilder extends ScopeListener implements BuilderHelper {
return buildCompileTimeError(
"Not an operator: '$operator'.", token.charOffset);
} else {
- Expression result =
- makeBinary(a, new Name(operator), null, b, offset: token.charOffset);
+ Expression result = makeBinary(astFactory, a, new Name(operator), null, b,
+ offset: token.charOffset);
if (isSuper) {
result = toSuperMethodInvocation(result);
}
@@ -706,8 +706,11 @@ class BodyBuilder extends ScopeListener implements BuilderHelper {
VariableDeclaration variable = new VariableDeclaration.forValue(a);
push(makeLet(
variable,
- new ConditionalExpression(buildIsNull(new VariableGet(variable)), b,
- new VariableGet(variable), const DynamicType())));
+ new ConditionalExpression(
+ buildIsNull(astFactory, new VariableGet(variable)),
+ b,
+ new VariableGet(variable),
+ const DynamicType())));
}
/// Handle `a?.b(...)`.
@@ -751,7 +754,7 @@ class BodyBuilder extends ScopeListener implements BuilderHelper {
astFactory.directPropertyGet(new ThisExpression(), target);
receiver = astFactory.superPropertyGet(node.name, target);
return buildMethodInvocation(
- receiver, callName, node.arguments, node.fileOffset);
+ astFactory, receiver, callName, node.arguments, node.fileOffset);
}
bool areArgumentsCompatible(FunctionNode function, Arguments arguments) {
@@ -1743,13 +1746,14 @@ class BodyBuilder extends ScopeListener implements BuilderHelper {
}
if (receiver is ThisAccessor && receiver.isSuper) {
push(toSuperMethodInvocation(buildMethodInvocation(
+ astFactory,
astFactory.thisExpression(receiver.token),
new Name(operator),
new Arguments.empty(),
token.charOffset)));
} else {
- push(buildMethodInvocation(toValue(receiver), new Name(operator),
- new Arguments.empty(), token.charOffset));
+ push(buildMethodInvocation(astFactory, toValue(receiver),
+ new Name(operator), new Arguments.empty(), token.charOffset));
}
}
}
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 bdaf32bd151..a884f2a58a7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
@@ -128,8 +128,8 @@ abstract class FastaAccessor implements Accessor {
/* Expression | FastaAccessor */ buildPropertyAccess(
IncompleteSend send, bool isNullAware) {
if (send is SendAccessor) {
- return buildMethodInvocation(buildSimpleRead(), send.name, send.arguments,
- offsetForToken(send.token),
+ return buildMethodInvocation(helper.astFactory, buildSimpleRead(),
+ send.name, send.arguments, offsetForToken(send.token),
isNullAware: isNullAware);
} else {
return PropertyAccessor.make(helper, send.token, buildSimpleRead(),
@@ -315,8 +315,12 @@ class ThisAccessor extends FastaAccessor {
if (send is SendAccessor) {
// Notice that 'this' or 'super' can't be null. So we can ignore the
// value of [isNullAware].
- MethodInvocation result = buildMethodInvocation(new ThisExpression(),
- send.name, send.arguments, offsetForToken(token));
+ MethodInvocation result = buildMethodInvocation(
+ helper.astFactory,
+ new ThisExpression(),
+ send.name,
+ send.arguments,
+ offsetForToken(token));
return isSuper ? helper.toSuperMethodInvocation(result) : result;
} else {
if (isSuper) {
@@ -336,7 +340,7 @@ class ThisAccessor extends FastaAccessor {
return buildConstructorInitializer(offset, new Name(""), arguments);
} else {
return buildMethodInvocation(
- new ThisExpression(), callName, arguments, offset);
+ helper.astFactory, new ThisExpression(), callName, arguments, offset);
}
}
@@ -492,6 +496,7 @@ class SendAccessor extends IncompleteSend {
if (target != null) {
if (target is Field) {
result = buildMethodInvocation(
+ helper.astFactory,
new StaticGet(target),
callName,
arguments,
@@ -507,7 +512,7 @@ class SendAccessor extends IncompleteSend {
}
}
} else {
- result = buildMethodInvocation(
+ result = buildMethodInvocation(helper.astFactory,
helper.toValue(receiver), name, arguments, offsetForToken(token),
isNullAware: isNullAware);
}
@@ -630,7 +635,7 @@ class IndexAccessor extends kernel.IndexAccessor with FastaAccessor {
IndexAccessor.internal(this.helper, Token token, Expression receiver,
Expression index, Procedure getter, Procedure setter)
- : super.internal(receiver, index, getter, setter, token);
+ : super.internal(helper, receiver, index, getter, setter, token);
String get plainNameForRead => "[]";
@@ -638,7 +643,7 @@ class IndexAccessor extends kernel.IndexAccessor with FastaAccessor {
Expression doInvocation(int offset, Arguments arguments) {
return buildMethodInvocation(
- buildSimpleRead(), callName, arguments, offset);
+ helper.astFactory, buildSimpleRead(), callName, arguments, offset);
}
toString() => "IndexAccessor()";
@@ -664,14 +669,15 @@ class PropertyAccessor extends kernel.PropertyAccessor with FastaAccessor {
PropertyAccessor.internal(this.helper, Token token, Expression receiver,
Name name, Member getter, Member setter)
- : super.internal(receiver, name, getter, setter, token);
+ : super.internal(helper, receiver, name, getter, setter, token);
String get plainNameForRead => name.name;
bool get isThisPropertyAccessor => receiver is ThisExpression;
Expression doInvocation(int offset, Arguments arguments) {
- return buildMethodInvocation(receiver, name, arguments, offset);
+ return buildMethodInvocation(
+ helper.astFactory, receiver, name, arguments, offset);
}
toString() => "PropertyAccessor()";
@@ -728,8 +734,8 @@ class StaticAccessor extends kernel.StaticAccessor with FastaAccessor {
Expression doInvocation(int offset, Arguments arguments) {
if (readTarget == null || isFieldOrGetter(readTarget)) {
- return buildMethodInvocation(buildSimpleRead(), callName, arguments,
- offset + (readTarget?.name?.name?.length ?? 0));
+ return buildMethodInvocation(helper.astFactory, buildSimpleRead(),
+ callName, arguments, offset + (readTarget?.name?.name?.length ?? 0));
} else {
return helper.buildStaticInvocation(readTarget, arguments)
..fileOffset = offset;
@@ -741,18 +747,16 @@ class StaticAccessor extends kernel.StaticAccessor with FastaAccessor {
class SuperPropertyAccessor extends kernel.SuperPropertyAccessor
with FastaAccessor {
- final BuilderHelper helper;
-
- SuperPropertyAccessor(
- this.helper, Token token, Name name, Member getter, Member setter)
- : super(name, getter, setter, token);
+ SuperPropertyAccessor(BuilderHelper helper, Token token, Name name,
+ Member getter, Member setter)
+ : super(helper, name, getter, setter, token);
String get plainNameForRead => name.name;
Expression doInvocation(int offset, Arguments arguments) {
if (getter == null || isFieldOrGetter(getter)) {
return buildMethodInvocation(
- buildSimpleRead(), callName, arguments, offset);
+ helper.astFactory, buildSimpleRead(), callName, arguments, offset);
} else {
return new DirectMethodInvocation(new ThisExpression(), getter, arguments)
..fileOffset = offset;
@@ -763,11 +767,9 @@ class SuperPropertyAccessor extends kernel.SuperPropertyAccessor
}
class ThisIndexAccessor extends kernel.ThisIndexAccessor with FastaAccessor {
- final BuilderHelper helper;
-
- ThisIndexAccessor(this.helper, Token token, Expression index,
+ ThisIndexAccessor(BuilderHelper helper, Token token, Expression index,
Procedure getter, Procedure setter)
- : super(index, getter, setter, token);
+ : super(helper, index, getter, setter, token);
String get plainNameForRead => "[]";
@@ -775,18 +777,16 @@ class ThisIndexAccessor extends kernel.ThisIndexAccessor with FastaAccessor {
Expression doInvocation(int offset, Arguments arguments) {
return buildMethodInvocation(
- buildSimpleRead(), callName, arguments, offset);
+ helper.astFactory, buildSimpleRead(), callName, arguments, offset);
}
toString() => "ThisIndexAccessor()";
}
class SuperIndexAccessor extends kernel.SuperIndexAccessor with FastaAccessor {
- final BuilderHelper helper;
-
- SuperIndexAccessor(
- this.helper, Token token, Expression index, Member getter, Member setter)
- : super(index, getter, setter, token);
+ SuperIndexAccessor(BuilderHelper helper, Token token, Expression index,
+ Member getter, Member setter)
+ : super(helper, index, getter, setter, token);
String get plainNameForRead => "[]";
@@ -794,7 +794,7 @@ class SuperIndexAccessor extends kernel.SuperIndexAccessor with FastaAccessor {
Expression doInvocation(int offset, Arguments arguments) {
return buildMethodInvocation(
- buildSimpleRead(), callName, arguments, offset);
+ helper.astFactory, buildSimpleRead(), callName, arguments, offset);
}
toString() => "SuperIndexAccessor()";
@@ -806,7 +806,7 @@ class ThisPropertyAccessor extends kernel.ThisPropertyAccessor
ThisPropertyAccessor(
this.helper, Token token, Name name, Member getter, Member setter)
- : super(name, getter, setter, token);
+ : super(helper, name, getter, setter, token);
String get plainNameForRead => name.name;
@@ -819,7 +819,8 @@ class ThisPropertyAccessor extends kernel.ThisPropertyAccessor
// `this.name.call(arguments)`.
interfaceTarget = null;
}
- return buildMethodInvocation(new ThisExpression(), name, arguments, offset);
+ return buildMethodInvocation(
+ helper.astFactory, new ThisExpression(), name, arguments, offset);
}
toString() => "ThisPropertyAccessor()";
@@ -831,7 +832,7 @@ class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor
NullAwarePropertyAccessor(this.helper, Token token, Expression receiver,
Name name, Member getter, Member setter, DartType type)
- : super(receiver, name, getter, setter, type, token);
+ : super(helper, receiver, name, getter, setter, type, token);
String get plainNameForRead => name.name;
@@ -843,37 +844,33 @@ class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor
}
class VariableAccessor extends kernel.VariableAccessor with FastaAccessor {
- @override
- final BuilderHelper helper;
-
- VariableAccessor(this.helper, Token token, VariableDeclaration variable,
+ VariableAccessor(
+ BuilderHelper helper, Token token, VariableDeclaration variable,
[DartType promotedType])
- : super(variable, promotedType, token);
+ : super(helper, variable, promotedType, token);
String get plainNameForRead => variable.name;
Expression doInvocation(int offset, Arguments arguments) {
// 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.
- return buildMethodInvocation(buildSimpleRead(), callName, arguments,
- offset + (variable.name?.length ?? 0));
+ return buildMethodInvocation(helper.astFactory, buildSimpleRead(), callName,
+ arguments, offset + (variable.name?.length ?? 0));
}
toString() => "VariableAccessor()";
}
class ReadOnlyAccessor extends kernel.ReadOnlyAccessor with FastaAccessor {
- final BuilderHelper helper;
-
final String plainNameForRead;
- ReadOnlyAccessor(
- this.helper, Expression expression, this.plainNameForRead, Token token)
- : super(expression, token);
+ ReadOnlyAccessor(BuilderHelper helper, Expression expression,
+ this.plainNameForRead, Token token)
+ : super(helper, expression, token);
Expression doInvocation(int offset, Arguments arguments) {
return buildMethodInvocation(
- buildSimpleRead(), callName, arguments, offset);
+ helper.astFactory, buildSimpleRead(), callName, arguments, offset);
}
}
@@ -917,20 +914,22 @@ bool isFieldOrGetter(Member member) {
return member is Field || (member is Procedure && member.isGetter);
}
-Expression buildMethodInvocation(
- Expression receiver, Name name, Arguments arguments, int offset,
+Expression buildMethodInvocation(AstFactory astFactory, Expression receiver,
+ Name name, Arguments arguments, int offset,
{bool isNullAware: false}) {
if (isNullAware) {
VariableDeclaration variable = new VariableDeclaration.forValue(receiver);
return makeLet(
variable,
new ConditionalExpression(
- buildIsNull(new VariableGet(variable)),
+ buildIsNull(astFactory, new VariableGet(variable)),
new NullLiteral(),
- new MethodInvocation(new VariableGet(variable), name, arguments)
+ astFactory.methodInvocation(
+ new VariableGet(variable), name, arguments)
..fileOffset = offset,
const DynamicType()));
} else {
- return new MethodInvocation(receiver, name, arguments)..fileOffset = offset;
+ return astFactory.methodInvocation(receiver, name, arguments)
+ ..fileOffset = offset;
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart b/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart
index 8c3164f31d7..8b306a6c7ef 100644
--- a/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart
@@ -2,6 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import 'package:front_end/src/fasta/builder/ast_factory.dart';
+
/// A library to help transform compounds and null-aware accessors into
/// let expressions.
@@ -12,7 +14,7 @@ import 'package:front_end/src/fasta/scanner/token.dart' show Token;
import 'package:front_end/src/fasta/kernel/fasta_accessors.dart'
show BuilderHelper;
-import 'package:kernel/ast.dart';
+import 'package:kernel/ast.dart' hide MethodInvocation;
final Name indexGetName = new Name("[]");
@@ -31,6 +33,7 @@ final Name indexSetName = new Name("[]=");
/// [Accessor] object. Later, after `= b` is parsed, [buildAssignment] will be
/// called.
abstract class Accessor {
+ final BuilderHelper helper;
final Token token;
// [builtBinary] and [builtGetter] capture the inner nodes. Used by
@@ -40,7 +43,7 @@ abstract class Accessor {
Expression builtBinary;
Expression builtGetter;
- Accessor(this.token);
+ Accessor(this.helper, this.token);
/// Builds an [Expression] representing a read from the accessor.
Expression buildSimpleRead() {
@@ -66,14 +69,20 @@ abstract class Accessor {
Expression buildNullAwareAssignment(Expression value, DartType type,
{bool voidContext: false}) {
if (voidContext) {
- return _finish(new ConditionalExpression(buildIsNull(_makeRead()),
- _makeWrite(value, false), new NullLiteral(), type));
+ return _finish(new ConditionalExpression(
+ buildIsNull(helper.astFactory, _makeRead()),
+ _makeWrite(value, false),
+ new NullLiteral(),
+ type));
}
var tmp = new VariableDeclaration.forValue(_makeRead());
return _finish(makeLet(
tmp,
- new ConditionalExpression(buildIsNull(new VariableGet(tmp)),
- _makeWrite(value, false), new VariableGet(tmp), type)));
+ new ConditionalExpression(
+ buildIsNull(helper.astFactory, new VariableGet(tmp)),
+ _makeWrite(value, false),
+ new VariableGet(tmp),
+ type)));
}
/// Returns an [Expression] representing a compound assignment (e.g. `+=`)
@@ -83,8 +92,8 @@ abstract class Accessor {
bool voidContext: false,
Procedure interfaceTarget}) {
return _finish(_makeWrite(
- builtBinary = makeBinary(
- _makeRead(), binaryOperator, interfaceTarget, value,
+ builtBinary = makeBinary(helper.astFactory, _makeRead(), binaryOperator,
+ interfaceTarget, value,
offset: offset),
voidContext));
}
@@ -114,8 +123,8 @@ abstract class Accessor {
var value = new VariableDeclaration.forValue(_makeRead());
valueAccess() => new VariableGet(value);
var dummy = new VariableDeclaration.forValue(_makeWrite(
- builtBinary = makeBinary(
- valueAccess(), binaryOperator, interfaceTarget, new IntLiteral(1),
+ builtBinary = makeBinary(helper.astFactory, valueAccess(),
+ binaryOperator, interfaceTarget, new IntLiteral(1),
offset: offset),
true));
return _finish(makeLet(value, makeLet(dummy, valueAccess())));
@@ -149,10 +158,9 @@ abstract class VariableAccessor extends Accessor {
VariableDeclaration variable;
DartType promotedType;
- BuilderHelper get helper;
-
- VariableAccessor(this.variable, this.promotedType, Token token)
- : super(token);
+ VariableAccessor(
+ BuilderHelper helper, this.variable, this.promotedType, Token token)
+ : super(helper, token);
Expression _makeRead() {
var fact = helper.typePromoter
@@ -176,26 +184,27 @@ class PropertyAccessor extends Accessor {
Name name;
Member getter, setter;
- static Accessor make(
- Expression receiver, Name name, Member getter, Member setter,
+ static Accessor make(BuilderHelper helper, Expression receiver, Name name,
+ Member getter, Member setter,
{Token token}) {
if (receiver is ThisExpression) {
- return new ThisPropertyAccessor(name, getter, setter, token);
+ return new ThisPropertyAccessor(helper, name, getter, setter, token);
} else {
return new PropertyAccessor.internal(
- receiver, name, getter, setter, token);
+ helper, receiver, name, getter, setter, token);
}
}
- PropertyAccessor.internal(
- this.receiver, this.name, this.getter, this.setter, Token token)
- : super(token);
+ PropertyAccessor.internal(BuilderHelper helper, this.receiver, this.name,
+ this.getter, this.setter, Token token)
+ : super(helper, token);
- Expression _makeSimpleRead() => new PropertyGet(receiver, name, getter)
- ..fileOffset = offsetForToken(token);
+ Expression _makeSimpleRead() =>
+ helper.astFactory.propertyGet(receiver, name, getter)
+ ..fileOffset = offsetForToken(token);
Expression _makeSimpleWrite(Expression value, bool voidContext) {
- return new PropertySet(receiver, name, value, setter)
+ return helper.astFactory.propertySet(receiver, name, value, setter)
..fileOffset = offsetForToken(token);
}
@@ -205,12 +214,12 @@ class PropertyAccessor extends Accessor {
..fileOffset = offsetForToken(token);
}
- Expression _makeRead() =>
- builtGetter = new PropertyGet(receiverAccess(), name, getter)
+ Expression _makeRead() => builtGetter = helper.astFactory
+ .propertyGet(receiverAccess(), name, getter)
..fileOffset = offsetForToken(token);
Expression _makeWrite(Expression value, bool voidContext) {
- return new PropertySet(receiverAccess(), name, value, setter)
+ return helper.astFactory.propertySet(receiverAccess(), name, value, setter)
..fileOffset = offsetForToken(token);
}
@@ -223,16 +232,18 @@ class ThisPropertyAccessor extends Accessor {
Name name;
Member getter, setter;
- ThisPropertyAccessor(this.name, this.getter, this.setter, Token token)
- : super(token);
+ ThisPropertyAccessor(
+ BuilderHelper helper, this.name, this.getter, this.setter, Token token)
+ : super(helper, token);
- Expression _makeRead() =>
- builtGetter = new PropertyGet(new ThisExpression(), name, getter)
+ Expression _makeRead() => builtGetter = helper.astFactory
+ .propertyGet(new ThisExpression(), name, getter)
..fileOffset = offsetForToken(token);
Expression _makeWrite(Expression value, bool voidContext) {
- return new PropertySet(new ThisExpression(), name, value, setter)
- ..fileOffset = offsetForToken(token);
+ return helper.astFactory
+ .propertySet(new ThisExpression(), name, value, setter)
+ ..fileOffset = offsetForToken(token);
}
}
@@ -242,32 +253,36 @@ class NullAwarePropertyAccessor extends Accessor {
Member getter, setter;
DartType type;
- NullAwarePropertyAccessor(Expression receiver, this.name, this.getter,
- this.setter, this.type, Token token)
+ NullAwarePropertyAccessor(BuilderHelper helper, Expression receiver,
+ this.name, this.getter, this.setter, this.type, Token token)
: this.receiver = makeOrReuseVariable(receiver),
- super(token);
+ super(helper, token);
receiverAccess() => new VariableGet(receiver);
- Expression _makeRead() =>
- builtGetter = new PropertyGet(receiverAccess(), name, getter);
+ Expression _makeRead() => builtGetter =
+ helper.astFactory.propertyGet(receiverAccess(), name, getter);
Expression _makeWrite(Expression value, bool voidContext) {
- return new PropertySet(receiverAccess(), name, value, setter);
+ return helper.astFactory.propertySet(receiverAccess(), name, value, setter);
}
Expression _finish(Expression body) => makeLet(
receiver,
new ConditionalExpression(
- buildIsNull(receiverAccess()), new NullLiteral(), body, type));
+ buildIsNull(helper.astFactory, receiverAccess()),
+ new NullLiteral(),
+ body,
+ type));
}
class SuperPropertyAccessor extends Accessor {
Name name;
Member getter, setter;
- SuperPropertyAccessor(this.name, this.getter, this.setter, Token token)
- : super(token);
+ SuperPropertyAccessor(
+ BuilderHelper helper, this.name, this.getter, this.setter, Token token)
+ : super(helper, token);
Expression _makeRead() {
if (getter == null) return makeInvalidRead();
@@ -291,27 +306,28 @@ class IndexAccessor extends Accessor {
VariableDeclaration indexVariable;
Procedure getter, setter;
- static Accessor make(
- Expression receiver, Expression index, Procedure getter, Procedure setter,
+ static Accessor make(BuilderHelper helper, Expression receiver,
+ Expression index, Procedure getter, Procedure setter,
{Token token}) {
if (receiver is ThisExpression) {
- return new ThisIndexAccessor(index, getter, setter, token);
+ return new ThisIndexAccessor(helper, index, getter, setter, token);
} else {
- return new IndexAccessor.internal(receiver, index, getter, setter, token);
+ return new IndexAccessor.internal(
+ helper, receiver, index, getter, setter, token);
}
}
- IndexAccessor.internal(
- this.receiver, this.index, this.getter, this.setter, Token token)
- : super(token);
+ IndexAccessor.internal(BuilderHelper helper, this.receiver, this.index,
+ this.getter, this.setter, Token token)
+ : super(helper, token);
- Expression _makeSimpleRead() => new MethodInvocation(
+ Expression _makeSimpleRead() => helper.astFactory.methodInvocation(
receiver, indexGetName, new Arguments([index]), getter)
..fileOffset = offsetForToken(token);
Expression _makeSimpleWrite(Expression value, bool voidContext) {
if (!voidContext) return _makeWriteAndReturn(value);
- return new MethodInvocation(receiver, indexSetName,
+ return helper.astFactory.methodInvocation(receiver, indexSetName,
new Arguments([index, value]), setter)
..fileOffset = offsetForToken(token);
}
@@ -330,14 +346,14 @@ class IndexAccessor extends Accessor {
}
Expression _makeRead() {
- return builtGetter = new MethodInvocation(receiverAccess(), indexGetName,
- new Arguments([indexAccess()]), getter)
+ return builtGetter = helper.astFactory.methodInvocation(receiverAccess(),
+ indexGetName, new Arguments([indexAccess()]), getter)
..fileOffset = offsetForToken(token);
}
Expression _makeWrite(Expression value, bool voidContext) {
if (!voidContext) return _makeWriteAndReturn(value);
- return new MethodInvocation(receiverAccess(), indexSetName,
+ return helper.astFactory.methodInvocation(receiverAccess(), indexSetName,
new Arguments([indexAccess(), value]), setter)
..fileOffset = offsetForToken(token);
}
@@ -348,13 +364,14 @@ class IndexAccessor extends Accessor {
// The call to []= does not return the value like direct-style assignments
// do. We need to bind the value in a let.
var valueVariable = new VariableDeclaration.forValue(value);
- var dummy = new VariableDeclaration.forValue(new MethodInvocation(
- receiverAccess(),
- indexSetName,
- new Arguments(
- [indexAccess(), new VariableGet(valueVariable)]),
- setter)
- ..fileOffset = offsetForToken(token));
+ var dummy = new VariableDeclaration.forValue(helper.astFactory
+ .methodInvocation(
+ receiverAccess(),
+ indexSetName,
+ new Arguments(
+ [indexAccess(), new VariableGet(valueVariable)]),
+ setter)
+ ..fileOffset = offsetForToken(token));
return makeLet(
valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
}
@@ -371,18 +388,19 @@ class ThisIndexAccessor extends Accessor {
VariableDeclaration indexVariable;
Procedure getter, setter;
- ThisIndexAccessor(this.index, this.getter, this.setter, Token token)
- : super(token);
+ ThisIndexAccessor(
+ BuilderHelper helper, this.index, this.getter, this.setter, Token token)
+ : super(helper, token);
Expression _makeSimpleRead() {
- return new MethodInvocation(new ThisExpression(), indexGetName,
- new Arguments([index]), getter);
+ return helper.astFactory.methodInvocation(new ThisExpression(),
+ indexGetName, new Arguments([index]), getter);
}
Expression _makeSimpleWrite(Expression value, bool voidContext) {
if (!voidContext) return _makeWriteAndReturn(value);
- return new MethodInvocation(new ThisExpression(), indexSetName,
- new Arguments([index, value]), setter);
+ return helper.astFactory.methodInvocation(new ThisExpression(),
+ indexSetName, new Arguments([index, value]), setter);
}
indexAccess() {
@@ -390,7 +408,7 @@ class ThisIndexAccessor extends Accessor {
return new VariableGet(indexVariable);
}
- Expression _makeRead() => builtGetter = new MethodInvocation(
+ Expression _makeRead() => builtGetter = helper.astFactory.methodInvocation(
new ThisExpression(),
indexGetName,
new Arguments([indexAccess()]),
@@ -398,18 +416,22 @@ class ThisIndexAccessor extends Accessor {
Expression _makeWrite(Expression value, bool voidContext) {
if (!voidContext) return _makeWriteAndReturn(value);
- return new MethodInvocation(new ThisExpression(), indexSetName,
- new Arguments([indexAccess(), value]), setter);
+ return helper.astFactory.methodInvocation(
+ new ThisExpression(),
+ indexSetName,
+ new Arguments([indexAccess(), value]),
+ setter);
}
_makeWriteAndReturn(Expression value) {
var valueVariable = new VariableDeclaration.forValue(value);
- var dummy = new VariableDeclaration.forValue(new MethodInvocation(
- new ThisExpression(),
- indexSetName,
- new Arguments(
- [indexAccess(), new VariableGet(valueVariable)]),
- setter));
+ var dummy = new VariableDeclaration.forValue(helper.astFactory
+ .methodInvocation(
+ new ThisExpression(),
+ indexSetName,
+ new Arguments(
+ [indexAccess(), new VariableGet(valueVariable)]),
+ setter));
return makeLet(
valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
}
@@ -422,8 +444,9 @@ class SuperIndexAccessor extends Accessor {
VariableDeclaration indexVariable;
Member getter, setter;
- SuperIndexAccessor(this.index, this.getter, this.setter, Token token)
- : super(token);
+ SuperIndexAccessor(
+ BuilderHelper helper, this.index, this.getter, this.setter, Token token)
+ : super(helper, token);
indexAccess() {
indexVariable ??= new VariableDeclaration.forValue(index);
@@ -467,12 +490,12 @@ class SuperIndexAccessor extends Accessor {
}
class StaticAccessor extends Accessor {
- final BuilderHelper helper;
Member readTarget;
Member writeTarget;
- StaticAccessor(this.helper, this.readTarget, this.writeTarget, Token token)
- : super(token);
+ StaticAccessor(
+ BuilderHelper helper, this.readTarget, this.writeTarget, Token token)
+ : super(helper, token);
Expression _makeRead() => builtGetter = readTarget == null
? makeInvalidRead()
@@ -490,7 +513,8 @@ class ReadOnlyAccessor extends Accessor {
Expression expression;
VariableDeclaration value;
- ReadOnlyAccessor(this.expression, Token token) : super(token);
+ ReadOnlyAccessor(BuilderHelper helper, this.expression, Token token)
+ : super(helper, token);
Expression _makeSimpleRead() => expression;
@@ -510,18 +534,19 @@ Expression makeLet(VariableDeclaration variable, Expression body) {
return new Let(variable, body);
}
-Expression makeBinary(
- Expression left, Name operator, Procedure interfaceTarget, Expression right,
+Expression makeBinary(AstFactory astFactory, Expression left, Name operator,
+ Procedure interfaceTarget, Expression right,
{int offset: TreeNode.noOffset}) {
- return new MethodInvocation(
+ return astFactory.methodInvocation(
left, operator, new Arguments([right]), interfaceTarget)
..fileOffset = offset;
}
final Name _equalOperator = new Name('==');
-Expression buildIsNull(Expression value, {int offset: TreeNode.noOffset}) {
- return makeBinary(value, _equalOperator, null, new NullLiteral(),
+Expression buildIsNull(AstFactory astFactory, Expression value,
+ {int offset: TreeNode.noOffset}) {
+ return makeBinary(astFactory, value, _equalOperator, null, new NullLiteral(),
offset: offset);
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_factory.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_factory.dart
index 1f06483d598..e3516b15a83 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_factory.dart
@@ -127,6 +127,13 @@ class KernelAstFactory implements AstFactory {
..fileOffset = constKeyword?.charOffset ?? beginToken.charOffset;
}
+ @override
+ MethodInvocation methodInvocation(
+ Expression receiver, Name name, Arguments arguments,
+ [Procedure interfaceTarget]) {
+ return new KernelMethodInvocation(receiver, name, arguments);
+ }
+
@override
Not not(Token token, Expression operand) {
return new KernelNot(operand)..fileOffset = offsetForToken(token);
@@ -137,6 +144,18 @@ class KernelAstFactory implements AstFactory {
return new KernelNullLiteral()..fileOffset = offsetForToken(token);
}
+ @override
+ PropertyGet propertyGet(Expression receiver, Name name,
+ [Member interfaceTarget]) {
+ return new KernelPropertyGet(receiver, name, interfaceTarget);
+ }
+
+ @override
+ PropertySet propertySet(Expression receiver, Name name, Expression value,
+ [Member interfaceTarget]) {
+ return new KernelPropertySet(receiver, name, value, interfaceTarget);
+ }
+
@override
Rethrow rethrowExpression(Token keyword) {
return new KernelRethrow()..fileOffset = offsetForToken(keyword);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index bd8d80e6663..941b74f7df3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -345,8 +345,9 @@ class KernelMapLiteral extends MapLiteral implements KernelExpression {
/// Shadow object for [MethodInvocation].
class KernelMethodInvocation extends MethodInvocation
implements KernelExpression {
- KernelMethodInvocation(Expression receiver, Name name, Arguments arguments)
- : super(receiver, name, arguments);
+ KernelMethodInvocation(Expression receiver, Name name, Arguments arguments,
+ [Procedure interfaceTarget])
+ : super(receiver, name, arguments, interfaceTarget);
KernelMethodInvocation.byReference(Expression receiver, Name name,
Arguments arguments, Reference interfaceTargetReference)
@@ -384,7 +385,8 @@ class KernelNullLiteral extends NullLiteral implements KernelExpression {
/// Shadow object for [PropertyGet].
class KernelPropertyGet extends PropertyGet implements KernelExpression {
- KernelPropertyGet(Expression receiver, Name name) : super(receiver, name);
+ KernelPropertyGet(Expression receiver, Name name, [Member interfaceTarget])
+ : super(receiver, name, interfaceTarget);
KernelPropertyGet.byReference(
Expression receiver, Name name, Reference interfaceTargetReference)
@@ -400,8 +402,9 @@ class KernelPropertyGet extends PropertyGet implements KernelExpression {
/// Shadow object for [PropertyGet].
class KernelPropertySet extends PropertySet implements KernelExpression {
- KernelPropertySet(Expression receiver, Name name, Expression value)
- : super(receiver, name, value);
+ KernelPropertySet(Expression receiver, Name name, Expression value,
+ [Member interfaceTarget])
+ : super(receiver, name, value, interfaceTarget);
KernelPropertySet.byReference(Expression receiver, Name name,
Expression value, Reference interfaceTargetReference)