| Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
|
| diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
|
| index 759ed6c13fe8e99f0c7880fe199ac8b2424eff44..5ed33b7a0fbc59c6d815a78e9d4f72e4a29c79bb 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
|
| @@ -143,8 +143,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| BaseImplementationOfLocalsMixin<ir.Primitive, dynamic>,
|
| BaseImplementationOfDynamicsMixin<ir.Primitive, dynamic>,
|
| BaseImplementationOfConstantsMixin<ir.Primitive, dynamic>,
|
| - BaseImplementationOfSuperIncDecsMixin<ir.Primitive, dynamic>,
|
| - BaseImplementationOfNewMixin<ir.Primitive, dynamic>
|
| + BaseImplementationOfNewMixin<ir.Primitive, dynamic>,
|
| + BaseImplementationOfCompoundsMixin<ir.Primitive, dynamic>,
|
| + BaseImplementationOfIndexCompoundsMixin<ir.Primitive, dynamic>
|
| implements SemanticSendVisitor<ir.Primitive, dynamic> {
|
| final TreeElements elements;
|
| final Compiler compiler;
|
| @@ -1246,123 +1247,26 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs));
|
| }
|
|
|
| - @override
|
| - ir.Primitive visitCompoundIndexSet(
|
| - ast.SendSet node,
|
| - ast.Node receiver,
|
| - ast.Node index,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| - _) {
|
| - ir.Primitive target = visit(receiver);
|
| - ir.Primitive indexValue = visit(index);
|
| - return translateCompound(
|
| - getValue: () {
|
| - Selector selector = new Selector.index();
|
| - List<ir.Primitive> arguments = <ir.Primitive>[indexValue];
|
| - arguments =
|
| - normalizeDynamicArguments(selector.callStructure, arguments);
|
| - return irBuilder.buildDynamicInvocation(target, selector, arguments);
|
| - },
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildDynamicIndexSet(target, indexValue, result);
|
| - });
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive visitSuperCompoundIndexSet(
|
| - ast.SendSet node,
|
| - FunctionElement getter,
|
| - FunctionElement setter,
|
| - ast.Node index,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| - _) {
|
| - ir.Primitive indexValue = visit(index);
|
| - return translateCompound(
|
| - getValue: () {
|
| - return irBuilder.buildSuperIndex(getter, indexValue);
|
| - },
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperIndexSet(setter, indexValue, result);
|
| - });
|
| - }
|
| -
|
| - ir.Primitive translatePrefixPostfix(
|
| - {ir.Primitive getValue(),
|
| - op.IncDecOperator operator,
|
| - void setValue(ir.Primitive value),
|
| - bool isPrefix}) {
|
| - ir.Primitive value = getValue();
|
| - Selector operatorSelector =
|
| - new Selector.binaryOperator(operator.selectorName);
|
| - List<ir.Primitive> arguments =
|
| - <ir.Primitive>[irBuilder.buildIntegerConstant(1)];
|
| - arguments = normalizeDynamicArguments(
|
| - operatorSelector.callStructure, arguments);
|
| - ir.Primitive result =
|
| - irBuilder.buildDynamicInvocation(value, operatorSelector, arguments);
|
| - setValue(result);
|
| - return isPrefix ? result : value;
|
| - }
|
| -
|
| - ir.Primitive translateCompound(
|
| + ir.Primitive translateCompounds(
|
| {ir.Primitive getValue(),
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| + CompoundRhs rhs,
|
| void setValue(ir.Primitive value)}) {
|
| ir.Primitive value = getValue();
|
| Selector operatorSelector =
|
| - new Selector.binaryOperator(operator.selectorName);
|
| - List<ir.Primitive> arguments = <ir.Primitive>[visit(rhs)];
|
| + new Selector.binaryOperator(rhs.operator.selectorName);
|
| + ir.Primitive rhsValue;
|
| + if (rhs.kind == CompoundKind.ASSIGNMENT) {
|
| + rhsValue = visit(rhs.rhs);
|
| + } else {
|
| + rhsValue = irBuilder.buildIntegerConstant(1);
|
| + }
|
| + List<ir.Primitive> arguments = <ir.Primitive>[rhsValue];
|
| arguments = normalizeDynamicArguments(
|
| operatorSelector.callStructure, arguments);
|
| ir.Primitive result =
|
| irBuilder.buildDynamicInvocation(value, operatorSelector, arguments);
|
| setValue(result);
|
| - return result;
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive handleDynamicCompound(
|
| - ast.Send node,
|
| - ast.Node receiver,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| - Selector getterSelector,
|
| - Selector setterSelector,
|
| - _) {
|
| - ir.Primitive target = translateReceiver(receiver);
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildDynamicGet(target, getterSelector),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildDynamicSet(target, setterSelector, result);
|
| - });
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive handleDynamicPostfixPrefix(
|
| - ast.Send node,
|
| - ast.Node receiver,
|
| - op.IncDecOperator operator,
|
| - Selector getterSelector,
|
| - Selector setterSelector,
|
| - arg,
|
| - {bool isPrefix}) {
|
| - ir.Primitive target = translateReceiver(receiver);
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildDynamicGet(target, getterSelector),
|
| - operator: operator,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildDynamicSet(target, setterSelector, result);
|
| - },
|
| - isPrefix: isPrefix);
|
| + return rhs.kind == CompoundKind.POSTFIX ? value : result;
|
| }
|
|
|
| @override
|
| @@ -1379,38 +1283,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive handleLocalCompound(
|
| - ast.Send node,
|
| - LocalElement element,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| - _) {
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildLocalVariableGet(element),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildLocalVariableSet(element, result);
|
| - });
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive handleLocalPostfixPrefix(
|
| - ast.Send node,
|
| - LocalElement element,
|
| - op.IncDecOperator operator,
|
| - arg,
|
| - {bool isPrefix}) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildLocalVariableGet(element),
|
| - operator: operator,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildLocalVariableSet(element, result);
|
| - },
|
| - isPrefix: isPrefix);
|
| - }
|
| -
|
| - @override
|
| ir.Primitive handleLocalSet(
|
| ast.SendSet node,
|
| LocalElement element,
|
| @@ -1420,40 +1292,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive handleStaticFieldCompound(
|
| - ast.Send node,
|
| - FieldElement field,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| - _) {
|
| - SourceInformation src = sourceInformationBuilder.buildGet(node);
|
| - return translateCompound(
|
| - getValue: () => buildStaticFieldGet(field, src),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildStaticFieldSet(field, result);
|
| - });
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive handleStaticFieldPostfixPrefix(
|
| - ast.Send node,
|
| - FieldElement field,
|
| - op.IncDecOperator operator,
|
| - arg,
|
| - {bool isPrefix}) {
|
| - SourceInformation src = sourceInformationBuilder.buildGet(node);
|
| - return translatePrefixPostfix(
|
| - getValue: () => buildStaticFieldGet(field, src),
|
| - operator: operator,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildStaticFieldSet(field, result);
|
| - },
|
| - isPrefix: isPrefix);
|
| - }
|
| -
|
| - @override
|
| ir.Primitive handleStaticFieldSet(
|
| ast.SendSet node,
|
| FieldElement field,
|
| @@ -1481,386 +1319,244 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive handleStaticGetterSetterCompound(
|
| + ir.Primitive visitUnresolvedSuperIndexSet(
|
| ast.Send node,
|
| - FunctionElement getter,
|
| - FunctionElement setter,
|
| - op.AssignmentOperator operator,
|
| + Element element,
|
| + ast.Node index,
|
| ast.Node rhs,
|
| - _) {
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildStaticGetterGet(getter),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildStaticSetterSet(setter, result);
|
| - });
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive handleSuperFieldFieldPostfixPrefix(
|
| - ast.Send node,
|
| - FieldElement readField,
|
| - FieldElement writtenField,
|
| - op.IncDecOperator operator,
|
| - arg,
|
| - {bool isPrefix}) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildSuperFieldGet(readField),
|
| - operator: operator,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperFieldSet(writtenField, result);
|
| - },
|
| - isPrefix: isPrefix);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive handleSuperFieldSetterPostfixPrefix(
|
| - ast.Send node,
|
| - FieldElement field,
|
| - FunctionElement setter,
|
| - op.IncDecOperator operator,
|
| - arg,
|
| - {bool isPrefix}) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildSuperFieldGet(field),
|
| - operator: operator,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperSetterSet(setter, result);
|
| - },
|
| - isPrefix: isPrefix);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive handleSuperGetterFieldPostfixPrefix(
|
| - ast.Send node,
|
| - FunctionElement getter,
|
| - FieldElement field,
|
| - op.IncDecOperator operator,
|
| - arg,
|
| - {bool isPrefix}) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildSuperGetterGet(getter),
|
| - operator: operator,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperFieldSet(field, result);
|
| - },
|
| - isPrefix: isPrefix);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive handleSuperGetterSetterPostfixPrefix(
|
| - ast.Send node,
|
| - FunctionElement getter,
|
| - FunctionElement setter,
|
| - op.IncDecOperator operator,
|
| - arg,
|
| - {bool isPrefix}) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildSuperGetterGet(getter),
|
| - operator: operator,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperSetterSet(setter, result);
|
| - },
|
| - isPrefix: isPrefix);
|
| + arg) {
|
| + return giveup(node, 'visitUnresolvedSuperIndexSet');
|
| }
|
|
|
| @override
|
| - ir.Primitive handleSuperMethodSetterPostfixPrefix(
|
| - ast.Send node,
|
| - FunctionElement method,
|
| + ir.Primitive handleStaticSetterSet(
|
| + ast.SendSet node,
|
| FunctionElement setter,
|
| - op.IncDecOperator operator,
|
| - arg,
|
| - {bool isPrefix}) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildSuperMethodGet(method),
|
| - operator: operator,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperSetterSet(setter, result);
|
| - },
|
| - isPrefix: isPrefix);
|
| + ast.Node rhs,
|
| + _) {
|
| + return irBuilder.buildStaticSetterSet(setter, visit(rhs));
|
| }
|
|
|
| @override
|
| - ir.Primitive handleStaticGetterSetterPostfixPrefix(
|
| - ast.Send node,
|
| - FunctionElement getter,
|
| - FunctionElement setter,
|
| - op.IncDecOperator operator,
|
| - arg,
|
| - {bool isPrefix}) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildStaticGetterGet(getter),
|
| - operator: operator,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildStaticSetterSet(setter, result);
|
| - },
|
| - isPrefix: isPrefix);
|
| + ir.Primitive handleTypeLiteralConstantCompounds(
|
| + ast.SendSet node,
|
| + ConstantExpression constant,
|
| + CompoundRhs rhs,
|
| + arg) {
|
| + return translateCompounds(
|
| + getValue: () => irBuilder.buildConstant(constant),
|
| + rhs: rhs,
|
| + setValue: (value) {}); // The binary operator will throw before this.
|
| }
|
|
|
| @override
|
| - ir.Primitive handleStaticMethodSetterCompound(
|
| + ir.Primitive handleDynamicCompounds(
|
| ast.Send node,
|
| - FunctionElement method,
|
| - FunctionElement setter,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| - _) {
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildStaticFunctionGet(method),
|
| - operator: operator,
|
| + ast.Node receiver,
|
| + CompoundRhs rhs,
|
| + Selector getterSelector,
|
| + Selector setterSelector,
|
| + arg) {
|
| + ir.Primitive target = translateReceiver(receiver);
|
| + return translateCompounds(
|
| + getValue: () => irBuilder.buildDynamicGet(target, getterSelector),
|
| rhs: rhs,
|
| setValue: (ir.Primitive result) {
|
| - irBuilder.buildStaticSetterSet(setter, result);
|
| + irBuilder.buildDynamicSet(target, setterSelector, result);
|
| });
|
| }
|
|
|
| - @override
|
| - ir.Primitive handleStaticMethodSetterPostfixPrefix(
|
| - ast.Send node,
|
| - FunctionElement getter,
|
| - FunctionElement setter,
|
| - op.IncDecOperator operator,
|
| - arg,
|
| - {bool isPrefix}) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildStaticFunctionGet(getter),
|
| - operator: operator,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildStaticSetterSet(setter, result);
|
| - },
|
| - isPrefix: isPrefix);
|
| + ir.Primitive buildLocalNoSuchSetter(Local local, ir.Primitive value) {
|
| + Selector selector = new Selector.setter(local.name, null);
|
| + return buildStaticNoSuchMethod(selector, [value]);
|
| }
|
|
|
| @override
|
| - ir.Primitive handleDynamicIndexPostfixPrefix(
|
| - ast.Send node,
|
| - ast.Node receiver,
|
| - ast.Node index,
|
| - op.IncDecOperator operator,
|
| - arg,
|
| - {bool isPrefix}) {
|
| - ir.Primitive target = visit(receiver);
|
| - ir.Primitive indexValue = visit(index);
|
| - return translatePrefixPostfix(
|
| - getValue: () {
|
| - Selector selector = new Selector.index();
|
| - List<ir.Primitive> arguments = <ir.Primitive>[indexValue];
|
| - arguments =
|
| - normalizeDynamicArguments(selector.callStructure, arguments);
|
| - return irBuilder.buildDynamicInvocation(target, selector, arguments);
|
| - },
|
| - operator: operator,
|
| - setValue: (ir.Primitive result) {
|
| - Selector selector = new Selector.indexSet();
|
| - List<ir.Primitive> arguments = <ir.Primitive>[indexValue, result];
|
| - arguments =
|
| - normalizeDynamicArguments(selector.callStructure, arguments);
|
| - irBuilder.buildDynamicInvocation(target, selector, arguments);
|
| - },
|
| - isPrefix: isPrefix);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive handleSuperIndexPostfixPrefix(
|
| - ast.Send node,
|
| - FunctionElement indexFunction,
|
| - FunctionElement indexSetFunction,
|
| - ast.Node index,
|
| - op.IncDecOperator operator,
|
| + ir.Primitive handleLocalCompounds(
|
| + ast.SendSet node,
|
| + LocalElement local,
|
| + CompoundRhs rhs,
|
| arg,
|
| - {bool isPrefix}) {
|
| - ir.Primitive indexValue = visit(index);
|
| - return translatePrefixPostfix(
|
| + {bool isSetterValid}) {
|
| + return translateCompounds(
|
| getValue: () {
|
| - return irBuilder.buildSuperIndex(indexFunction, indexValue);
|
| + if (local.isFunction) {
|
| + return irBuilder.buildLocalFunctionGet(local);
|
| + } else {
|
| + return irBuilder.buildLocalVariableGet(local);
|
| + }
|
| },
|
| - operator: operator,
|
| + rhs: rhs,
|
| setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result);
|
| - },
|
| - isPrefix: isPrefix);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive handleUnresolvedSuperGetterIndexPostfixPrefix(
|
| - ast.Send node,
|
| - Element element,
|
| - ast.Node index,
|
| - op.IncDecOperator operator,
|
| - arg,
|
| - {bool isPrefix}) {
|
| - return giveup(node, 'handleSuperUnresolvedGetterIndexPostfixPrefix');
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive handleUnresolvedSuperSetterIndexPostfixPrefix(
|
| - ast.Send node,
|
| - FunctionElement indexFunction,
|
| - Element element,
|
| - ast.Node index,
|
| - op.IncDecOperator operator,
|
| - arg,
|
| - {bool isPrefix}) {
|
| - return giveup(node, 'handleSuperUnresolvedGetterIndexPostfixPrefix');
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive visitUnresolvedSuperGetterCompoundIndexSet(
|
| - ast.Send node,
|
| - Element element,
|
| - ast.Node index,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| - arg) {
|
| - return giveup(node, 'visitUnresolvedSuperGetterCompoundIndexSet');
|
| + if (isSetterValid) {
|
| + irBuilder.buildLocalVariableSet(local, result);
|
| + } else {
|
| + return buildLocalNoSuchSetter(local, result);
|
| + }
|
| + });
|
| }
|
|
|
| - @override
|
| - ir.Primitive visitUnresolvedSuperIndexSet(
|
| - ast.Send node,
|
| - Element element,
|
| - ast.Node index,
|
| - ast.Node rhs,
|
| - arg) {
|
| - return giveup(node, 'visitUnresolvedSuperIndexSet');
|
| + ir.Primitive buildStaticNoSuchGetter(Element element) {
|
| + return buildStaticNoSuchMethod(
|
| + new Selector.getter(element.name, element.library),
|
| + const <ir.Primitive>[]);
|
| }
|
|
|
| - @override
|
| - ir.Primitive visitUnresolvedSuperSetterCompoundIndexSet(
|
| - ast.Send node,
|
| - MethodElement getter,
|
| - Element element,
|
| - ast.Node index,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| - arg) {
|
| - return giveup(node, 'visitUnresolvedSuperSetterCompoundIndexSet');
|
| + ir.Primitive buildStaticNoSuchSetter(Element element, ir.Primitive value) {
|
| + return buildStaticNoSuchMethod(
|
| + new Selector.setter(element.name, element.library),
|
| + <ir.Primitive>[value]);
|
| }
|
|
|
| @override
|
| - ir.Primitive handleStaticSetterSet(
|
| + ir.Primitive handleStaticCompounds(
|
| ast.SendSet node,
|
| - FunctionElement setter,
|
| - ast.Node rhs,
|
| - _) {
|
| - return irBuilder.buildStaticSetterSet(setter, visit(rhs));
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive visitSuperFieldCompound(
|
| - ast.Send node,
|
| - FieldElement field,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| - _) {
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildSuperFieldGet(field),
|
| - operator: operator,
|
| + Element getter,
|
| + CompoundGetter getterKind,
|
| + Element setter,
|
| + CompoundSetter setterKind,
|
| + CompoundRhs rhs,
|
| + arg) {
|
| + return translateCompounds(
|
| + getValue: () {
|
| + switch (getterKind) {
|
| + case CompoundGetter.FIELD:
|
| + SourceInformation src = sourceInformationBuilder.buildGet(node);
|
| + return irBuilder.buildStaticFieldGet(getter, src);
|
| + case CompoundGetter.GETTER:
|
| + return irBuilder.buildStaticGetterGet(getter);
|
| + case CompoundGetter.METHOD:
|
| + return irBuilder.buildStaticFunctionGet(getter);
|
| + case CompoundGetter.UNRESOLVED:
|
| + return buildStaticNoSuchGetter(getter);
|
| + }
|
| + },
|
| rhs: rhs,
|
| setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperFieldSet(field, result);
|
| + switch (setterKind) {
|
| + case CompoundSetter.FIELD:
|
| + return irBuilder.buildStaticFieldSet(setter, result);
|
| + case CompoundSetter.SETTER:
|
| + return irBuilder.buildStaticSetterSet(setter, result);
|
| + case CompoundSetter.INVALID:
|
| + // TODO(johnniwinther): Ensure [setter] is non null.
|
| + return buildStaticNoSuchSetter(
|
| + setter != null ? setter : getter, result);
|
| + }
|
| });
|
| }
|
|
|
| - @override
|
| - ir.Primitive visitSuperFieldFieldPostfix(
|
| - ast.Send node,
|
| - FieldElement readField,
|
| - FieldElement writtenField,
|
| - op.IncDecOperator operator,
|
| - _) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildSuperFieldGet(readField),
|
| - operator: operator,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperFieldSet(writtenField, result);
|
| - },
|
| - isPrefix: false);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive visitSuperFieldFieldPrefix(
|
| - ast.Send node,
|
| - FieldElement readField,
|
| - FieldElement writtenField,
|
| - op.IncDecOperator operator,
|
| - _) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildSuperFieldGet(readField),
|
| - operator: operator,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperFieldSet(writtenField, result);
|
| - },
|
| - isPrefix: true);
|
| + ir.Primitive buildSuperNoSuchGetter(Element element) {
|
| + return buildInstanceNoSuchMethod(
|
| + new Selector.getter(element.name, element.library),
|
| + const <ir.Primitive>[]);
|
| }
|
|
|
| - @override
|
| - ir.Primitive visitSuperFieldSetterCompound(
|
| - ast.Send node,
|
| - FieldElement field,
|
| - FunctionElement setter,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| - _) {
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildSuperFieldGet(field),
|
| - operator: operator,
|
| + ir.Primitive buildSuperNoSuchSetter(Element element, ir.Primitive value) {
|
| + return buildInstanceNoSuchMethod(
|
| + new Selector.setter(element.name, element.library),
|
| + <ir.Primitive>[value]);
|
| + }
|
| +
|
| + @override
|
| + ir.Primitive handleSuperCompounds(
|
| + ast.SendSet node,
|
| + Element getter,
|
| + CompoundGetter getterKind,
|
| + Element setter,
|
| + CompoundSetter setterKind,
|
| + CompoundRhs rhs,
|
| + arg) {
|
| + return translateCompounds(
|
| + getValue: () {
|
| + switch (getterKind) {
|
| + case CompoundGetter.FIELD:
|
| + return irBuilder.buildSuperFieldGet(getter);
|
| + case CompoundGetter.GETTER:
|
| + return irBuilder.buildSuperGetterGet(getter);
|
| + case CompoundGetter.METHOD:
|
| + return irBuilder.buildSuperMethodGet(getter);
|
| + case CompoundGetter.UNRESOLVED:
|
| + // TODO(johnniwinther): Ensure [getter] is not null.
|
| + return buildSuperNoSuchGetter(getter != null ? getter : setter);
|
| + }
|
| + },
|
| rhs: rhs,
|
| setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperSetterSet(setter, result);
|
| + switch (setterKind) {
|
| + case CompoundSetter.FIELD:
|
| + return irBuilder.buildSuperFieldSet(setter, result);
|
| + case CompoundSetter.SETTER:
|
| + return irBuilder.buildSuperSetterSet(setter, result);
|
| + case CompoundSetter.INVALID:
|
| + return buildSuperNoSuchSetter(setter, result);
|
| + }
|
| });
|
| }
|
|
|
| @override
|
| - ir.Primitive visitSuperGetterFieldCompound(
|
| - ast.Send node,
|
| - FunctionElement getter,
|
| - FieldElement field,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| - _) {
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildSuperGetterGet(getter),
|
| - operator: operator,
|
| + ir.Primitive handleTypeVariableTypeLiteralCompounds(
|
| + ast.SendSet node,
|
| + TypeVariableElement typeVariable,
|
| + CompoundRhs rhs,
|
| + arg) {
|
| + return translateCompounds(
|
| + getValue: () => irBuilder.buildReifyTypeVariable(typeVariable.type),
|
| rhs: rhs,
|
| - setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperFieldSet(field, result);
|
| - });
|
| + setValue: (value) {}); // The binary operator will throw before this.
|
| }
|
|
|
| @override
|
| - ir.Primitive visitSuperGetterSetterCompound(
|
| - ast.Send node,
|
| - FunctionElement getter,
|
| - FunctionElement setter,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| - _) {
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildSuperGetterGet(getter),
|
| - operator: operator,
|
| + ir.Primitive handleIndexCompounds(
|
| + ast.SendSet node,
|
| + ast.Node receiver,
|
| + ast.Node index,
|
| + CompoundRhs rhs,
|
| + arg) {
|
| + ir.Primitive target = visit(receiver);
|
| + ir.Primitive indexValue = visit(index);
|
| + return translateCompounds(
|
| + getValue: () {
|
| + Selector selector = new Selector.index();
|
| + List<ir.Primitive> arguments = <ir.Primitive>[indexValue];
|
| + arguments =
|
| + normalizeDynamicArguments(selector.callStructure, arguments);
|
| + return irBuilder.buildDynamicInvocation(target, selector, arguments);
|
| + },
|
| rhs: rhs,
|
| setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperSetterSet(setter, result);
|
| + irBuilder.buildDynamicIndexSet(target, indexValue, result);
|
| });
|
| }
|
|
|
| @override
|
| - ir.Primitive visitSuperMethodSetterCompound(
|
| - ast.Send node,
|
| - FunctionElement method,
|
| - FunctionElement setter,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs,
|
| - _) {
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildSuperMethodGet(method),
|
| - operator: operator,
|
| + ir.Primitive handleSuperIndexCompounds(
|
| + ast.SendSet node,
|
| + Element indexFunction,
|
| + Element indexSetFunction,
|
| + ast.Node index,
|
| + CompoundRhs rhs,
|
| + arg,
|
| + {bool isGetterValid,
|
| + bool isSetterValid}) {
|
| + ir.Primitive indexValue = visit(index);
|
| + return translateCompounds(
|
| + getValue: () {
|
| + if (isGetterValid) {
|
| + return irBuilder.buildSuperIndex(indexFunction, indexValue);
|
| + } else {
|
| + return buildInstanceNoSuchMethod(
|
| + new Selector.index(), <ir.Primitive>[indexValue]);
|
| + }
|
| + },
|
| rhs: rhs,
|
| setValue: (ir.Primitive result) {
|
| - irBuilder.buildSuperSetterSet(setter, result);
|
| + if (isSetterValid) {
|
| + irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result);
|
| + } else {
|
| + buildInstanceNoSuchMethod(
|
| + new Selector.indexSet(), <ir.Primitive>[indexValue, result]);
|
| + }
|
| });
|
| }
|
|
|
| @@ -1920,7 +1616,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive errorUnresolvedCompound(
|
| + ir.Primitive visitUnresolvedCompound(
|
| ast.Send node,
|
| Element element,
|
| op.AssignmentOperator operator,
|
| @@ -1982,24 +1678,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive errorUnresolvedPostfix(
|
| - ast.Send node,
|
| - Element element,
|
| - op.IncDecOperator operator, _) {
|
| - // TODO(asgerf): Which ones are missing? The getter and/or the setter?
|
| - return buildStaticNoSuchMethod(elements.getSelector(node), []);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorUnresolvedPrefix(
|
| - ast.Send node,
|
| - Element element,
|
| - op.IncDecOperator operator, _) {
|
| - // TODO(asgerf): Which ones are missing? The getter and/or the setter?
|
| - return buildStaticNoSuchMethod(elements.getSelector(node), []);
|
| - }
|
| -
|
| - @override
|
| ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke(
|
| ast.NewExpression node,
|
| ConstructorElement constructor,
|
| @@ -2022,18 +1700,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive errorUnresolvedSuperCompoundIndexSet(
|
| - ast.SendSet node,
|
| - Element element,
|
| - ast.Node index,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs, _) {
|
| - // Assume the index getter is missing.
|
| - Selector selector = useSelectorTypeOfNode(new Selector.index(), node);
|
| - return buildInstanceNoSuchMethod(selector, [visit(index)]);
|
| - }
|
| -
|
| - @override
|
| ir.Primitive visitUnresolvedSuperIndex(
|
| ast.Send node,
|
| Element function,
|
| @@ -2044,40 +1710,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive errorUnresolvedSuperIndexPostfix(
|
| - ast.Send node,
|
| - Element function,
|
| - ast.Node index,
|
| - op.IncDecOperator operator, _) {
|
| - // Assume the index getter is missing.
|
| - Selector selector = useSelectorTypeOfNode(new Selector.index(), node);
|
| - return buildInstanceNoSuchMethod(selector, [visit(index)]);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorUnresolvedSuperIndexPrefix(
|
| - ast.Send node,
|
| - Element function,
|
| - ast.Node index,
|
| - op.IncDecOperator operator, _) {
|
| - // Assume the index getter is missing.
|
| - Selector selector = useSelectorTypeOfNode(new Selector.index(), node);
|
| - return buildInstanceNoSuchMethod(selector, [visit(index)]);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorUnresolvedSuperIndexSet(
|
| - ast.SendSet node,
|
| - Element element,
|
| - ast.Node index,
|
| - ast.Node rhs, _) {
|
| - Selector selector = useSelectorTypeOfNode(new Selector.index(), node);
|
| - return buildInstanceNoSuchMethod(
|
| - selector,
|
| - [visit(index), visit(rhs)]);
|
| - }
|
| -
|
| - @override
|
| ir.Primitive visitUnresolvedSuperBinary(
|
| ast.Send node,
|
| Element element,
|
| @@ -2204,94 +1836,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive errorClassTypeLiteralCompound(
|
| - ast.Send node,
|
| - ConstantExpression constant,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs, _) {
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildConstant(constant),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (value) {}); // The binary operator will throw before this.
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorClassTypeLiteralPostfix(
|
| - ast.Send node,
|
| - ConstantExpression constant,
|
| - op.IncDecOperator operator, _) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildConstant(constant),
|
| - operator: operator,
|
| - setValue: (value) {}, // The binary operator will throw before this.
|
| - isPrefix: false);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorClassTypeLiteralPrefix(
|
| - ast.Send node,
|
| - ConstantExpression constant,
|
| - op.IncDecOperator operator, _) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildConstant(constant),
|
| - operator: operator,
|
| - setValue: (value) {}, // The binary operator will throw before this.
|
| - isPrefix: true);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorDynamicTypeLiteralCompound(
|
| - ast.Send node,
|
| - ConstantExpression constant,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs, _) {
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildConstant(constant),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (value) {}); // The binary operator will throw before this.
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorDynamicTypeLiteralPostfix(
|
| - ast.Send node,
|
| - ConstantExpression constant,
|
| - op.IncDecOperator operator, _) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildConstant(constant),
|
| - operator: operator,
|
| - setValue: (value) {}, // The binary operator will throw before this.
|
| - isPrefix: false);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorDynamicTypeLiteralPrefix(
|
| - ast.Send node,
|
| - ConstantExpression constant,
|
| - op.IncDecOperator operator, _) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildConstant(constant),
|
| - operator: operator,
|
| - setValue: (value) {}, // The binary operator will throw before this.
|
| - isPrefix: true);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorFinalLocalVariableCompound(
|
| - ast.Send node,
|
| - LocalVariableElement variable,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs, _) {
|
| - Selector selector = new Selector.setter(variable.name, null);
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildLocalVariableGet(variable),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (value) => buildStaticNoSuchMethod(selector, [value]));
|
| - }
|
| -
|
| - @override
|
| ir.Primitive errorFinalLocalVariableSet(
|
| ast.SendSet node,
|
| LocalVariableElement variable,
|
| @@ -2301,20 +1845,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive errorFinalParameterCompound(
|
| - ast.Send node,
|
| - ParameterElement parameter,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs, _) {
|
| - Selector selector = new Selector.setter(parameter.name, null);
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildLocalVariableGet(parameter),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (value) => buildStaticNoSuchMethod(selector, [value]));
|
| - }
|
| -
|
| - @override
|
| ir.Primitive errorFinalParameterSet(
|
| ast.SendSet node,
|
| ParameterElement parameter,
|
| @@ -2324,21 +1854,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive errorFinalStaticFieldCompound(
|
| - ast.Send node,
|
| - FieldElement field,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs, _) {
|
| - SourceInformation src = sourceInformationBuilder.buildGet(node);
|
| - return translateCompound(
|
| - getValue: () => buildStaticFieldGet(field, src),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (value) => buildStaticNoSuchMethod(
|
| - new Selector.setter(field.name, field.library), [value]));
|
| - }
|
| -
|
| - @override
|
| ir.Primitive errorFinalStaticFieldSet(
|
| ast.SendSet node,
|
| FieldElement field,
|
| @@ -2350,22 +1865,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive errorFinalSuperFieldCompound(
|
| - ast.Send node,
|
| - FieldElement field,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs, _) {
|
| - Selector selector = useSelectorTypeOfNode(
|
| - new Selector.setter(field.name, field.library),
|
| - node);
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildSuperFieldGet(field),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (value) => buildInstanceNoSuchMethod(selector, [value]));
|
| - }
|
| -
|
| - @override
|
| ir.Primitive errorFinalSuperFieldSet(
|
| ast.SendSet node,
|
| FieldElement field,
|
| @@ -2377,21 +1876,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive errorFinalTopLevelFieldCompound(
|
| - ast.Send node,
|
| - FieldElement field,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs, _) {
|
| - SourceInformation src = sourceInformationBuilder.buildGet(node);
|
| - return translateCompound(
|
| - getValue: () => buildStaticFieldGet(field, src),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (value) => buildStaticNoSuchMethod(
|
| - new Selector.setter(field.name, field.library), [value]));
|
| - }
|
| -
|
| - @override
|
| ir.Primitive errorFinalTopLevelFieldSet(
|
| ast.SendSet node,
|
| FieldElement field,
|
| @@ -2402,45 +1886,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive errorLocalFunctionCompound(
|
| - ast.Send node,
|
| - LocalFunctionElement function,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs, _) {
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildLocalFunctionGet(function),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (value) {}); // Binary operator will throw before this.
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorLocalFunctionPostfix(
|
| - ast.Send node,
|
| - LocalFunctionElement function,
|
| - op.IncDecOperator operator,
|
| - _) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildLocalFunctionGet(function),
|
| - operator: operator,
|
| - setValue: (value) {}, // Binary operator will throw before this.
|
| - isPrefix: false);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorLocalFunctionPrefix(
|
| - ast.Send node,
|
| - LocalFunctionElement function,
|
| - op.IncDecOperator operator,
|
| - _) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildLocalFunctionGet(function),
|
| - operator: operator,
|
| - setValue: (value) {}, // Binary operator will throw before this.
|
| - isPrefix: true);
|
| - }
|
| -
|
| - @override
|
| ir.Primitive errorLocalFunctionSet(
|
| ast.SendSet node,
|
| LocalFunctionElement function,
|
| @@ -2545,80 +1990,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| return buildInstanceNoSuchMethod(selector, args);
|
| }
|
|
|
| - @override
|
| - ir.Primitive errorTypeVariableTypeLiteralCompound(
|
| - ast.Send node,
|
| - TypeVariableElement element,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs, _) {
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildReifyTypeVariable(element.type),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (value) {}); // The binary operator will throw before this.
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorTypeVariableTypeLiteralPostfix(
|
| - ast.Send node,
|
| - TypeVariableElement element,
|
| - op.IncDecOperator operator, _) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildReifyTypeVariable(element.type),
|
| - operator: operator,
|
| - setValue: (value) {}, // The binary operator will throw before this.
|
| - isPrefix: false);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorTypeVariableTypeLiteralPrefix(
|
| - ast.Send node,
|
| - TypeVariableElement element,
|
| - op.IncDecOperator operator, _) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildReifyTypeVariable(element.type),
|
| - operator: operator,
|
| - setValue: (value) {}, // The binary operator will throw before this.
|
| - isPrefix: true);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorTypedefTypeLiteralCompound(
|
| - ast.Send node,
|
| - ConstantExpression constant,
|
| - op.AssignmentOperator operator,
|
| - ast.Node rhs, _) {
|
| - return translateCompound(
|
| - getValue: () => irBuilder.buildConstant(constant),
|
| - operator: operator,
|
| - rhs: rhs,
|
| - setValue: (value) {}); // The binary operator will throw before this.
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorTypedefTypeLiteralPostfix(
|
| - ast.Send node,
|
| - ConstantExpression constant,
|
| - op.IncDecOperator operator, _) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildConstant(constant),
|
| - operator: operator,
|
| - setValue: (value) {}, // The binary operator will throw before this.
|
| - isPrefix: false);
|
| - }
|
| -
|
| - @override
|
| - ir.Primitive errorTypedefTypeLiteralPrefix(
|
| - ast.Send node,
|
| - TypeConstantExpression constant,
|
| - op.IncDecOperator operator, _) {
|
| - return translatePrefixPostfix(
|
| - getValue: () => irBuilder.buildConstant(constant),
|
| - operator: operator,
|
| - setValue: (value) {}, // The binary operator will throw before this.
|
| - isPrefix: true);
|
| - }
|
| -
|
| ir.RootNode nullIfGiveup(ir.RootNode action()) {
|
| try {
|
| return action();
|
|
|