Chromium Code Reviews| Index: pkg/kernel/lib/transformations/reify/transformation/transformer.dart |
| diff --git a/pkg/kernel/lib/transformations/reify/transformation/transformer.dart b/pkg/kernel/lib/transformations/reify/transformation/transformer.dart |
| index 867248510fc833bc62779501b704cf075f34d517..43e8f3db2ba07edc9a7935da5a54a733bda89d67 100644 |
| --- a/pkg/kernel/lib/transformations/reify/transformation/transformer.dart |
| +++ b/pkg/kernel/lib/transformations/reify/transformation/transformer.dart |
| @@ -103,6 +103,8 @@ class ReifyVisitor extends Transformer with DebugTrace { |
| // TODO(karlklose): find a way to get rid of this state in the visitor. |
| TransformationContext context; |
| + String get genericMethodTypeParametersName => "\$typeParameters"; |
|
karlklose
2017/02/24 12:07:23
This could also be a constant.
Dmitry Stefantsov
2017/02/28 11:32:15
Done.
|
| + |
| bool libraryShouldBeTransformed(Library library) { |
| return libraryToTransform == null || libraryToTransform == library; |
| } |
| @@ -180,6 +182,9 @@ class ReifyVisitor extends Transformer with DebugTrace { |
| // Intercept calls to factories of classes we do not transform |
| return interceptInstantiation(invocation, target); |
| } |
| + |
| + addTypeArgumentToGenericInvocation(invocation); |
| + |
| return invocation; |
| } |
| @@ -419,6 +424,8 @@ class ReifyVisitor extends Transformer with DebugTrace { |
| FunctionNode visitFunctionNode(FunctionNode node) { |
| trace(node); |
| + addTypeArgumentToGenericDeclaration(node); |
| + |
| // If we have a [TransformationContext] with a runtime type field and we |
| // translate a constructor or factory, we need a parameter that the code of |
| // initializers or the factory body can use to access type arguments. |
| @@ -572,4 +579,30 @@ class ReifyVisitor extends Transformer with DebugTrace { |
| new InterfaceType(builder.coreTypes.mapClass, |
| <DartType>[node.keyType, node.valueType])); |
| } |
| + |
| + Expression visitMethodInvocation(MethodInvocation node) { |
| + node.transformChildren(this); |
| + addTypeArgumentToGenericInvocation(node); |
| + return node; |
| + } |
| + |
| + void addTypeArgumentToGenericInvocation(InvocationExpression expression) { |
| + if (expression.arguments.types.length > 0) { |
| + ListLiteral genericMethodTypeParameters = new ListLiteral(new List.from( |
|
karlklose
2017/02/24 12:07:23
You could also call '.toList(growable: false)' on
Dmitry Stefantsov
2017/02/28 11:32:15
Done.
|
| + expression.arguments.types |
| + .map((DartType type) => createRuntimeType(type))), |
|
karlklose
2017/02/24 12:07:23
How about
.map(createRuntimeType)
?
Dmitry Stefantsov
2017/02/28 11:32:15
Sure! :)
|
| + typeArgument: rtiLibrary.typeType); |
| + expression.arguments.named.add(new NamedExpression( |
| + genericMethodTypeParametersName, genericMethodTypeParameters)..parent = expression.arguments); |
|
karlklose
2017/02/24 12:07:23
Long line, break before '..'. You could also run d
Dmitry Stefantsov
2017/02/28 11:32:15
Done.
|
| + } |
| + } |
| + |
| + void addTypeArgumentToGenericDeclaration(FunctionNode node) { |
| + VariableDeclaration genericMethodTypeParameters = new VariableDeclaration( |
| + genericMethodTypeParametersName, |
| + type: new InterfaceType( |
|
karlklose
2017/02/24 12:07:23
Not sure we need this type, but feel free to keep
Dmitry Stefantsov
2017/02/28 11:32:15
OK
|
| + builder.coreTypes.listClass, <DartType>[rtiLibrary.typeType])); |
| + genericMethodTypeParameters.parent = node; |
| + node.namedParameters.insert(0, genericMethodTypeParameters); |
| + } |
| } |