Skip to content

Commit 1ed1e83

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Migrate TopMergeHelper.
Change-Id: I7f70d8ac6f82d8d66ddac8293010b9b3dea5c147 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/405566 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Phil Quitslund <[email protected]>
1 parent f45bf77 commit 1ed1e83

File tree

5 files changed

+87
-40
lines changed

5 files changed

+87
-40
lines changed

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

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import 'package:_fe_analyzer_shared/src/type_inference/type_analyzer_operations.dart'
88
show Variance;
99
import 'package:analyzer/dart/element/element.dart';
10+
import 'package:analyzer/dart/element/element2.dart';
1011
import 'package:analyzer/dart/element/nullability_suffix.dart';
1112
import 'package:analyzer/dart/element/type.dart';
1213
import 'package:analyzer/src/dart/element/element.dart';
@@ -197,7 +198,7 @@ class ElementDisplayStringBuilder {
197198

198199
_writeType(type.returnType);
199200
_write(' Function');
200-
_writeTypeParameters(type.typeFormals);
201+
_writeTypeParameters2(type.typeParameters);
201202
_writeFormalParameters(type.parameters, forElement: false);
202203
_writeNullability(type.nullabilitySuffix);
203204
}
@@ -369,6 +370,24 @@ class ElementDisplayStringBuilder {
369370
}
370371
}
371372

373+
void writeTypeParameter2(TypeParameterElement2 element) {
374+
if (element is TypeParameterElementImpl2) {
375+
var variance = element.variance;
376+
if (!element.isLegacyCovariant && variance != Variance.unrelated) {
377+
_write(variance.keyword);
378+
_write(' ');
379+
}
380+
}
381+
382+
_write(element.displayName);
383+
384+
var bound = element.bound;
385+
if (bound != null) {
386+
_write(' extends ');
387+
_writeType(bound);
388+
}
389+
}
390+
372391
void writeTypeParameterType(TypeParameterTypeImpl type) {
373392
var promotedBound = type.promotedBound;
374393
if (promotedBound != null) {
@@ -544,6 +563,19 @@ class ElementDisplayStringBuilder {
544563
_write('>');
545564
}
546565

566+
void _writeTypeParameters2(List<TypeParameterElement2> elements) {
567+
if (elements.isEmpty) return;
568+
569+
_write('<');
570+
for (var i = 0; i < elements.length; i++) {
571+
if (i != 0) {
572+
_write(', ');
573+
}
574+
(elements[i] as TypeParameterElementImpl2).appendTo(this);
575+
}
576+
_write('>');
577+
}
578+
547579
void _writeTypes(List<DartType> types) {
548580
for (var i = 0; i < types.length; i++) {
549581
if (i != 0) {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11489,6 +11489,11 @@ class TypeParameterElementImpl2 extends TypeDefiningElementImpl2
1148911489
return visitor.visitTypeParameterElement(this);
1149011490
}
1149111491

11492+
@override
11493+
void appendTo(ElementDisplayStringBuilder builder) {
11494+
builder.writeTypeParameter2(this);
11495+
}
11496+
1149211497
@override
1149311498
TypeParameterType instantiate({
1149411499
required NullabilitySuffix nullabilitySuffix,

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

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// ignore_for_file: analyzer_use_new_elements
6-
7-
import 'package:analyzer/dart/element/element.dart';
5+
import 'package:analyzer/dart/element/element2.dart';
86
import 'package:analyzer/dart/element/nullability_suffix.dart';
97
import 'package:analyzer/dart/element/type.dart';
108
import 'package:analyzer/src/dart/element/element.dart';
@@ -14,6 +12,7 @@ import 'package:analyzer/src/dart/element/type_algebra.dart';
1412
import 'package:analyzer/src/dart/element/type_system.dart';
1513
import 'package:analyzer/src/generated/utilities_dart.dart';
1614
import 'package:analyzer/src/utilities/extensions/collection.dart';
15+
import 'package:analyzer/src/utilities/extensions/element.dart';
1716

1817
class TopMergeHelper {
1918
final TypeSystemImpl typeSystem;
@@ -120,7 +119,7 @@ class TopMergeHelper {
120119
}
121120

122121
if (T is TypeParameterType && S is TypeParameterType) {
123-
if (T.element == S.element) {
122+
if (T.element3 == S.element3) {
124123
return T;
125124
} else {
126125
throw _TopMergeStateError(T, S, 'Not the same type parameters');
@@ -131,13 +130,13 @@ class TopMergeHelper {
131130
}
132131

133132
FunctionTypeImpl _functionTypes(FunctionType T, FunctionType S) {
134-
var T_typeParameters = T.typeFormals;
135-
var S_typeParameters = S.typeFormals;
133+
var T_typeParameters = T.typeParameters;
134+
var S_typeParameters = S.typeParameters;
136135
if (T_typeParameters.length != S_typeParameters.length) {
137136
throw _TopMergeStateError(T, S, 'Different number of type parameters');
138137
}
139138

140-
List<TypeParameterElement> R_typeParameters;
139+
List<TypeParameterElement2> R_typeParameters;
141140
Substitution? T_Substitution;
142141
Substitution? S_Substitution;
143142

@@ -161,18 +160,18 @@ class TopMergeHelper {
161160
T_Substitution = mergedTypeParameters.aSubstitution;
162161
S_Substitution = mergedTypeParameters.bSubstitution;
163162
} else {
164-
R_typeParameters = const <TypeParameterElement>[];
163+
R_typeParameters = const <TypeParameterElement2>[];
165164
}
166165

167166
var R_returnType = mergeTypes(T.returnType, S.returnType);
168167

169-
var T_parameters = T.parameters;
170-
var S_parameters = S.parameters;
168+
var T_parameters = T.formalParameters;
169+
var S_parameters = S.formalParameters;
171170
if (T_parameters.length != S_parameters.length) {
172171
throw _TopMergeStateError(T, S, 'Different number of formal parameters');
173172
}
174173

175-
var R_parameters = <ParameterElementImpl>[];
174+
var R_parameters = <FormalParameterElementImpl>[];
176175
for (var i = 0; i < T_parameters.length; i++) {
177176
var T_parameter = T_parameters[i];
178177
var S_parameter = S_parameters[i];
@@ -182,7 +181,7 @@ class TopMergeHelper {
182181
throw _TopMergeStateError(T, S, 'Different formal parameter kinds');
183182
}
184183

185-
if (T_parameter.isNamed && T_parameter.name != S_parameter.name) {
184+
if (T_parameter.isNamed && T_parameter.name3 != S_parameter.name3) {
186185
throw _TopMergeStateError(T, S, 'Different named parameter names');
187186
}
188187

@@ -222,16 +221,16 @@ class TopMergeHelper {
222221
);
223222
}
224223

225-
return FunctionTypeImpl(
226-
typeFormals: R_typeParameters.toFixedList(),
227-
parameters: R_parameters.toFixedList(),
224+
return FunctionTypeImpl.v2(
225+
typeParameters: R_typeParameters.toFixedList(),
226+
formalParameters: R_parameters.toFixedList(),
228227
returnType: R_returnType,
229228
nullabilitySuffix: NullabilitySuffix.none,
230229
);
231230
}
232231

233232
InterfaceType _interfaceTypes(InterfaceType T, InterfaceType S) {
234-
if (T.element != S.element) {
233+
if (T.element3 != S.element3) {
235234
throw _TopMergeStateError(T, S, 'Different class elements');
236235
}
237236

@@ -245,32 +244,35 @@ class TopMergeHelper {
245244
(i) => topMerge(T_arguments[i], S_arguments[i]),
246245
growable: false,
247246
);
248-
return T.element.instantiate(
247+
return T.element3.instantiate(
249248
typeArguments: arguments,
250249
nullabilitySuffix: NullabilitySuffix.none,
251250
);
252251
}
253252
}
254253

255254
ParameterKind? _parameterKind(
256-
ParameterElement T_parameter,
257-
ParameterElement S_parameter,
255+
FormalParameterElement T,
256+
FormalParameterElement S,
258257
) {
259-
// ignore: deprecated_member_use_from_same_package
260-
var T_kind = T_parameter.parameterKind;
258+
if (T.isRequiredPositional && S.isRequiredPositional) {
259+
return ParameterKind.REQUIRED;
260+
}
261+
262+
if (T.isOptionalPositional && S.isOptionalPositional) {
263+
return ParameterKind.REQUIRED;
264+
}
261265

262-
// ignore: deprecated_member_use_from_same_package
263-
var S_kind = S_parameter.parameterKind;
266+
if (T.isRequiredNamed && S.isRequiredNamed) {
267+
return ParameterKind.NAMED_REQUIRED;
268+
}
264269

265-
if (T_kind == S_kind) {
266-
return T_kind;
270+
if (T.isOptionalNamed && S.isOptionalNamed) {
271+
return ParameterKind.NAMED;
267272
}
268273

269274
// Legacy named vs. Required named.
270-
if (T_kind == ParameterKind.NAMED_REQUIRED &&
271-
S_kind == ParameterKind.NAMED ||
272-
T_kind == ParameterKind.NAMED &&
273-
S_kind == ParameterKind.NAMED_REQUIRED) {
275+
if (T.isRequiredNamed && S.isNamed || T.isNamed || S.isRequiredNamed) {
274276
return ParameterKind.NAMED_REQUIRED;
275277
}
276278

@@ -326,18 +328,17 @@ class TopMergeHelper {
326328
}
327329

328330
_MergeTypeParametersResult? _typeParameters(
329-
List<TypeParameterElement> aParameters,
330-
List<TypeParameterElement> bParameters,
331+
List<TypeParameterElement2> aParameters,
332+
List<TypeParameterElement2> bParameters,
331333
) {
332334
if (aParameters.length != bParameters.length) {
333335
return null;
334336
}
335337

336-
var newParameters = <TypeParameterElementImpl>[];
338+
var newParameters = <TypeParameterElementImpl2>[];
337339
var newTypes = <TypeParameterType>[];
338340
for (var i = 0; i < aParameters.length; i++) {
339-
var name = aParameters[i].name;
340-
var newParameter = TypeParameterElementImpl.synthetic(name);
341+
var newParameter = aParameters[i].freshCopy();
341342
newParameters.add(newParameter);
342343

343344
var newType = newParameter.instantiate(
@@ -346,8 +347,8 @@ class TopMergeHelper {
346347
newTypes.add(newType);
347348
}
348349

349-
var aSubstitution = Substitution.fromPairs(aParameters, newTypes);
350-
var bSubstitution = Substitution.fromPairs(bParameters, newTypes);
350+
var aSubstitution = Substitution.fromPairs2(aParameters, newTypes);
351+
var bSubstitution = Substitution.fromPairs2(bParameters, newTypes);
351352
for (var i = 0; i < aParameters.length; i++) {
352353
var a = aParameters[i];
353354
var b = bParameters[i];
@@ -361,6 +362,7 @@ class TopMergeHelper {
361362
bBound = bSubstitution.substituteType(bBound);
362363
var newBound = topMerge(aBound, bBound);
363364
newParameters[i].bound = newBound;
365+
newParameters[i].firstFragment.bound = newBound;
364366
} else {
365367
return null;
366368
}
@@ -375,7 +377,7 @@ class TopMergeHelper {
375377
}
376378

377379
class _MergeTypeParametersResult {
378-
final List<TypeParameterElement> typeParameters;
380+
final List<TypeParameterElement2> typeParameters;
379381
final Substitution aSubstitution;
380382
final Substitution bSubstitution;
381383

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,9 @@ class FunctionTypeImpl extends TypeImpl
185185
}) {
186186
return FunctionTypeImpl(
187187
typeFormals: typeParameters.map((e) => e.asElement).toList(),
188-
parameters: formalParameters.map((e) => e.asElement).toList(),
188+
parameters: formalParameters is List<FormalParameterElementImpl>
189+
? formalParameters.map((e) => e.asElement).toList()
190+
: formalParameters.map((e) => e.asElement).toList(),
189191
returnType: returnType,
190192
nullabilitySuffix: nullabilitySuffix,
191193
alias: alias,

pkg/analyzer/lib/src/utilities/extensions/element.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ extension FieldElementExtension on FieldElement {
358358
}
359359
}
360360

361-
extension FormalParameterExtension on FormalParameterElement {
361+
extension FormalParameterElementExtension on FormalParameterElement {
362362
ParameterElement get asElement {
363363
if (this case ParameterMember member) {
364364
return member;
@@ -386,6 +386,12 @@ extension FormalParameterExtension on FormalParameterElement {
386386
}
387387
}
388388

389+
extension FormalParameterElementImplExtension on FormalParameterElementImpl {
390+
ParameterElementImpl get asElement {
391+
return firstFragment;
392+
}
393+
}
394+
389395
extension InterfaceElement2Extension on InterfaceElement2 {
390396
InterfaceElement get asElement {
391397
return firstFragment as InterfaceElement;

0 commit comments

Comments
 (0)