Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1120)

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart

Issue 2916533003: Set return type of factory constructors properly. (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library fasta.kernel_procedure_builder; 5 library fasta.kernel_procedure_builder;
6 6
7 import 'package:kernel/ast.dart' 7 import 'package:kernel/ast.dart'
8 show 8 show
9 Arguments, 9 Arguments,
10 AsyncMarker, 10 AsyncMarker,
11 Class,
11 Constructor, 12 Constructor,
12 ConstructorInvocation, 13 ConstructorInvocation,
13 DartType, 14 DartType,
14 DynamicType, 15 DynamicType,
15 EmptyStatement, 16 EmptyStatement,
16 Expression, 17 Expression,
17 FunctionNode, 18 FunctionNode,
18 Initializer, 19 Initializer,
19 LocalInitializer, 20 LocalInitializer,
20 Member, 21 Member,
21 Name, 22 Name,
22 NamedExpression, 23 NamedExpression,
23 Procedure, 24 Procedure,
24 ProcedureKind, 25 ProcedureKind,
25 RedirectingInitializer, 26 RedirectingInitializer,
26 Statement, 27 Statement,
27 StaticInvocation, 28 StaticInvocation,
28 StringLiteral, 29 StringLiteral,
29 SuperInitializer, 30 SuperInitializer,
30 TypeParameter, 31 TypeParameter,
32 TypeParameterType,
31 VariableDeclaration, 33 VariableDeclaration,
32 VariableGet, 34 VariableGet,
33 VoidType, 35 VoidType,
34 setParents; 36 setParents;
35 37
36 import 'package:kernel/type_algebra.dart' show containsTypeVariable, substitute; 38 import 'package:kernel/type_algebra.dart'
39 show Substitution, containsTypeVariable, substitute;
37 40
38 import '../errors.dart' show internalError; 41 import '../errors.dart' show internalError;
39 42
40 import '../messages.dart' show warning; 43 import '../messages.dart' show warning;
41 44
42 import '../loader.dart' show Loader; 45 import '../loader.dart' show Loader;
43 46
44 import 'kernel_builder.dart' 47 import 'kernel_builder.dart'
45 show 48 show
46 Builder, 49 Builder,
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 if (formal.isRequired) { 118 if (formal.isRequired) {
116 result.requiredParameterCount++; 119 result.requiredParameterCount++;
117 } 120 }
118 } 121 }
119 } 122 }
120 if (returnType != null) { 123 if (returnType != null) {
121 result.returnType = returnType.build(library); 124 result.returnType = returnType.build(library);
122 } 125 }
123 if (!isConstructor && !isInstanceMember && parent is ClassBuilder) { 126 if (!isConstructor && !isInstanceMember && parent is ClassBuilder) {
124 List<TypeParameter> typeParameters = parent.target.typeParameters; 127 List<TypeParameter> typeParameters = parent.target.typeParameters;
128 if (kind == ProcedureKind.Factory) {
ahe 2017/06/01 09:10:08 This I have a different solution for.
129 Class class_ = parent.target;
130 if (typeParameters.isEmpty) {
131 result.returnType = class_.thisType;
132 } else {
133 // Factory constructors get their own copy of type parameters, so we
134 // have to substitute.
135 result.returnType = Substitution
136 .fromPairs(
137 class_.typeParameters,
138 result.typeParameters
139 .map((p) => new TypeParameterType(p))
140 .toList())
141 .substituteType(class_.thisType);
142 }
143 }
125 if (typeParameters.isNotEmpty) { 144 if (typeParameters.isNotEmpty) {
126 Map<TypeParameter, DartType> substitution; 145 Map<TypeParameter, DartType> substitution;
127 DartType removeTypeVariables(DartType type) { 146 DartType removeTypeVariables(DartType type) {
128 if (substitution == null) { 147 if (substitution == null) {
129 substitution = <TypeParameter, DartType>{}; 148 substitution = <TypeParameter, DartType>{};
130 for (TypeParameter parameter in typeParameters) { 149 for (TypeParameter parameter in typeParameters) {
131 substitution[parameter] = const DynamicType(); 150 substitution[parameter] = const DynamicType();
132 } 151 }
133 } 152 }
134 warning(fileUri, charOffset, 153 warning(fileUri, charOffset,
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 } 381 }
363 } 382 }
364 initializers.add(initializer..parent = constructor); 383 initializers.add(initializer..parent = constructor);
365 initializers.add(superInitializer); 384 initializers.add(superInitializer);
366 return; 385 return;
367 } 386 }
368 initializers.add(initializer); 387 initializers.add(initializer);
369 initializer.parent = constructor; 388 initializer.parent = constructor;
370 } 389 }
371 } 390 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698