| 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 5ed33b7a0fbc59c6d815a78e9d4f72e4a29c79bb..759ed6c13fe8e99f0c7880fe199ac8b2424eff44 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,9 +143,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| BaseImplementationOfLocalsMixin<ir.Primitive, dynamic>,
|
| BaseImplementationOfDynamicsMixin<ir.Primitive, dynamic>,
|
| BaseImplementationOfConstantsMixin<ir.Primitive, dynamic>,
|
| - BaseImplementationOfNewMixin<ir.Primitive, dynamic>,
|
| - BaseImplementationOfCompoundsMixin<ir.Primitive, dynamic>,
|
| - BaseImplementationOfIndexCompoundsMixin<ir.Primitive, dynamic>
|
| + BaseImplementationOfSuperIncDecsMixin<ir.Primitive, dynamic>,
|
| + BaseImplementationOfNewMixin<ir.Primitive, dynamic>
|
| implements SemanticSendVisitor<ir.Primitive, dynamic> {
|
| final TreeElements elements;
|
| final Compiler compiler;
|
| @@ -1247,26 +1246,123 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs));
|
| }
|
|
|
| - ir.Primitive translateCompounds(
|
| + @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 getValue(),
|
| - CompoundRhs rhs,
|
| + op.AssignmentOperator operator,
|
| + ast.Node rhs,
|
| void setValue(ir.Primitive value)}) {
|
| ir.Primitive value = getValue();
|
| Selector operatorSelector =
|
| - 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];
|
| + new Selector.binaryOperator(operator.selectorName);
|
| + List<ir.Primitive> arguments = <ir.Primitive>[visit(rhs)];
|
| arguments = normalizeDynamicArguments(
|
| operatorSelector.callStructure, arguments);
|
| ir.Primitive result =
|
| irBuilder.buildDynamicInvocation(value, operatorSelector, arguments);
|
| setValue(result);
|
| - return rhs.kind == CompoundKind.POSTFIX ? value : 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);
|
| }
|
|
|
| @override
|
| @@ -1283,6 +1379,38 @@ 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,
|
| @@ -1292,6 +1420,40 @@ 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,
|
| @@ -1319,244 +1481,386 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive visitUnresolvedSuperIndexSet(
|
| + ir.Primitive handleStaticGetterSetterCompound(
|
| ast.Send node,
|
| - Element element,
|
| - ast.Node index,
|
| + FunctionElement getter,
|
| + FunctionElement setter,
|
| + op.AssignmentOperator operator,
|
| ast.Node rhs,
|
| - arg) {
|
| - return giveup(node, 'visitUnresolvedSuperIndexSet');
|
| + _) {
|
| + return translateCompound(
|
| + getValue: () => irBuilder.buildStaticGetterGet(getter),
|
| + operator: operator,
|
| + rhs: rhs,
|
| + setValue: (ir.Primitive result) {
|
| + irBuilder.buildStaticSetterSet(setter, result);
|
| + });
|
| }
|
|
|
| @override
|
| - ir.Primitive handleStaticSetterSet(
|
| - ast.SendSet node,
|
| + 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,
|
| - ast.Node rhs,
|
| - _) {
|
| - return irBuilder.buildStaticSetterSet(setter, visit(rhs));
|
| + 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 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.
|
| + 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 handleDynamicCompounds(
|
| + ir.Primitive handleSuperGetterSetterPostfixPrefix(
|
| ast.Send node,
|
| - ast.Node receiver,
|
| - CompoundRhs rhs,
|
| - Selector getterSelector,
|
| - Selector setterSelector,
|
| - arg) {
|
| - ir.Primitive target = translateReceiver(receiver);
|
| - return translateCompounds(
|
| - getValue: () => irBuilder.buildDynamicGet(target, getterSelector),
|
| - rhs: rhs,
|
| + FunctionElement getter,
|
| + FunctionElement setter,
|
| + op.IncDecOperator operator,
|
| + arg,
|
| + {bool isPrefix}) {
|
| + return translatePrefixPostfix(
|
| + getValue: () => irBuilder.buildSuperGetterGet(getter),
|
| + operator: operator,
|
| setValue: (ir.Primitive result) {
|
| - irBuilder.buildDynamicSet(target, setterSelector, result);
|
| - });
|
| + irBuilder.buildSuperSetterSet(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 handleSuperMethodSetterPostfixPrefix(
|
| + ast.Send node,
|
| + FunctionElement method,
|
| + 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);
|
| }
|
|
|
| @override
|
| - ir.Primitive handleLocalCompounds(
|
| - ast.SendSet node,
|
| - LocalElement local,
|
| - CompoundRhs rhs,
|
| + ir.Primitive handleStaticGetterSetterPostfixPrefix(
|
| + ast.Send node,
|
| + FunctionElement getter,
|
| + FunctionElement setter,
|
| + op.IncDecOperator operator,
|
| arg,
|
| - {bool isSetterValid}) {
|
| - return translateCompounds(
|
| - getValue: () {
|
| - if (local.isFunction) {
|
| - return irBuilder.buildLocalFunctionGet(local);
|
| - } else {
|
| - return irBuilder.buildLocalVariableGet(local);
|
| - }
|
| + {bool isPrefix}) {
|
| + return translatePrefixPostfix(
|
| + getValue: () => irBuilder.buildStaticGetterGet(getter),
|
| + operator: operator,
|
| + setValue: (ir.Primitive result) {
|
| + irBuilder.buildStaticSetterSet(setter, result);
|
| },
|
| + isPrefix: isPrefix);
|
| + }
|
| +
|
| + @override
|
| + ir.Primitive handleStaticMethodSetterCompound(
|
| + ast.Send node,
|
| + FunctionElement method,
|
| + FunctionElement setter,
|
| + op.AssignmentOperator operator,
|
| + ast.Node rhs,
|
| + _) {
|
| + return translateCompound(
|
| + getValue: () => irBuilder.buildStaticFunctionGet(method),
|
| + operator: operator,
|
| rhs: rhs,
|
| setValue: (ir.Primitive result) {
|
| - if (isSetterValid) {
|
| - irBuilder.buildLocalVariableSet(local, result);
|
| - } else {
|
| - return buildLocalNoSuchSetter(local, result);
|
| - }
|
| + irBuilder.buildStaticSetterSet(setter, result);
|
| });
|
| }
|
|
|
| - ir.Primitive buildStaticNoSuchGetter(Element element) {
|
| - return buildStaticNoSuchMethod(
|
| - new Selector.getter(element.name, element.library),
|
| - const <ir.Primitive>[]);
|
| + @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 buildStaticNoSuchSetter(Element element, ir.Primitive value) {
|
| - return buildStaticNoSuchMethod(
|
| - new Selector.setter(element.name, element.library),
|
| - <ir.Primitive>[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 handleStaticCompounds(
|
| - ast.SendSet node,
|
| - Element getter,
|
| - CompoundGetter getterKind,
|
| - Element setter,
|
| - CompoundSetter setterKind,
|
| - CompoundRhs rhs,
|
| - arg) {
|
| - return translateCompounds(
|
| + ir.Primitive handleSuperIndexPostfixPrefix(
|
| + ast.Send node,
|
| + FunctionElement indexFunction,
|
| + FunctionElement indexSetFunction,
|
| + ast.Node index,
|
| + op.IncDecOperator operator,
|
| + arg,
|
| + {bool isPrefix}) {
|
| + ir.Primitive indexValue = visit(index);
|
| + return translatePrefixPostfix(
|
| 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);
|
| - }
|
| + return irBuilder.buildSuperIndex(indexFunction, indexValue);
|
| },
|
| - rhs: rhs,
|
| + operator: operator,
|
| setValue: (ir.Primitive 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);
|
| - }
|
| - });
|
| + irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result);
|
| + },
|
| + isPrefix: isPrefix);
|
| }
|
|
|
| - ir.Primitive buildSuperNoSuchGetter(Element element) {
|
| - return buildInstanceNoSuchMethod(
|
| - new Selector.getter(element.name, element.library),
|
| - const <ir.Primitive>[]);
|
| + @override
|
| + ir.Primitive handleUnresolvedSuperGetterIndexPostfixPrefix(
|
| + ast.Send node,
|
| + Element element,
|
| + ast.Node index,
|
| + op.IncDecOperator operator,
|
| + arg,
|
| + {bool isPrefix}) {
|
| + return giveup(node, 'handleSuperUnresolvedGetterIndexPostfixPrefix');
|
| }
|
|
|
| - ir.Primitive buildSuperNoSuchSetter(Element element, ir.Primitive value) {
|
| - return buildInstanceNoSuchMethod(
|
| - new Selector.setter(element.name, element.library),
|
| - <ir.Primitive>[value]);
|
| + @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 handleSuperCompounds(
|
| - ast.SendSet node,
|
| - Element getter,
|
| - CompoundGetter getterKind,
|
| - Element setter,
|
| - CompoundSetter setterKind,
|
| - CompoundRhs rhs,
|
| + ir.Primitive visitUnresolvedSuperGetterCompoundIndexSet(
|
| + ast.Send node,
|
| + Element element,
|
| + ast.Node index,
|
| + op.AssignmentOperator operator,
|
| + ast.Node 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);
|
| - }
|
| + return giveup(node, 'visitUnresolvedSuperGetterCompoundIndexSet');
|
| + }
|
| +
|
| + @override
|
| + ir.Primitive visitUnresolvedSuperIndexSet(
|
| + ast.Send node,
|
| + Element element,
|
| + ast.Node index,
|
| + ast.Node rhs,
|
| + arg) {
|
| + return giveup(node, 'visitUnresolvedSuperIndexSet');
|
| + }
|
| +
|
| + @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');
|
| + }
|
| +
|
| + @override
|
| + ir.Primitive handleStaticSetterSet(
|
| + 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,
|
| + rhs: rhs,
|
| + setValue: (ir.Primitive result) {
|
| + irBuilder.buildSuperFieldSet(field, 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);
|
| + }
|
| +
|
| + @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,
|
| rhs: rhs,
|
| setValue: (ir.Primitive 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);
|
| - }
|
| + irBuilder.buildSuperSetterSet(setter, result);
|
| });
|
| }
|
|
|
| @override
|
| - ir.Primitive handleTypeVariableTypeLiteralCompounds(
|
| - ast.SendSet node,
|
| - TypeVariableElement typeVariable,
|
| - CompoundRhs rhs,
|
| - arg) {
|
| - return translateCompounds(
|
| - getValue: () => irBuilder.buildReifyTypeVariable(typeVariable.type),
|
| + ir.Primitive visitSuperGetterFieldCompound(
|
| + ast.Send node,
|
| + FunctionElement getter,
|
| + FieldElement field,
|
| + op.AssignmentOperator operator,
|
| + ast.Node rhs,
|
| + _) {
|
| + return translateCompound(
|
| + getValue: () => irBuilder.buildSuperGetterGet(getter),
|
| + operator: operator,
|
| rhs: rhs,
|
| - setValue: (value) {}); // The binary operator will throw before this.
|
| + setValue: (ir.Primitive result) {
|
| + irBuilder.buildSuperFieldSet(field, result);
|
| + });
|
| }
|
|
|
| @override
|
| - 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);
|
| - },
|
| + ir.Primitive visitSuperGetterSetterCompound(
|
| + ast.Send node,
|
| + FunctionElement getter,
|
| + FunctionElement setter,
|
| + op.AssignmentOperator operator,
|
| + ast.Node rhs,
|
| + _) {
|
| + return translateCompound(
|
| + getValue: () => irBuilder.buildSuperGetterGet(getter),
|
| + operator: operator,
|
| rhs: rhs,
|
| setValue: (ir.Primitive result) {
|
| - irBuilder.buildDynamicIndexSet(target, indexValue, result);
|
| + irBuilder.buildSuperSetterSet(setter, result);
|
| });
|
| }
|
|
|
| @override
|
| - 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]);
|
| - }
|
| - },
|
| + ir.Primitive visitSuperMethodSetterCompound(
|
| + ast.Send node,
|
| + FunctionElement method,
|
| + FunctionElement setter,
|
| + op.AssignmentOperator operator,
|
| + ast.Node rhs,
|
| + _) {
|
| + return translateCompound(
|
| + getValue: () => irBuilder.buildSuperMethodGet(method),
|
| + operator: operator,
|
| rhs: rhs,
|
| setValue: (ir.Primitive result) {
|
| - if (isSetterValid) {
|
| - irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result);
|
| - } else {
|
| - buildInstanceNoSuchMethod(
|
| - new Selector.indexSet(), <ir.Primitive>[indexValue, result]);
|
| - }
|
| + irBuilder.buildSuperSetterSet(setter, result);
|
| });
|
| }
|
|
|
| @@ -1616,7 +1920,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| }
|
|
|
| @override
|
| - ir.Primitive visitUnresolvedCompound(
|
| + ir.Primitive errorUnresolvedCompound(
|
| ast.Send node,
|
| Element element,
|
| op.AssignmentOperator operator,
|
| @@ -1678,6 +1982,24 @@ 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,
|
| @@ -1700,6 +2022,18 @@ 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,
|
| @@ -1710,6 +2044,40 @@ 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,
|
| @@ -1836,6 +2204,94 @@ 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,
|
| @@ -1845,6 +2301,20 @@ 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,
|
| @@ -1854,6 +2324,21 @@ 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,
|
| @@ -1865,6 +2350,22 @@ 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,
|
| @@ -1876,6 +2377,21 @@ 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,
|
| @@ -1886,6 +2402,45 @@ 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,
|
| @@ -1990,6 +2545,80 @@ 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();
|
|
|