| 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 005d082a64508840d91d5a5734295344b5c21245..b3d6851078f75f49acf7938e9f454feac793d62c 100644
|
| --- a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
|
| +++ b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
|
| @@ -6,7 +6,7 @@ library tree_ir_nodes;
|
|
|
| import '../constants/expressions.dart';
|
| import '../constants/values.dart' as values;
|
| -import '../dart_types.dart' show DartType, GenericType, TypeVariableType;
|
| +import '../dart_types.dart' show DartType, GenericType, InterfaceType, TypeVariableType;
|
| import '../elements/elements.dart';
|
| import '../io/source_information.dart' show SourceInformation;
|
| import '../universe/universe.dart';
|
| @@ -216,17 +216,21 @@ class InvokeConstructor extends Expression implements Invoke {
|
| final DartType type;
|
| final FunctionElement target;
|
| final List<Expression> arguments;
|
| + final List<Expression> typeArguments;
|
| final Selector selector;
|
| /// TODO(karlklose): get rid of this field. Instead use the constant's
|
| /// expression to find the constructor to be called in dart2dart.
|
| final values.ConstantValue constant;
|
|
|
| InvokeConstructor(this.type, this.target, this.selector, this.arguments,
|
| - [this.constant]);
|
| + this.typeArguments, [this.constant]);
|
|
|
| ClassElement get targetClass => target.enclosingElement;
|
|
|
| - accept(ExpressionVisitor visitor) => visitor.visitInvokeConstructor(this);
|
| + accept(ExpressionVisitor visitor) {
|
| + return visitor.visitInvokeConstructor(this);
|
| + }
|
| +
|
| accept1(ExpressionVisitor1 visitor, arg) {
|
| return visitor.visitInvokeConstructor(this, arg);
|
| }
|
| @@ -792,6 +796,23 @@ class ReadTypeVariable extends Expression implements JsSpecificNode {
|
| }
|
| }
|
|
|
| +/// Denotes the internal representation of [dartType], where all type variables
|
| +/// are replaced by the values in [arguments].
|
| +class TypeExpression extends Expression {
|
| + final DartType dartType;
|
| + final List<Expression> arguments;
|
| +
|
| + TypeExpression(this.dartType, this.arguments);
|
| +
|
| + accept(ExpressionVisitor visitor) {
|
| + return visitor.visitTypeExpression(this);
|
| + }
|
| +
|
| + accept1(ExpressionVisitor1 visitor, arg) {
|
| + return visitor.visitTypeExpression(this, arg);
|
| + }
|
| +}
|
| +
|
| abstract class ExpressionVisitor<E> {
|
| E visitExpression(Expression e) => e.accept(this);
|
| E visitVariableUse(VariableUse node);
|
| @@ -817,6 +838,7 @@ abstract class ExpressionVisitor<E> {
|
| E visitCreateInstance(CreateInstance node);
|
| E visitReifyRuntimeType(ReifyRuntimeType node);
|
| E visitReadTypeVariable(ReadTypeVariable node);
|
| + E visitTypeExpression(TypeExpression node);
|
| }
|
|
|
| abstract class ExpressionVisitor1<E, A> {
|
| @@ -842,8 +864,9 @@ abstract class ExpressionVisitor1<E, A> {
|
| E visitGetField(GetField node, A arg);
|
| E visitCreateBox(CreateBox node, A arg);
|
| E visitCreateInstance(CreateInstance node, A arg);
|
| - E visitReifyRuntimeType(ReifyRuntimeType reifyRuntimeType, A arg);
|
| - E visitReadTypeVariable(ReadTypeVariable readTypeVariable, A arg);
|
| + E visitReifyRuntimeType(ReifyRuntimeType node, A arg);
|
| + E visitReadTypeVariable(ReadTypeVariable node, A arg);
|
| + E visitTypeExpression(TypeExpression node, A arg);
|
| }
|
|
|
| abstract class StatementVisitor<S> {
|
| @@ -1074,4 +1097,9 @@ class RecursiveVisitor extends Visitor {
|
| visitReadTypeVariable(ReadTypeVariable node) {
|
| visitExpression(node.target);
|
| }
|
| +
|
| + @override
|
| + visitTypeExpression(TypeExpression node) {
|
| + node.arguments.forEach(visitExpression);
|
| + }
|
| }
|
|
|