Skip to content

Commit 0931a60

Browse files
stereotype441Commit Queue
authored andcommitted
[analyzer] Use FormalParameterElementOrMember when interfacing with shared code.
Change the analyzer's use of the following shared generic types so that it supplies the type parameter `FormalParameterElementOrMember` instead of `ParameterElementMixin` as the type it uses to represent parameters of function types: - `SharedFunctionTypeStructure` - `TypeConstraintGenerator` - `TypeConstraintGeneratorMixin` `FormalParameterElementOrMember` is a new interface class that acts as a common private base class for all the concrete subtypes of the public API class `FormalParameterElement`. This required adding a type cast in one place (in `FunctionTypeImpl.sortedNamedParametersShared`). In other places, I avoided type casts by tightening up some return types (for example, `FieldFormalParameterElementImpl.element` now returns `FieldFormalParameterElementImpl2` instead of `FieldFormalParameterElement2`). The analyzer public API is unchanged, though (for example, `FieldFormalParameterFragment.element` still has a return type of `FieldFormalParameterElement2`), so clients should be unaffected. As a result of this change, it is no longer necessary for `ParameterElementMixin` to implement the shared interface `SharedNamedFunctionParameterStructure`. This interface is now implemented by `FormalParameterElementOrMember`. This is part of a larger arc of work to use types from the new analyzer element model when interfacing with shared code. Change-Id: I1ab5bf0607a80cbe30f4814bd5444487099825ee Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/402341 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Paul Berry <[email protected]>
1 parent e2219ef commit 0931a60

File tree

5 files changed

+48
-24
lines changed

5 files changed

+48
-24
lines changed

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

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4400,8 +4400,8 @@ class FieldFormalParameterElementImpl extends ParameterElementImpl
44004400
});
44014401

44024402
@override
4403-
FieldFormalParameterElement2 get element =>
4404-
super.element as FieldFormalParameterElement2;
4403+
FieldFormalParameterElementImpl2 get element =>
4404+
super.element as FieldFormalParameterElementImpl2;
44054405

44064406
/// Initializing formals are visible only in the "formal parameter
44074407
/// initializer scope", which is the current scope of the initializer list
@@ -4428,7 +4428,7 @@ class FieldFormalParameterElementImpl extends ParameterElementImpl
44284428
visitor.visitFieldFormalParameterElement(this);
44294429

44304430
@override
4431-
FormalParameterElement _createElement(
4431+
FieldFormalParameterElementImpl2 _createElement(
44324432
FormalParameterFragment firstFragment) =>
44334433
FieldFormalParameterElementImpl2(firstFragment as ParameterElementImpl);
44344434
}
@@ -4453,7 +4453,7 @@ class FormalParameterElementImpl extends PromotableElementImpl2
44534453
FragmentedAnnotatableElementMixin<FormalParameterFragment>,
44544454
FragmentedElementMixin<FormalParameterFragment>,
44554455
_NonTopLevelVariableOrParameter
4456-
implements FormalParameterElement {
4456+
implements FormalParameterElementOrMember {
44574457
final ParameterElementImpl wrappedElement;
44584458

44594459
FormalParameterElementImpl(this.wrappedElement) {
@@ -4551,6 +4551,9 @@ class FormalParameterElementImpl extends PromotableElementImpl2
45514551
@override
45524552
String? get name3 => wrappedElement.name;
45534553

4554+
@override
4555+
String get nameShared => wrappedElement.name;
4556+
45544557
@override
45554558
// TODO(augmentations): Implement the merge of formal parameters.
45564559
DartType get type => wrappedElement.type;
@@ -4588,6 +4591,11 @@ class FormalParameterElementImpl extends PromotableElementImpl2
45884591
// .toList();
45894592
}
45904593

4594+
abstract class FormalParameterElementOrMember
4595+
implements
4596+
FormalParameterElement,
4597+
SharedNamedFunctionParameterStructure<DartType> {}
4598+
45914599
mixin FragmentedAnnotatableElementMixin<E extends Fragment>
45924600
implements FragmentedElementMixin<E> {
45934601
String? get documentationComment {
@@ -9029,7 +9037,7 @@ class ParameterElementImpl extends VariableElementImpl
90299037
bool inheritsCovariant = false;
90309038

90319039
/// The element corresponding to this fragment.
9032-
FormalParameterElement? _element;
9040+
FormalParameterElementImpl? _element;
90339041

90349042
/// Initialize a newly created parameter element to have the given [name] and
90359043
/// [nameOffset].
@@ -9065,7 +9073,7 @@ class ParameterElementImpl extends VariableElementImpl
90659073
ParameterElement get declaration => this;
90669074

90679075
@override
9068-
FormalParameterElement get element {
9076+
FormalParameterElementImpl get element {
90699077
if (_element != null) {
90709078
return _element!;
90719079
}
@@ -9080,7 +9088,7 @@ class ParameterElementImpl extends VariableElementImpl
90809088
return _createElement(firstFragment);
90819089
}
90829090

9083-
set element(FormalParameterElement element) => _element = element;
9091+
set element(FormalParameterElementImpl element) => _element = element;
90849092

90859093
@override
90869094
Fragment? get enclosingFragment => enclosingElement3 as Fragment?;
@@ -9170,7 +9178,7 @@ class ParameterElementImpl extends VariableElementImpl
91709178
builder.writeFormalParameter(this);
91719179
}
91729180

9173-
FormalParameterElement _createElement(
9181+
FormalParameterElementImpl _createElement(
91749182
FormalParameterFragment firstFragment) =>
91759183
FormalParameterElementImpl(firstFragment as ParameterElementImpl);
91769184
}
@@ -9241,10 +9249,7 @@ class ParameterElementImpl_ofImplicitSetter extends ParameterElementImpl {
92419249

92429250
/// A mixin that provides a common implementation for methods defined in
92439251
/// [ParameterElement].
9244-
mixin ParameterElementMixin
9245-
implements
9246-
ParameterElement,
9247-
SharedNamedFunctionParameterStructure<DartType> {
9252+
mixin ParameterElementMixin implements ParameterElement {
92489253
@override
92499254
bool get isNamed => parameterKind.isNamed;
92509255

@@ -9269,9 +9274,6 @@ mixin ParameterElementMixin
92699274
@override
92709275
bool get isRequiredPositional => parameterKind.isRequiredPositional;
92719276

9272-
@override
9273-
String get nameShared => name;
9274-
92759277
@override
92769278
// Overridden to remove the 'deprecated' annotation.
92779279
ParameterKind get parameterKind;
@@ -10274,8 +10276,8 @@ class SuperFormalParameterElementImpl extends ParameterElementImpl
1027410276
});
1027510277

1027610278
@override
10277-
SuperFormalParameterElement2 get element =>
10278-
super.element as SuperFormalParameterElement2;
10279+
SuperFormalParameterElementImpl2 get element =>
10280+
super.element as SuperFormalParameterElementImpl2;
1027910281

1028010282
/// Super parameters are visible only in the initializer list scope,
1028110283
/// and introduce final variables.
@@ -10329,7 +10331,7 @@ class SuperFormalParameterElementImpl extends ParameterElementImpl
1032910331
}
1033010332

1033110333
@override
10332-
FormalParameterElement _createElement(
10334+
FormalParameterElementImpl _createElement(
1033310335
FormalParameterFragment firstFragment) =>
1033410336
SuperFormalParameterElementImpl2(firstFragment as ParameterElementImpl);
1033510337
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,7 @@ class MethodMember extends ExecutableMember
10791079
/// type parameters are known.
10801080
class ParameterMember extends VariableMember
10811081
with ParameterElementMixin
1082-
implements ParameterElement, FormalParameterElement {
1082+
implements ParameterElement, FormalParameterElementOrMember {
10831083
@override
10841084
final List<TypeParameterElement> typeParameters;
10851085

@@ -1167,6 +1167,9 @@ class ParameterMember extends VariableMember
11671167
@override
11681168
String? get name3 => _element2.name3;
11691169

1170+
@override
1171+
String get nameShared => name;
1172+
11701173
@override
11711174
Element2 get nonSynthetic2 => _element2;
11721175

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class FunctionTypeImpl extends TypeImpl
9090
implements
9191
FunctionType,
9292
SharedFunctionTypeStructure<DartType, TypeParameterElementImpl2,
93-
ParameterElementMixin> {
93+
FormalParameterElementOrMember> {
9494
@override
9595
late int hashCode = _computeHashCode();
9696

@@ -234,8 +234,13 @@ class FunctionTypeImpl extends TypeImpl
234234
positionalParameterTypes.sublist(requiredPositionalParameterCount);
235235

236236
@override
237-
List<ParameterElementMixin> get sortedNamedParametersShared =>
238-
sortedNamedParameters;
237+
// TODO(paulberry): see if this type can be changed to
238+
// `List<FormalParameterElementImpl>`. See
239+
// https://dart-review.googlesource.com/c/sdk/+/402341/comment/b1669e20_15938fcd/.
240+
List<FormalParameterElementOrMember> get sortedNamedParametersShared =>
241+
sortedNamedParameters
242+
.map((p) => p.asElement2 as FormalParameterElementOrMember)
243+
.toList();
239244

240245
@override
241246
List<TypeParameterElementImpl2> get typeParameters => typeFormals

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ typedef UnknownTypeConstraintOrigin = shared.UnknownTypeConstraintOrigin<
9494
/// attempt to make one type schema a subtype of another.
9595
class TypeConstraintGatherer extends shared.TypeConstraintGenerator<
9696
DartType,
97-
ParameterElementMixin,
97+
FormalParameterElementOrMember,
9898
PromotableElementImpl2,
9999
TypeParameterElementImpl2,
100100
InterfaceType,
@@ -103,7 +103,7 @@ class TypeConstraintGatherer extends shared.TypeConstraintGenerator<
103103
with
104104
shared.TypeConstraintGeneratorMixin<
105105
DartType,
106-
ParameterElementMixin,
106+
FormalParameterElementOrMember,
107107
PromotableElementImpl2,
108108
TypeParameterElementImpl2,
109109
InterfaceType,

pkg/analyzer/test/generated/non_error_resolver_test.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1890,6 +1890,20 @@ class B extends A {
18901890
]);
18911891
}
18921892

1893+
test_instantiateGenericFunctionWithNamedParameterAsGenericArg() async {
1894+
// This test case reproduces the problem encountered in
1895+
// https://dart-review.googlesource.com/c/sdk/+/402341/comment/b1669e20_15938fcd/.
1896+
await assertNoErrorsInCode(r'''
1897+
abstract class C<T> {
1898+
S f<S>(S Function(C<T>) g);
1899+
}
1900+
1901+
T h<T>(C<T> c, {bool b = false}) => throw '';
1902+
1903+
T test<T>(C<T> c) => c.f(h);
1904+
''');
1905+
}
1906+
18931907
test_integerLiteralOutOfRange_negative_leadingZeros() async {
18941908
await assertNoErrorsInCode('''
18951909
int x = -000923372036854775809;

0 commit comments

Comments
 (0)