Chromium Code Reviews| 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 c49953c554cb103e4f41957cc5154d9ba1429b18..5ed2ea40846915eec59a7d231297b2ff34c44d46 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; |
| @@ -1245,123 +1246,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 translateCompounds( |
| {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(), |
| - 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 |
| @@ -1378,38 +1282,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, |
| @@ -1419,38 +1291,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
| } |
| @override |
| - ir.Primitive handleStaticFieldCompound( |
| - ast.Send node, |
| - FieldElement field, |
| - op.AssignmentOperator operator, |
| - ast.Node rhs, |
| - _) { |
| - return translateCompound( |
| - getValue: () => irBuilder.buildStaticFieldGet(field), |
| - 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}) { |
| - return translatePrefixPostfix( |
| - getValue: () => irBuilder.buildStaticFieldGet(field), |
| - operator: operator, |
| - setValue: (ir.Primitive result) { |
| - irBuilder.buildStaticFieldSet(field, result); |
| - }, |
| - isPrefix: isPrefix); |
| - } |
| - |
| - @override |
| ir.Primitive handleStaticFieldSet( |
| ast.SendSet node, |
| FieldElement field, |
| @@ -1478,386 +1318,243 @@ 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 handleConstantCompounds( |
| + 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. |
|
asgerf
2015/05/18 10:32:42
This seems wrong. The binary operator will not thr
Johnni Winther
2015/05/20 08:16:34
`5 += 42` is a syntax error that will (and should)
|
| } |
| @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); |
| - } |
| - |
| - @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); |
| + ir.Primitive buildLocalNoSuchSetter(Local local, ir.Primitive value) { |
| + Selector selector = new Selector.setter(local.name, null); |
| + return buildStaticNoSuchMethod(selector, [value]); |
| } |
| @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: |
| + return irBuilder.buildStaticFieldGet(getter); |
| + 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); |
| + ir.Primitive buildSuperNoSuchGetter(Element element) { |
| + return buildInstanceNoSuchMethod( |
| + new Selector.getter(element.name, element.library), |
| + const <ir.Primitive>[]); |
| + } |
| + |
| + ir.Primitive buildSuperNoSuchSetter(Element element, ir.Primitive value) { |
| + return buildInstanceNoSuchMethod( |
| + new Selector.setter(element.name, element.library), |
| + <ir.Primitive>[value]); |
| } |
| @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); |
| + 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); |
| + } |
| }, |
| - 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) { |
| - 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]); |
| + } |
| }); |
| } |
| @@ -1917,7 +1614,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
| } |
| @override |
| - ir.Primitive errorUnresolvedCompound( |
| + ir.Primitive visitUnresolvedCompound( |
| ast.Send node, |
| Element element, |
| op.AssignmentOperator operator, |
| @@ -1979,24 +1676,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, |
| @@ -2019,18 +1698,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, |
| @@ -2041,40 +1708,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, |
| @@ -2201,94 +1834,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, |
| @@ -2298,20 +1843,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, |
| @@ -2321,20 +1852,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
| } |
| @override |
| - ir.Primitive errorFinalStaticFieldCompound( |
| - ast.Send node, |
| - FieldElement field, |
| - op.AssignmentOperator operator, |
| - ast.Node rhs, _) { |
| - return translateCompound( |
| - getValue: () => irBuilder.buildStaticFieldGet(field), |
| - operator: operator, |
| - rhs: rhs, |
| - setValue: (value) => buildStaticNoSuchMethod( |
| - new Selector.setter(field.name, field.library), [value])); |
| - } |
| - |
| - @override |
| ir.Primitive errorFinalStaticFieldSet( |
| ast.SendSet node, |
| FieldElement field, |
| @@ -2346,22 +1863,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, |
| @@ -2373,20 +1874,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
| } |
| @override |
| - ir.Primitive errorFinalTopLevelFieldCompound( |
| - ast.Send node, |
| - FieldElement field, |
| - op.AssignmentOperator operator, |
| - ast.Node rhs, _) { |
| - return translateCompound( |
| - getValue: () => irBuilder.buildStaticFieldGet(field), |
| - operator: operator, |
| - rhs: rhs, |
| - setValue: (value) => buildStaticNoSuchMethod( |
| - new Selector.setter(field.name, field.library), [value])); |
| - } |
| - |
| - @override |
| ir.Primitive errorFinalTopLevelFieldSet( |
| ast.SendSet node, |
| FieldElement field, |
| @@ -2397,45 +1884,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, |
| @@ -2540,80 +1988,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(); |