Index: lib/unresolved.dart |
diff --git a/lib/unresolved.dart b/lib/unresolved.dart |
index 8abc85e88ea6b1c0a6311e0ed682e46fa83d65cb..f4842e3e239d42ce0f558b7ed6a8cfc421cb4a8c 100644 |
--- a/lib/unresolved.dart |
+++ b/lib/unresolved.dart |
@@ -6,6 +6,8 @@ library rasta.unresolved; |
import 'package:kernel/ast.dart' as ir; |
+import 'accessors.dart'; |
+ |
import "package:compiler/src/resolution/operators.dart" show |
AssignmentOperator, |
BinaryOperator, |
@@ -28,6 +30,7 @@ import "package:compiler/src/dart_types.dart" show |
InterfaceType; |
import "package:compiler/src/tree/tree.dart" show |
+ Expression, |
NewExpression, |
Node, |
NodeList, |
@@ -39,20 +42,14 @@ import "package:compiler/src/universe/selector.dart" show |
import "kernel.dart" show |
Kernel; |
-ir.Arguments buildStringArgument(String argument) { |
- return new ir.Arguments(<ir.Expression>[new ir.StringLiteral(argument)]); |
-} |
- |
-ir.Arguments buildIntArgument(int argument) { |
- return new ir.Arguments(<ir.Expression>[new ir.IntLiteral(argument)]); |
-} |
- |
abstract class RastaUnresolved { |
Kernel get kernel; |
// Implemented in KernelVisitor |
AstElement get currentElement; |
+ bool get isVoidContext; |
ir.Arguments buildArguments(NodeList arguments); |
+ ir.TreeNode visitForValue(Expression node); |
// TODO(ahe): Delete this method. |
ir.InvalidExpression handleUnresolved(Node node); |
@@ -102,8 +99,57 @@ abstract class RastaUnresolved { |
]))); |
} |
+ /// Throws a NoSuchMethodError for an unresolved getter named [name]. |
+ ir.Expression buildThrowUnresolvedGetter( |
+ String name, |
+ [ir.Procedure exceptionBuilder]) { |
+ // TODO(asgerf): We should remove this fallback, but in some cases we do |
+ // not get sufficient information to determine exactly what kind of |
+ // getter it is. |
+ exceptionBuilder ??= kernel.getGenericNoSuchMethodBuilder(); |
+ return buildThrowNoSuchMethodError( |
+ exceptionBuilder, |
+ new ir.NullLiteral(), |
+ name, |
+ new ir.Arguments.empty()); |
+ } |
+ |
+ ir.Expression buildThrowUnresolvedSetter( |
+ String name, |
+ ir.Expression argument, |
+ [ir.Procedure exceptionBuilder]) { |
+ // TODO(asgerf): We should remove this fallback, but in some cases we do |
+ // not get sufficient information to determine exactly what kind of |
+ // setter it is. |
+ exceptionBuilder ??= kernel.getGenericNoSuchMethodBuilder(); |
+ return buildThrowNoSuchMethodError( |
+ exceptionBuilder, |
+ new ir.NullLiteral(), |
+ name, |
+ new ir.Arguments(<ir.Expression>[argument])); |
+ } |
+ |
+ ir.Expression buildThrowUnresolvedSuperGetter(String name) { |
+ return buildThrowNoSuchMethodError( |
+ kernel.getUnresolvedSuperGetterBuilder(), |
+ new ir.ThisExpression(), |
+ name, |
+ new ir.Arguments.empty()); |
+ } |
+ |
+ ir.Expression buildThrowUnresolvedSuperSetter( |
+ String name, |
+ ir.Expression argument) { |
+ return buildThrowNoSuchMethodError( |
+ kernel.getUnresolvedSuperSetterBuilder(), |
+ new ir.ThisExpression(), |
+ name, |
+ new ir.Arguments(<ir.Expression>[argument])); |
+ } |
+ |
ir.Expression buildThrowSingleArgumentError( |
- ir.Procedure exceptionBuilder, String errorMessage) { |
+ ir.Procedure exceptionBuilder, |
+ String errorMessage) { |
return new ir.Throw(new ir.StaticInvocation(exceptionBuilder, |
new ir.Arguments(<ir.Expression>[new ir.StringLiteral(errorMessage)]))); |
} |
@@ -140,193 +186,226 @@ abstract class RastaUnresolved { |
constructor); |
} |
- ir.InvalidExpression visitUnresolvedCompound( |
+ ir.Expression visitUnresolvedCompound( |
Send node, |
Element element, |
AssignmentOperator operator, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedGet( |
+ ir.Expression visitUnresolvedGet( |
Send node, |
Element element, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedInvoke( |
+ ir.Expression visitUnresolvedInvoke( |
Send node, |
Element element, |
NodeList arguments, |
Selector selector, |
_) { |
- return handleUnresolved(node); |
+ // TODO(asgerf): Should we use a type literal as receiver for unresolved |
+ // static invocations? |
+ return buildThrowNoSuchMethodError( |
+ kernel.getGenericNoSuchMethodBuilder(), |
+ new ir.NullLiteral(), |
+ element.name, |
+ buildArguments(arguments), |
+ element); |
} |
- ir.InvalidExpression visitUnresolvedPostfix( |
+ ir.Expression visitUnresolvedPostfix( |
Send node, |
Element element, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedPrefix( |
+ ir.Expression visitUnresolvedPrefix( |
Send node, |
Element element, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedRedirectingFactoryConstructorInvoke( |
+ ir.Expression visitUnresolvedRedirectingFactoryConstructorInvoke( |
NewExpression node, |
ConstructorElement constructor, |
InterfaceType type, |
NodeList arguments, |
CallStructure callStructure, |
_) { |
- return handleUnresolved(node); |
+ // The body of the factory will throw an error. |
+ return new ir.StaticInvocation(kernel.functionToIr(constructor), |
+ buildArguments(arguments)); |
} |
- ir.InvalidExpression visitUnresolvedSet( |
+ ir.Expression visitUnresolvedSet( |
Send node, |
Element element, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSetter('${node.selector}', visitForValue(rhs)); |
} |
- ir.InvalidExpression visitUnresolvedSetIfNull( |
+ ir.Expression visitUnresolvedSetIfNull( |
Send node, |
Element element, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedStaticGetterCompound( |
+ ir.Expression visitUnresolvedStaticGetterCompound( |
Send node, |
Element element, |
MethodElement setter, |
AssignmentOperator operator, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedGetter('${node.selector}', |
+ kernel.getUnresolvedStaticGetterBuilder()); |
} |
- ir.InvalidExpression visitUnresolvedStaticGetterPostfix( |
+ ir.Expression visitUnresolvedStaticGetterPostfix( |
Send node, |
Element element, |
MethodElement setter, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedGetter('${node.selector}', |
+ kernel.getUnresolvedStaticGetterBuilder()); |
} |
- ir.InvalidExpression visitUnresolvedStaticGetterPrefix( |
+ ir.Expression visitUnresolvedStaticGetterPrefix( |
Send node, |
Element element, |
MethodElement setter, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedGetter('${node.selector}', |
+ kernel.getUnresolvedStaticGetterBuilder()); |
} |
- ir.InvalidExpression visitUnresolvedStaticGetterSetIfNull( |
+ ir.Expression visitUnresolvedStaticGetterSetIfNull( |
Send node, |
Element element, |
MethodElement setter, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedGetter('${node.selector}', |
+ kernel.getUnresolvedStaticGetterBuilder()); |
} |
- ir.InvalidExpression visitUnresolvedStaticSetterCompound( |
+ ir.Expression visitUnresolvedStaticSetterCompound( |
Send node, |
MethodElement getter, |
Element element, |
AssignmentOperator operator, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSetter('${node.selector}', |
+ visitForValue(rhs), |
+ kernel.getUnresolvedStaticSetterBuilder()); |
} |
- ir.InvalidExpression visitUnresolvedStaticSetterPostfix( |
+ ir.Expression visitUnresolvedStaticSetterPostfix( |
Send node, |
MethodElement getter, |
Element element, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new ClassStaticAccessor(this, getter.name, |
+ kernel.functionToIr(getter), null); |
+ return accessor.buildPostfixIncrement( |
+ new ir.Name(operator.selectorName), |
+ voidContext: isVoidContext); |
} |
- ir.InvalidExpression visitUnresolvedStaticSetterPrefix( |
+ ir.Expression visitUnresolvedStaticSetterPrefix( |
Send node, |
MethodElement getter, |
Element element, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new ClassStaticAccessor(this, getter.name, |
+ kernel.functionToIr(getter), null); |
+ return accessor.buildPrefixIncrement( |
+ new ir.Name(operator.selectorName), |
+ voidContext: isVoidContext); |
} |
- ir.InvalidExpression visitUnresolvedStaticSetterSetIfNull( |
+ ir.Expression visitUnresolvedStaticSetterSetIfNull( |
Send node, |
MethodElement getter, |
Element element, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new ClassStaticAccessor(this, getter.name, |
+ kernel.functionToIr(getter), null); |
+ return accessor.buildNullAwareAssignment( |
+ visitForValue(rhs), voidContext: isVoidContext); |
} |
- ir.InvalidExpression visitUnresolvedSuperBinary( |
+ ir.Expression visitUnresolvedSuperBinary( |
Send node, |
Element element, |
BinaryOperator operator, |
Node argument, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowNoSuchMethodError( |
+ kernel.getUnresolvedSuperMethodBuilder(), |
+ new ir.ThisExpression(), |
+ operator.selectorName, |
+ new ir.Arguments(<ir.Expression>[visitForValue(argument)])); |
} |
- ir.InvalidExpression visitUnresolvedSuperCompound( |
+ ir.Expression visitUnresolvedSuperCompound( |
Send node, |
Element element, |
AssignmentOperator operator, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSuperGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedSuperCompoundIndexSet( |
+ ir.Expression visitUnresolvedSuperCompoundIndexSet( |
Send node, |
Element element, |
Node index, |
AssignmentOperator operator, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new SuperIndexAccessor(this, visitForValue(index), |
+ kernel.functionToIr(element), null); |
+ return accessor.buildCompoundAssignment(new ir.Name(operator.selectorName), |
+ visitForValue(rhs)); |
} |
- ir.InvalidExpression visitUnresolvedSuperGet( |
+ ir.Expression visitUnresolvedSuperGet( |
Send node, |
Element element, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSuperGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedSuperGetterCompound( |
+ ir.Expression visitUnresolvedSuperGetterCompound( |
Send node, |
Element element, |
MethodElement setter, |
AssignmentOperator operator, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSuperGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedSuperGetterCompoundIndexSet( |
+ ir.Expression visitUnresolvedSuperGetterCompoundIndexSet( |
Send node, |
Element element, |
MethodElement setter, |
@@ -334,135 +413,148 @@ abstract class RastaUnresolved { |
AssignmentOperator operator, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSuperGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedSuperGetterIndexPostfix( |
+ ir.Expression visitUnresolvedSuperGetterIndexPostfix( |
Send node, |
Element element, |
MethodElement setter, |
Node index, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSuperGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedSuperGetterIndexPrefix( |
+ ir.Expression visitUnresolvedSuperGetterIndexPrefix( |
Send node, |
Element element, |
MethodElement setter, |
Node index, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSuperGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedSuperGetterPostfix( |
+ ir.Expression visitUnresolvedSuperGetterPostfix( |
Send node, |
Element element, |
MethodElement setter, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSuperGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedSuperGetterPrefix( |
+ ir.Expression visitUnresolvedSuperGetterPrefix( |
Send node, |
Element element, |
MethodElement setter, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSuperGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedSuperGetterSetIfNull( |
+ ir.Expression visitUnresolvedSuperGetterSetIfNull( |
Send node, |
Element element, |
MethodElement setter, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSuperGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedSuperIndex( |
+ ir.Expression visitUnresolvedSuperIndex( |
Send node, |
Element element, |
Node index, |
_) { |
- return handleUnresolved(node); |
+ return new SuperIndexAccessor(this, visitForValue(index), null, null) |
+ .buildSimpleRead(); |
} |
- ir.InvalidExpression visitUnresolvedSuperIndexPostfix( |
+ ir.Expression visitUnresolvedSuperIndexPostfix( |
Send node, |
Element element, |
Node index, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return new SuperIndexAccessor(this, visitForValue(index), null, null) |
+ .buildSimpleRead(); |
} |
- ir.InvalidExpression visitUnresolvedSuperIndexPrefix( |
+ ir.Expression visitUnresolvedSuperIndexPrefix( |
Send node, |
Element element, |
Node index, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return new SuperIndexAccessor(this, visitForValue(index), null, null) |
+ .buildSimpleRead(); |
} |
- ir.InvalidExpression visitUnresolvedSuperIndexSet( |
+ ir.Expression visitUnresolvedSuperIndexSet( |
Send node, |
Element element, |
Node index, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return new SuperIndexAccessor(this, visitForValue(index), null, null) |
+ .buildAssignment(visitForValue(rhs)); |
} |
- ir.InvalidExpression visitUnresolvedSuperInvoke( |
+ ir.Expression visitUnresolvedSuperInvoke( |
Send node, |
Element element, |
NodeList arguments, |
Selector selector, |
_) { |
- return handleUnresolved(node); |
+ // TODO(asgerf): Should really invoke 'super.noSuchMethod'. |
+ return buildThrowNoSuchMethodError( |
+ kernel.getUnresolvedSuperMethodBuilder(), |
+ new ir.ThisExpression(), |
+ '${node.selector}', |
+ buildArguments(arguments)); |
} |
- ir.InvalidExpression visitUnresolvedSuperPostfix( |
+ ir.Expression visitUnresolvedSuperPostfix( |
Send node, |
Element element, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSuperGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedSuperPrefix( |
+ ir.Expression visitUnresolvedSuperPrefix( |
Send node, |
Element element, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSuperGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedSuperSetIfNull( |
+ ir.Expression visitUnresolvedSuperSetIfNull( |
Send node, |
Element element, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSuperGetter('${node.selector}'); |
} |
- ir.InvalidExpression visitUnresolvedSuperSetterCompound( |
+ ir.Expression visitUnresolvedSuperSetterCompound( |
Send node, |
MethodElement getter, |
Element element, |
AssignmentOperator operator, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new SuperPropertyAccessor(this, '${node.selector}', |
+ kernel.functionToIr(getter), null); |
+ return accessor.buildCompoundAssignment( |
+ new ir.Name(operator.selectorName), |
+ visitForValue(rhs)); |
} |
- ir.InvalidExpression visitUnresolvedSuperSetterCompoundIndexSet( |
+ ir.Expression visitUnresolvedSuperSetterCompoundIndexSet( |
Send node, |
MethodElement getter, |
Element element, |
@@ -470,172 +562,219 @@ abstract class RastaUnresolved { |
AssignmentOperator operator, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new SuperIndexAccessor(this, visitForValue(index), |
+ kernel.functionToIr(getter), null); |
+ return accessor.buildCompoundAssignment( |
+ new ir.Name(operator.selectorName), |
+ visitForValue(rhs)); |
} |
- ir.InvalidExpression visitUnresolvedSuperSetterIndexPostfix( |
+ ir.Expression visitUnresolvedSuperSetterIndexPostfix( |
Send node, |
MethodElement indexFunction, |
Element element, |
Node index, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new SuperIndexAccessor(this, visitForValue(index), |
+ kernel.functionToIr(indexFunction), null); |
+ return accessor.buildPostfixIncrement(new ir.Name(operator.selectorName)); |
} |
- ir.InvalidExpression visitUnresolvedSuperSetterIndexPrefix( |
+ ir.Expression visitUnresolvedSuperSetterIndexPrefix( |
Send node, |
MethodElement indexFunction, |
Element element, |
Node index, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new SuperIndexAccessor(this, visitForValue(index), |
+ kernel.functionToIr(indexFunction), null); |
+ return accessor.buildPrefixIncrement(new ir.Name(operator.selectorName)); |
} |
- ir.InvalidExpression visitUnresolvedSuperSetterPostfix( |
+ ir.Expression visitUnresolvedSuperSetterPostfix( |
Send node, |
MethodElement getter, |
Element element, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new SuperPropertyAccessor(this, '${node.selector}', |
+ kernel.functionToIr(getter), null); |
+ return accessor.buildPostfixIncrement(new ir.Name(operator.selectorName)); |
} |
- ir.InvalidExpression visitUnresolvedSuperSetterPrefix( |
+ ir.Expression visitUnresolvedSuperSetterPrefix( |
Send node, |
MethodElement getter, |
Element element, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new SuperPropertyAccessor(this, '${node.selector}', |
+ kernel.functionToIr(getter), null); |
+ return accessor.buildPrefixIncrement(new ir.Name(operator.selectorName)); |
} |
- ir.InvalidExpression visitUnresolvedSuperSetterSetIfNull( |
+ ir.Expression visitUnresolvedSuperSetterSetIfNull( |
Send node, |
MethodElement getter, |
Element element, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new SuperPropertyAccessor(this, '${node.selector}', |
+ kernel.functionToIr(getter), null); |
+ return accessor.buildNullAwareAssignment(visitForValue(rhs)); |
} |
- ir.InvalidExpression visitUnresolvedSuperUnary( |
+ ir.Expression visitUnresolvedSuperUnary( |
Send node, |
UnaryOperator operator, |
Element element, |
_) { |
- return handleUnresolved(node); |
+ // TODO(asgerf): Should really call 'super.noSuchMethod'. |
+ return buildThrowNoSuchMethodError( |
+ kernel.getUnresolvedSuperMethodBuilder(), |
+ new ir.ThisExpression(), |
+ operator.selectorName, |
+ new ir.Arguments.empty()); |
} |
- ir.InvalidExpression visitUnresolvedTopLevelGetterCompound( |
+ ir.Expression visitUnresolvedTopLevelGetterCompound( |
Send node, |
Element element, |
MethodElement setter, |
AssignmentOperator operator, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedGetter('${node.selector}', |
+ kernel.getUnresolvedTopLevelGetterBuilder()); |
} |
- ir.InvalidExpression visitUnresolvedTopLevelGetterPostfix( |
+ ir.Expression visitUnresolvedTopLevelGetterPostfix( |
Send node, |
Element element, |
MethodElement setter, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedGetter('${node.selector}', |
+ kernel.getUnresolvedTopLevelGetterBuilder()); |
} |
- ir.InvalidExpression visitUnresolvedTopLevelGetterPrefix( |
+ ir.Expression visitUnresolvedTopLevelGetterPrefix( |
Send node, |
Element element, |
MethodElement setter, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedGetter('${node.selector}', |
+ kernel.getUnresolvedTopLevelGetterBuilder()); |
} |
- ir.InvalidExpression visitUnresolvedTopLevelGetterSetIfNull( |
+ ir.Expression visitUnresolvedTopLevelGetterSetIfNull( |
Send node, |
Element element, |
MethodElement setter, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedGetter('${node.selector}', |
+ kernel.getUnresolvedTopLevelGetterBuilder()); |
} |
- ir.InvalidExpression visitUnresolvedTopLevelSetterCompound( |
+ ir.Expression visitUnresolvedTopLevelSetterCompound( |
Send node, |
MethodElement getter, |
Element element, |
AssignmentOperator operator, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new TopLevelStaticAccessor(this, getter.name, |
+ kernel.functionToIr(getter), null); |
+ return accessor.buildCompoundAssignment( |
+ new ir.Name(operator.selectorName), |
+ visitForValue(rhs), |
+ voidContext: isVoidContext); |
} |
- ir.InvalidExpression visitUnresolvedTopLevelSetterPostfix( |
+ ir.Expression visitUnresolvedTopLevelSetterPostfix( |
Send node, |
MethodElement getter, |
Element element, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new TopLevelStaticAccessor(this, getter.name, |
+ kernel.functionToIr(getter), null); |
+ return accessor.buildPostfixIncrement( |
+ new ir.Name(operator.selectorName), |
+ voidContext: isVoidContext); |
} |
- ir.InvalidExpression visitUnresolvedTopLevelSetterPrefix( |
+ ir.Expression visitUnresolvedTopLevelSetterPrefix( |
Send node, |
MethodElement getter, |
Element element, |
IncDecOperator operator, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new TopLevelStaticAccessor(this, getter.name, |
+ kernel.functionToIr(getter), null); |
+ return accessor.buildPrefixIncrement( |
+ new ir.Name(operator.selectorName), |
+ voidContext: isVoidContext); |
} |
- ir.InvalidExpression visitUnresolvedTopLevelSetterSetIfNull( |
+ ir.Expression visitUnresolvedTopLevelSetterSetIfNull( |
Send node, |
MethodElement getter, |
Element element, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new TopLevelStaticAccessor(this, getter.name, |
+ kernel.functionToIr(getter), null); |
+ return accessor.buildNullAwareAssignment( |
+ visitForValue(rhs), |
+ voidContext: isVoidContext); |
} |
- ir.InvalidExpression visitUnresolvedSuperGetterIndexSetIfNull( |
+ ir.Expression visitUnresolvedSuperGetterIndexSetIfNull( |
Send node, |
Element element, |
MethodElement setter, |
Node index, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new SuperIndexAccessor(this, visitForValue(index), |
+ null, kernel.functionToIr(setter)); |
+ return accessor.buildNullAwareAssignment(visitForValue(rhs)); |
} |
- ir.InvalidExpression visitUnresolvedSuperSetterIndexSetIfNull( |
+ ir.Expression visitUnresolvedSuperSetterIndexSetIfNull( |
Send node, |
MethodElement getter, |
Element element, |
Node index, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ var accessor = new SuperIndexAccessor(this, visitForValue(index), |
+ kernel.functionToIr(getter), null); |
+ return accessor.buildNullAwareAssignment(visitForValue(rhs)); |
} |
- ir.InvalidExpression visitUnresolvedSuperIndexSetIfNull( |
+ ir.Expression visitUnresolvedSuperIndexSetIfNull( |
Send node, |
Element element, |
Node index, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ var accessor = |
+ new SuperIndexAccessor(this, visitForValue(index), null, null); |
+ return accessor.buildNullAwareAssignment(visitForValue(rhs)); |
} |
- ir.InvalidExpression visitUnresolvedSuperSet( |
+ ir.Expression visitUnresolvedSuperSet( |
Send node, |
Element element, |
Node rhs, |
_) { |
- return handleUnresolved(node); |
+ return buildThrowUnresolvedSuperSetter('${node.selector}', |
+ visitForValue(rhs)); |
} |
} |