Skip to content

Commit 0e24437

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Replace InterfaceType with Substitution in Member(s).
I ran it in google3: https://test.corp.google.com/ui#id=OCL:261214112:BASE:261244079:1564722983792:f6286cfb Change-Id: I820d2dbbaefe495c20b0d8fe3f7c54f1766d5689 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/111383 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 6578435 commit 0e24437

File tree

21 files changed

+844
-483
lines changed

21 files changed

+844
-483
lines changed

pkg/analyzer/lib/src/dart/element/member.dart

Lines changed: 182 additions & 127 deletions
Large diffs are not rendered by default.

pkg/analyzer/lib/src/dart/element/type.dart

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:analyzer/dart/element/element.dart';
99
import 'package:analyzer/dart/element/type.dart';
1010
import 'package:analyzer/src/dart/element/element.dart';
1111
import 'package:analyzer/src/dart/element/member.dart';
12+
import 'package:analyzer/src/dart/element/type_algebra.dart';
1213
import 'package:analyzer/src/generated/engine.dart'
1314
show AnalysisContext, AnalysisEngine;
1415
import 'package:analyzer/src/generated/resolver.dart';
@@ -1164,6 +1165,14 @@ abstract class FunctionTypeImpl extends TypeImpl implements FunctionType {
11641165
TypeParameterElement formal2, TypeParameterElement formal1)) {
11651166
List<TypeParameterElement> params1 = f1.typeFormals;
11661167
List<TypeParameterElement> params2 = f2.typeFormals;
1168+
return relateTypeFormals2(params1, params2, relation);
1169+
}
1170+
1171+
static List<DartType> relateTypeFormals2(
1172+
List<TypeParameterElement> params1,
1173+
List<TypeParameterElement> params2,
1174+
bool relation(DartType bound2, DartType bound1,
1175+
TypeParameterElement formal2, TypeParameterElement formal1)) {
11671176
int count = params1.length;
11681177
if (params2.length != count) {
11691178
return null;
@@ -3299,6 +3308,8 @@ class _FunctionTypeImplLazy extends FunctionTypeImpl {
32993308

33003309
@override
33013310
List<ParameterElement> get parameters {
3311+
var substitution = Substitution.fromPairs(typeParameters, typeArguments);
3312+
33023313
List<ParameterElement> baseParameters = this.baseParameters;
33033314
// no parameters, quick return
33043315
int parameterCount = baseParameters.length;
@@ -3322,7 +3333,8 @@ class _FunctionTypeImplLazy extends FunctionTypeImpl {
33223333

33233334
if (parameter is FieldFormalParameterElement) {
33243335
// TODO(jmesserly): this seems like it won't handle pruning correctly.
3325-
specializedParams[i] = new FieldFormalParameterMember(parameter, this);
3336+
specializedParams[i] =
3337+
new FieldFormalParameterMember(parameter, substitution);
33263338
continue;
33273339
}
33283340
var baseType = parameter.type as TypeImpl;
@@ -3336,7 +3348,7 @@ class _FunctionTypeImplLazy extends FunctionTypeImpl {
33363348

33373349
specializedParams[i] = identical(type, baseType)
33383350
? parameter
3339-
: new ParameterMember(parameter, this, type);
3351+
: new ParameterMember(parameter, substitution, type);
33403352
}
33413353
return specializedParams;
33423354
}
@@ -3622,7 +3634,8 @@ class _FunctionTypeImplStrict extends FunctionTypeImpl {
36223634
p.name,
36233635
newType,
36243636
// ignore: deprecated_member_use_from_same_package
3625-
p.parameterKind);
3637+
p.parameterKind)
3638+
..isExplicitlyCovariant = p.isCovariant;
36263639
}
36273640

36283641
return new _FunctionTypeImplStrict._(

pkg/analyzer/lib/src/dart/element/type_algebra.dart

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,33 @@ abstract class Substitution {
8989

9090
const Substitution();
9191

92+
/// Return the substitution as a single map.
93+
///
94+
/// Throw [StateError] if this is not possible.
95+
Map<TypeParameterElement, DartType> get asMap {
96+
throw StateError('$runtimeType cannot be represented as a Map.');
97+
}
98+
9299
DartType getSubstitute(TypeParameterElement parameter, bool upperBound);
93100

94101
DartType substituteType(DartType type, {bool contravariant: false}) {
95102
return new _TopSubstitutor(this, contravariant).visit(type);
96103
}
97104

105+
/// Substitutes both variables from [first] and [second], favoring those from
106+
/// [first] if they overlap.
107+
///
108+
/// Neither substitution is applied to the results of the other, so this does
109+
/// *not* correspond to a sequence of two substitutions. For example,
110+
/// combining `{T -> List<G>}` with `{G -> String}` does not correspond to
111+
/// `{T -> List<String>}` because the result from substituting `T` is not
112+
/// searched for occurrences of `G`.
113+
static Substitution combine(Substitution first, Substitution second) {
114+
if (first == _NullSubstitution.instance) return second;
115+
if (second == _NullSubstitution.instance) return first;
116+
return new _CombinedSubstitution(first, second);
117+
}
118+
98119
/// Substitutes the type parameters on the class of [type] with the
99120
/// type arguments provided in [type].
100121
static Substitution fromInterfaceType(InterfaceType type) {
@@ -151,6 +172,19 @@ abstract class Substitution {
151172
}
152173
}
153174

175+
class _CombinedSubstitution extends Substitution {
176+
final Substitution first;
177+
final Substitution second;
178+
179+
_CombinedSubstitution(this.first, this.second);
180+
181+
@override
182+
DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
183+
return first.getSubstitute(parameter, upperBound) ??
184+
second.getSubstitute(parameter, upperBound);
185+
}
186+
}
187+
154188
class _FreshTypeParametersSubstitutor extends _TypeSubstitutor {
155189
final Map<TypeParameterElement, DartType> substitution = {};
156190

@@ -178,22 +212,36 @@ class _MapSubstitution extends Substitution {
178212

179213
_MapSubstitution(this.upper, this.lower);
180214

215+
@override
216+
Map<TypeParameterElement, DartType> get asMap {
217+
return upper;
218+
}
219+
181220
DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
182221
return upperBound ? upper[parameter] : lower[parameter];
183222
}
223+
224+
@override
225+
String toString() => '_MapSubstitution($upper, $lower)';
184226
}
185227

186228
class _NullSubstitution extends Substitution {
187229
static const _NullSubstitution instance = const _NullSubstitution();
188230

189231
const _NullSubstitution();
190232

233+
@override
234+
Map<TypeParameterElement, DartType> get asMap => const {};
235+
191236
DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
192237
return new TypeParameterTypeImpl(parameter);
193238
}
194239

195240
@override
196241
DartType substituteType(DartType type, {bool contravariant: false}) => type;
242+
243+
@override
244+
String toString() => "Substitution.empty";
197245
}
198246

199247
class _TopSubstitutor extends _TypeSubstitutor {
@@ -307,12 +355,7 @@ abstract class _TypeSubstitutor extends DartTypeVisitor<DartType> {
307355

308356
var parameters = type.parameters.map((parameter) {
309357
var type = inner.visit(parameter.type);
310-
return ParameterElementImpl.synthetic(
311-
parameter.name,
312-
type,
313-
// ignore: deprecated_member_use_from_same_package
314-
parameter.parameterKind,
315-
);
358+
return _parameterElement(parameter, type);
316359
}).toList();
317360

318361
inner.invertVariance();
@@ -349,12 +392,7 @@ abstract class _TypeSubstitutor extends DartTypeVisitor<DartType> {
349392

350393
var parameters = type.parameters.map((parameter) {
351394
var type = inner.visit(parameter.type);
352-
return ParameterElementImpl.synthetic(
353-
parameter.name,
354-
type,
355-
// ignore: deprecated_member_use_from_same_package
356-
parameter.parameterKind,
357-
);
395+
return _parameterElement(parameter, type);
358396
}).toList();
359397

360398
inner.invertVariance();
@@ -412,4 +450,18 @@ abstract class _TypeSubstitutor extends DartTypeVisitor<DartType> {
412450

413451
@override
414452
DartType visitVoidType(VoidType type) => type;
453+
454+
static ParameterElementImpl _parameterElement(
455+
ParameterElement parameter,
456+
DartType type,
457+
) {
458+
var result = ParameterElementImpl.synthetic(
459+
parameter.name,
460+
type,
461+
// ignore: deprecated_member_use_from_same_package
462+
parameter.parameterKind,
463+
);
464+
result.isExplicitlyCovariant = parameter.isCovariant;
465+
return result;
466+
}
415467
}

0 commit comments

Comments
 (0)