Index: pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart |
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart |
index dedff76507627ac406cea759de645d2cc208a723..215cf3ae74021c00eb6d418bf3115a24631acb35 100644 |
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart |
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart |
@@ -268,6 +268,26 @@ class InvokeConstructor extends Expression implements Invoke { |
} |
} |
+/// Call a method using a one-shot interceptor. |
+/// |
+/// There is no explicit receiver, the first argument serves that purpose. |
+class OneShotInterceptor extends Expression implements Invoke { |
+ final Selector selector; |
+ final TypeMask mask; |
+ final List<Expression> arguments; |
+ final SourceInformation sourceInformation; |
+ |
+ OneShotInterceptor(this.selector, |
+ this.mask, |
+ this.arguments, |
+ this.sourceInformation); |
+ |
+ accept(ExpressionVisitor visitor) => visitor.visitOneShotInterceptor(this); |
+ accept1(ExpressionVisitor1 visitor, arg) { |
+ return visitor.visitOneShotInterceptor(this, arg); |
+ } |
+} |
+ |
/** |
* A constant. |
*/ |
@@ -993,6 +1013,7 @@ abstract class ExpressionVisitor<E> { |
E visitInvokeMethod(InvokeMethod node); |
E visitInvokeMethodDirectly(InvokeMethodDirectly node); |
E visitInvokeConstructor(InvokeConstructor node); |
+ E visitOneShotInterceptor(OneShotInterceptor node); |
E visitConstant(Constant node); |
E visitThis(This node); |
E visitConditional(Conditional node); |
@@ -1030,6 +1051,7 @@ abstract class ExpressionVisitor1<E, A> { |
E visitInvokeMethod(InvokeMethod node, A arg); |
E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg); |
E visitInvokeConstructor(InvokeConstructor node, A arg); |
+ E visitOneShotInterceptor(OneShotInterceptor node, A arg); |
E visitConstant(Constant node, A arg); |
E visitThis(This node, A arg); |
E visitConditional(Conditional node, A arg); |
@@ -1130,6 +1152,10 @@ abstract class RecursiveVisitor implements StatementVisitor, ExpressionVisitor { |
node.arguments.forEach(visitExpression); |
} |
+ visitOneShotInterceptor(OneShotInterceptor node) { |
+ node.arguments.forEach(visitExpression); |
+ } |
+ |
visitConstant(Constant node) {} |
visitThis(This node) {} |
@@ -1357,6 +1383,11 @@ class RecursiveTransformer extends Transformer { |
return node; |
} |
+ visitOneShotInterceptor(OneShotInterceptor node) { |
+ _replaceExpressions(node.arguments); |
+ return node; |
+ } |
+ |
visitConstant(Constant node) => node; |
visitThis(This node) => node; |