| Index: pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart
|
| 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 a530e6138babc2c466a74bbf0f164e5353bb0a08..2118d0e69b9ed6c9461c94629874deef41e9d8c5 100644
|
| --- a/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart
|
| +++ b/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart
|
| @@ -2,11 +2,18 @@
|
| // 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.
|
|
|
| +import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'
|
| + show
|
| + KernelArguments,
|
| + KernelMethodInvocation,
|
| + KernelPropertyGet,
|
| + KernelPropertySet,
|
| + KernelVariableGet,
|
| + KernelVariableSet;
|
| +
|
| import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken;
|
|
|
| import 'package:front_end/src/scanner/token.dart' show Token;
|
| @@ -69,20 +76,14 @@ abstract class Accessor {
|
| Expression buildNullAwareAssignment(Expression value, DartType type,
|
| {bool voidContext: false}) {
|
| if (voidContext) {
|
| - return _finish(new ConditionalExpression(
|
| - buildIsNull(helper.astFactory, _makeRead()),
|
| - _makeWrite(value, false),
|
| - new NullLiteral(),
|
| - type));
|
| + return _finish(new ConditionalExpression(buildIsNull(_makeRead()),
|
| + _makeWrite(value, false), new NullLiteral(), type));
|
| }
|
| var tmp = new VariableDeclaration.forValue(_makeRead());
|
| return _finish(makeLet(
|
| tmp,
|
| - new ConditionalExpression(
|
| - buildIsNull(helper.astFactory, new VariableGet(tmp)),
|
| - _makeWrite(value, false),
|
| - new VariableGet(tmp),
|
| - type)));
|
| + new ConditionalExpression(buildIsNull(new VariableGet(tmp)),
|
| + _makeWrite(value, false), new VariableGet(tmp), type)));
|
| }
|
|
|
| /// Returns an [Expression] representing a compound assignment (e.g. `+=`)
|
| @@ -92,8 +93,8 @@ abstract class Accessor {
|
| bool voidContext: false,
|
| Procedure interfaceTarget}) {
|
| return _finish(_makeWrite(
|
| - builtBinary = makeBinary(helper.astFactory, _makeRead(), binaryOperator,
|
| - interfaceTarget, value,
|
| + builtBinary = makeBinary(
|
| + _makeRead(), binaryOperator, interfaceTarget, value,
|
| offset: offset),
|
| voidContext));
|
| }
|
| @@ -123,8 +124,8 @@ abstract class Accessor {
|
| var value = new VariableDeclaration.forValue(_makeRead());
|
| valueAccess() => new VariableGet(value);
|
| var dummy = new VariableDeclaration.forValue(_makeWrite(
|
| - builtBinary = makeBinary(helper.astFactory, valueAccess(),
|
| - binaryOperator, interfaceTarget, new IntLiteral(1),
|
| + builtBinary = makeBinary(
|
| + valueAccess(), binaryOperator, interfaceTarget, new IntLiteral(1),
|
| offset: offset),
|
| true));
|
| return _finish(makeLet(value, makeLet(dummy, valueAccess())));
|
| @@ -166,14 +167,15 @@ abstract class VariableAccessor extends Accessor {
|
| var fact = helper.typePromoter
|
| .getFactForAccess(variable, helper.functionNestingLevel);
|
| var scope = helper.typePromoter.currentScope;
|
| - return helper.astFactory.variableGet(variable, fact, scope, token);
|
| + return new KernelVariableGet(variable, fact, scope)
|
| + ..fileOffset = offsetForToken(token);
|
| }
|
|
|
| Expression _makeWrite(Expression value, bool voidContext) {
|
| helper.typePromoter.mutateVariable(variable, helper.functionNestingLevel);
|
| return variable.isFinal || variable.isConst
|
| ? makeInvalidWrite(value)
|
| - : helper.astFactory.variableSet(variable, value)
|
| + : new KernelVariableSet(variable, value)
|
| ..fileOffset = offsetForToken(token);
|
| }
|
| }
|
| @@ -199,12 +201,11 @@ class PropertyAccessor extends Accessor {
|
| this.getter, this.setter, Token token)
|
| : super(helper, token);
|
|
|
| - Expression _makeSimpleRead() =>
|
| - helper.astFactory.propertyGet(receiver, name, getter)
|
| - ..fileOffset = offsetForToken(token);
|
| + Expression _makeSimpleRead() => new KernelPropertyGet(receiver, name, getter)
|
| + ..fileOffset = offsetForToken(token);
|
|
|
| Expression _makeSimpleWrite(Expression value, bool voidContext) {
|
| - return helper.astFactory.propertySet(receiver, name, value, setter)
|
| + return new KernelPropertySet(receiver, name, value, setter)
|
| ..fileOffset = offsetForToken(token);
|
| }
|
|
|
| @@ -214,12 +215,12 @@ class PropertyAccessor extends Accessor {
|
| ..fileOffset = offsetForToken(token);
|
| }
|
|
|
| - Expression _makeRead() => builtGetter = helper.astFactory
|
| - .propertyGet(receiverAccess(), name, getter)
|
| + Expression _makeRead() =>
|
| + builtGetter = new KernelPropertyGet(receiverAccess(), name, getter)
|
| ..fileOffset = offsetForToken(token);
|
|
|
| Expression _makeWrite(Expression value, bool voidContext) {
|
| - return helper.astFactory.propertySet(receiverAccess(), name, value, setter)
|
| + return new KernelPropertySet(receiverAccess(), name, value, setter)
|
| ..fileOffset = offsetForToken(token);
|
| }
|
|
|
| @@ -236,14 +237,13 @@ class ThisPropertyAccessor extends Accessor {
|
| BuilderHelper helper, this.name, this.getter, this.setter, Token token)
|
| : super(helper, token);
|
|
|
| - Expression _makeRead() => builtGetter = helper.astFactory
|
| - .propertyGet(new ThisExpression(), name, getter)
|
| + Expression _makeRead() =>
|
| + builtGetter = new KernelPropertyGet(new ThisExpression(), name, getter)
|
| ..fileOffset = offsetForToken(token);
|
|
|
| Expression _makeWrite(Expression value, bool voidContext) {
|
| - return helper.astFactory
|
| - .propertySet(new ThisExpression(), name, value, setter)
|
| - ..fileOffset = offsetForToken(token);
|
| + return new KernelPropertySet(new ThisExpression(), name, value, setter)
|
| + ..fileOffset = offsetForToken(token);
|
| }
|
| }
|
|
|
| @@ -260,20 +260,17 @@ class NullAwarePropertyAccessor extends Accessor {
|
|
|
| receiverAccess() => new VariableGet(receiver);
|
|
|
| - Expression _makeRead() => builtGetter =
|
| - helper.astFactory.propertyGet(receiverAccess(), name, getter);
|
| + Expression _makeRead() =>
|
| + builtGetter = new KernelPropertyGet(receiverAccess(), name, getter);
|
|
|
| Expression _makeWrite(Expression value, bool voidContext) {
|
| - return helper.astFactory.propertySet(receiverAccess(), name, value, setter);
|
| + return new KernelPropertySet(receiverAccess(), name, value, setter);
|
| }
|
|
|
| Expression _finish(Expression body) => makeLet(
|
| receiver,
|
| new ConditionalExpression(
|
| - buildIsNull(helper.astFactory, receiverAccess()),
|
| - new NullLiteral(),
|
| - body,
|
| - type));
|
| + buildIsNull(receiverAccess()), new NullLiteral(), body, type));
|
| }
|
|
|
| class SuperPropertyAccessor extends Accessor {
|
| @@ -321,14 +318,14 @@ class IndexAccessor extends Accessor {
|
| this.getter, this.setter, Token token)
|
| : super(helper, token);
|
|
|
| - Expression _makeSimpleRead() => helper.astFactory.methodInvocation(receiver,
|
| - indexGetName, helper.astFactory.arguments(<Expression>[index]), getter)
|
| + Expression _makeSimpleRead() => new KernelMethodInvocation(
|
| + receiver, indexGetName, new KernelArguments(<Expression>[index]), getter)
|
| ..fileOffset = offsetForToken(token);
|
|
|
| Expression _makeSimpleWrite(Expression value, bool voidContext) {
|
| if (!voidContext) return _makeWriteAndReturn(value);
|
| - return helper.astFactory.methodInvocation(receiver, indexSetName,
|
| - helper.astFactory.arguments(<Expression>[index, value]), setter)
|
| + return new KernelMethodInvocation(receiver, indexSetName,
|
| + new KernelArguments(<Expression>[index, value]), setter)
|
| ..fileOffset = offsetForToken(token);
|
| }
|
|
|
| @@ -346,18 +343,15 @@ class IndexAccessor extends Accessor {
|
| }
|
|
|
| Expression _makeRead() {
|
| - return builtGetter = helper.astFactory.methodInvocation(
|
| - receiverAccess(),
|
| - indexGetName,
|
| - helper.astFactory.arguments(<Expression>[indexAccess()]),
|
| - getter)
|
| + return builtGetter = new KernelMethodInvocation(receiverAccess(),
|
| + indexGetName, new KernelArguments(<Expression>[indexAccess()]), getter)
|
| ..fileOffset = offsetForToken(token);
|
| }
|
|
|
| Expression _makeWrite(Expression value, bool voidContext) {
|
| if (!voidContext) return _makeWriteAndReturn(value);
|
| - return helper.astFactory.methodInvocation(receiverAccess(), indexSetName,
|
| - helper.astFactory.arguments(<Expression>[indexAccess(), value]), setter)
|
| + return new KernelMethodInvocation(receiverAccess(), indexSetName,
|
| + new KernelArguments(<Expression>[indexAccess(), value]), setter)
|
| ..fileOffset = offsetForToken(token);
|
| }
|
|
|
| @@ -367,14 +361,13 @@ 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(helper.astFactory
|
| - .methodInvocation(
|
| - receiverAccess(),
|
| - indexSetName,
|
| - helper.astFactory.arguments(
|
| - <Expression>[indexAccess(), new VariableGet(valueVariable)]),
|
| - setter)
|
| - ..fileOffset = offsetForToken(token));
|
| + var dummy = new VariableDeclaration.forValue(new KernelMethodInvocation(
|
| + receiverAccess(),
|
| + indexSetName,
|
| + new KernelArguments(
|
| + <Expression>[indexAccess(), new VariableGet(valueVariable)]),
|
| + setter)
|
| + ..fileOffset = offsetForToken(token));
|
| return makeLet(
|
| valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
|
| }
|
| @@ -396,17 +389,14 @@ class ThisIndexAccessor extends Accessor {
|
| : super(helper, token);
|
|
|
| Expression _makeSimpleRead() {
|
| - return helper.astFactory.methodInvocation(new ThisExpression(),
|
| - indexGetName, helper.astFactory.arguments(<Expression>[index]), getter);
|
| + return new KernelMethodInvocation(new ThisExpression(), indexGetName,
|
| + new KernelArguments(<Expression>[index]), getter);
|
| }
|
|
|
| Expression _makeSimpleWrite(Expression value, bool voidContext) {
|
| if (!voidContext) return _makeWriteAndReturn(value);
|
| - return helper.astFactory.methodInvocation(
|
| - new ThisExpression(),
|
| - indexSetName,
|
| - helper.astFactory.arguments(<Expression>[index, value]),
|
| - setter);
|
| + return new KernelMethodInvocation(new ThisExpression(), indexSetName,
|
| + new KernelArguments(<Expression>[index, value]), setter);
|
| }
|
|
|
| indexAccess() {
|
| @@ -414,30 +404,26 @@ class ThisIndexAccessor extends Accessor {
|
| return new VariableGet(indexVariable);
|
| }
|
|
|
| - Expression _makeRead() => builtGetter = helper.astFactory.methodInvocation(
|
| + Expression _makeRead() => builtGetter = new KernelMethodInvocation(
|
| new ThisExpression(),
|
| indexGetName,
|
| - helper.astFactory.arguments(<Expression>[indexAccess()]),
|
| + new KernelArguments(<Expression>[indexAccess()]),
|
| getter);
|
|
|
| Expression _makeWrite(Expression value, bool voidContext) {
|
| if (!voidContext) return _makeWriteAndReturn(value);
|
| - return helper.astFactory.methodInvocation(
|
| - new ThisExpression(),
|
| - indexSetName,
|
| - helper.astFactory.arguments(<Expression>[indexAccess(), value]),
|
| - setter);
|
| + return new KernelMethodInvocation(new ThisExpression(), indexSetName,
|
| + new KernelArguments(<Expression>[indexAccess(), value]), setter);
|
| }
|
|
|
| _makeWriteAndReturn(Expression value) {
|
| var valueVariable = new VariableDeclaration.forValue(value);
|
| - var dummy = new VariableDeclaration.forValue(helper.astFactory
|
| - .methodInvocation(
|
| - new ThisExpression(),
|
| - indexSetName,
|
| - helper.astFactory.arguments(
|
| - <Expression>[indexAccess(), new VariableGet(valueVariable)]),
|
| - setter));
|
| + var dummy = new VariableDeclaration.forValue(new KernelMethodInvocation(
|
| + new ThisExpression(),
|
| + indexSetName,
|
| + new KernelArguments(
|
| + <Expression>[indexAccess(), new VariableGet(valueVariable)]),
|
| + setter));
|
| return makeLet(
|
| valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
|
| }
|
| @@ -460,32 +446,30 @@ class SuperIndexAccessor extends Accessor {
|
| }
|
|
|
| Expression _makeSimpleRead() => new SuperMethodInvocation(
|
| - indexGetName, helper.astFactory.arguments(<Expression>[index]), getter);
|
| + indexGetName, new KernelArguments(<Expression>[index]), getter);
|
|
|
| Expression _makeSimpleWrite(Expression value, bool voidContext) {
|
| if (!voidContext) return _makeWriteAndReturn(value);
|
| - return new SuperMethodInvocation(indexSetName,
|
| - helper.astFactory.arguments(<Expression>[index, value]), setter);
|
| + return new SuperMethodInvocation(
|
| + indexSetName, new KernelArguments(<Expression>[index, value]), setter);
|
| }
|
|
|
| Expression _makeRead() {
|
| - return builtGetter = new SuperMethodInvocation(indexGetName,
|
| - helper.astFactory.arguments(<Expression>[indexAccess()]), getter);
|
| + return builtGetter = new SuperMethodInvocation(
|
| + indexGetName, new KernelArguments(<Expression>[indexAccess()]), getter);
|
| }
|
|
|
| Expression _makeWrite(Expression value, bool voidContext) {
|
| if (!voidContext) return _makeWriteAndReturn(value);
|
| - return new SuperMethodInvocation(
|
| - indexSetName,
|
| - helper.astFactory.arguments(<Expression>[indexAccess(), value]),
|
| - setter);
|
| + return new SuperMethodInvocation(indexSetName,
|
| + new KernelArguments(<Expression>[indexAccess(), value]), setter);
|
| }
|
|
|
| _makeWriteAndReturn(Expression value) {
|
| var valueVariable = new VariableDeclaration.forValue(value);
|
| var dummy = new VariableDeclaration.forValue(new SuperMethodInvocation(
|
| indexSetName,
|
| - helper.astFactory.arguments(
|
| + new KernelArguments(
|
| <Expression>[indexAccess(), new VariableGet(valueVariable)]),
|
| setter));
|
| return makeLet(
|
| @@ -542,19 +526,18 @@ Expression makeLet(VariableDeclaration variable, Expression body) {
|
| return new Let(variable, body);
|
| }
|
|
|
| -Expression makeBinary(AstFactory astFactory, Expression left, Name operator,
|
| - Procedure interfaceTarget, Expression right,
|
| +Expression makeBinary(
|
| + Expression left, Name operator, Procedure interfaceTarget, Expression right,
|
| {int offset: TreeNode.noOffset}) {
|
| - return astFactory.methodInvocation(left, operator,
|
| - astFactory.arguments(<Expression>[right]), interfaceTarget)
|
| + return new KernelMethodInvocation(
|
| + left, operator, new KernelArguments(<Expression>[right]), interfaceTarget)
|
| ..fileOffset = offset;
|
| }
|
|
|
| final Name _equalOperator = new Name('==');
|
|
|
| -Expression buildIsNull(AstFactory astFactory, Expression value,
|
| - {int offset: TreeNode.noOffset}) {
|
| - return makeBinary(astFactory, value, _equalOperator, null, new NullLiteral(),
|
| +Expression buildIsNull(Expression value, {int offset: TreeNode.noOffset}) {
|
| + return makeBinary(value, _equalOperator, null, new NullLiteral(),
|
| offset: offset);
|
| }
|
|
|
|
|