Skip to content

Commit adcc212

Browse files
stereotype441Commit Queue
authored and
Commit Queue
committed
[analyzer] Changes related to ExecutableElementImpl._parameters.
Now that the type of `ExecutableElementImpl._parameters` has been changed to `List<ParameterElementImpl>`, the type of `ExecutableElementImpl.formalParameters` can also be safely changed from `List<FormalParameterFragment>` to `List<ParameterElementImpl>`, and no longer requires a cast. (This works because `ParameterElementImpl` is a subtype of `FormalParameterFragment`.) Also, in `InheritanceManager3._topMerge`, it isn't necessary to use `toImpl()` to convert `resultType.parameters` to `List<ParameterElementImpl>`, because `resultType` is guaranteed to have been produced by `TypeSystemImpl.topMerge`. Instead, we can change `TypeSystemImpl.topMerge` so that when it produces a `FunctionType`, it always makes their parameter list a `List<ParameterElementImpl>`. (It was already the case that all the parameters in a `FunctionType` produced by `TypeSystemImpl.topMerge` are instances of `ParameterElementImpl`, so this is a straightforward change.) The change to `ExecutableElementImpl.formalParameters` will allow some types in various element model Impl classes to be changed from `DartType` to `TypeImpl`, which will in turn pave the way for changing the analyzer's `DartType` class so that it implements `SharedTypeStructure<TypeImpl>` rather than `SharedTypeStructure<DartType>`. This is part of a larger arc of work to change the analyzer's use of the shared code so that the type parameters it supplies are not part of the analyzer public API. See #59763. Change-Id: I49153cebed389f549c22d41bebee1f9b85c173d0 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/404041 Commit-Queue: Paul Berry <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]>
1 parent 8bbe6fb commit adcc212

File tree

4 files changed

+12
-16
lines changed

4 files changed

+12
-16
lines changed

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -3679,8 +3679,7 @@ abstract class ExecutableElementImpl extends _ExistingElementImpl
36793679
}
36803680

36813681
@override
3682-
List<FormalParameterFragment> get formalParameters =>
3683-
parameters.cast<FormalParameterFragment>();
3682+
List<ParameterElementImpl> get formalParameters => parameters;
36843683

36853684
@override
36863685
bool get hasImplicitReturnType {

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

-11
Original file line numberDiff line numberDiff line change
@@ -205,17 +205,6 @@ extension LibraryExtension2 on LibraryElement2? {
205205
this?.featureSet.isEnabled(Feature.wildcard_variables) ?? false;
206206
}
207207

208-
extension ListOfParameterElementExtension on List<ParameterElement> {
209-
/// Returns `this` as `List<ParameterElementImpl>`, converting if it isn't
210-
/// one already.
211-
List<ParameterElementImpl> toImpl() {
212-
return switch (this) {
213-
List<ParameterElementImpl> already => already,
214-
_ => [for (var p in this) p.toImpl()],
215-
};
216-
}
217-
}
218-
219208
extension ParameterElementExtension on ParameterElement {
220209
/// Return [ParameterElement] with the specified properties replaced.
221210
ParameterElementImpl copyWith({

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

+10-2
Original file line numberDiff line numberDiff line change
@@ -1142,7 +1142,11 @@ class InheritanceManager3 {
11421142
result.name2 = fragmentName;
11431143
result.typeParameters = resultType.typeFormals.cast();
11441144
result.returnType = resultType.returnType;
1145-
result.parameters = resultType.parameters.toImpl();
1145+
// `resultType` is guaranteed to have been produced by
1146+
// `TypeSystemImpl.topMerge`; when that function merges function types, it
1147+
// always produces a `FunctionType` whose parameter list is a
1148+
// `List<ParameterElementImpl>`.
1149+
result.parameters = resultType.parameters as List<ParameterElementImpl>;
11461150
result.element = MethodElementImpl2(
11471151
Reference.root(), // TODO(scheglov): wrong
11481152
firstMethod.name,
@@ -1160,7 +1164,11 @@ class InheritanceManager3 {
11601164
result.isGetter = firstAccessor.isGetter;
11611165
result.isSetter = firstAccessor.isSetter;
11621166
result.returnType = resultType.returnType;
1163-
result.parameters = resultType.parameters.toImpl();
1167+
// `resultType` is guaranteed to have been produced by
1168+
// `TypeSystemImpl.topMerge`; when that function merges function types, it
1169+
// always produces a `FunctionType` whose parameter list is a
1170+
// `List<ParameterElementImpl>`.
1171+
result.parameters = resultType.parameters as List<ParameterElementImpl>;
11641172

11651173
var field = FieldElementImpl(variableName, -1);
11661174
field.enclosingElement3 = targetClass;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ class TopMergeHelper {
172172
throw _TopMergeStateError(T, S, 'Different number of formal parameters');
173173
}
174174

175-
var R_parameters = <ParameterElement>[];
175+
var R_parameters = <ParameterElementImpl>[];
176176
for (var i = 0; i < T_parameters.length; i++) {
177177
var T_parameter = T_parameters[i];
178178
var S_parameter = S_parameters[i];

0 commit comments

Comments
 (0)