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

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

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