Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Unified Diff: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart

Issue 1142293004: Revert "Refactor handling of compounds." (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« no previous file with comments | « no previous file | pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698