Chromium Code Reviews| Index: pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart |
| diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart |
| index 210e5a11886da11fda5cb602790742f26eeabbcf..69f9ef377e0c17fa4f8c3f137bb4571d828c5a3b 100644 |
| --- a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart |
| +++ b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart |
| @@ -8,6 +8,7 @@ import 'package:kernel/ast.dart' |
| show |
| Arguments, |
| AsyncMarker, |
| + Class, |
| Constructor, |
| ConstructorInvocation, |
| DartType, |
| @@ -28,12 +29,14 @@ import 'package:kernel/ast.dart' |
| StringLiteral, |
| SuperInitializer, |
| TypeParameter, |
| + TypeParameterType, |
| VariableDeclaration, |
| VariableGet, |
| VoidType, |
| setParents; |
| -import 'package:kernel/type_algebra.dart' show containsTypeVariable, substitute; |
| +import 'package:kernel/type_algebra.dart' |
| + show Substitution, containsTypeVariable, substitute; |
| import '../errors.dart' show internalError; |
| @@ -122,6 +125,22 @@ abstract class KernelFunctionBuilder |
| } |
| if (!isConstructor && !isInstanceMember && parent is ClassBuilder) { |
| List<TypeParameter> typeParameters = parent.target.typeParameters; |
| + if (kind == ProcedureKind.Factory) { |
|
ahe
2017/06/01 09:10:08
This I have a different solution for.
|
| + Class class_ = parent.target; |
| + if (typeParameters.isEmpty) { |
| + result.returnType = class_.thisType; |
| + } else { |
| + // Factory constructors get their own copy of type parameters, so we |
| + // have to substitute. |
| + result.returnType = Substitution |
| + .fromPairs( |
| + class_.typeParameters, |
| + result.typeParameters |
| + .map((p) => new TypeParameterType(p)) |
| + .toList()) |
| + .substituteType(class_.thisType); |
| + } |
| + } |
| if (typeParameters.isNotEmpty) { |
| Map<TypeParameter, DartType> substitution; |
| DartType removeTypeVariables(DartType type) { |