API. Deprecate FormalParameterElement.formalParameters and typeParameters.

For clients outside the library the useful property in
`FormalParameterElement.type`, not *how* this type was specified
syntactically: `void f(int a<T>())` vs. `void f(int Function<T>() a)`.
This way, we have to think about these type parameters and formal
parameters only locally, like for example about local variables - they
exist, enclosed in a fragment, but don't leak outside into the element
model of a method.

I found this while working on the augmentations: that formal parameters
have to have the same types in the introductory declaration, and in
augmentations.

Change-Id: Ie4e92ebd0cd0204c4ba80200a9497e95859cc3e7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/509522
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov
2026-06-09 09:51:14 -07:00
committed by dart-scoped@luci-project-accounts.iam.gserviceaccount.com
parent 55dcbad483
commit ea50ec6486
10 changed files with 23 additions and 3 deletions
+2 -1
View File
@@ -1,7 +1,8 @@
## 13.2.0-dev
* Internal changes only.
* Allow package_config `3.x.x`.
* Deprecate `FormalParameterElement.formalParameters` and `typeParameters`.
Use `FormalParameterElement.type` instead.
## 13.1.0
+2 -2
View File
@@ -3669,7 +3669,7 @@ package:analyzer/dart/element/element.dart:
baseElement (getter: FormalParameterElement)
defaultValueCode (getter: String?)
firstFragment (getter: FormalParameterFragment)
formalParameters (getter: List<FormalParameterElement>)
formalParameters (getter: List<FormalParameterElement>, deprecated)
fragments (getter: List<FormalParameterFragment>)
hasDefaultValue (getter: bool)
isCovariant (getter: bool)
@@ -3683,7 +3683,7 @@ package:analyzer/dart/element/element.dart:
isRequiredNamed (getter: bool)
isRequiredPositional (getter: bool)
isSuperFormal (getter: bool, deprecated)
typeParameters (getter: List<TypeParameterElement>)
typeParameters (getter: List<TypeParameterElement>, deprecated)
appendToWithoutDelimiters (method: void Function(StringBuffer))
FormalParameterFragment (class extends Object implements VariableFragment, LocalFragment, abstract):
new (constructor: FormalParameterFragment Function())
@@ -1378,6 +1378,7 @@ abstract class FormalParameterElement implements VariableElement, LocalElement {
///
/// A parameter will only define other parameters if it is a function typed
/// formal parameter.
@Deprecated('Use the function type of this parameter instead')
List<FormalParameterElement> get formalParameters;
@override
@@ -1451,6 +1452,7 @@ abstract class FormalParameterElement implements VariableElement, LocalElement {
///
/// A parameter will only define type parameters if it is a function typed
/// parameter.
@Deprecated('Use the function type of this parameter instead')
List<TypeParameterElement> get typeParameters;
/// Appends the type, name and possibly the default value of this parameter
@@ -3942,6 +3942,7 @@ class FormalParameterElementImpl extends PromotableElementImpl
// .map((fragment) => (fragment as TypeParameterElementImpl).element)
// .toList();
@Deprecated('Use the function type of this parameter instead')
@override
// TODO(augmentations): Implement the merge of formal parameters.
List<FormalParameterElementImpl> get formalParameters => _firstFragment
@@ -4018,6 +4019,7 @@ class FormalParameterElementImpl extends PromotableElementImpl
return _firstFragment.parameterKind;
}
@Deprecated('Use the function type of this parameter instead')
@override
// TODO(augmentations): Implement the merge of formal parameters.
List<TypeParameterElementImpl> get typeParameters {
@@ -6359,6 +6361,7 @@ mixin InternalFormalParameterElement on InternalVariableElement
@override
TypeImpl get type;
@Deprecated('Use the function type of this parameter instead')
@override
List<TypeParameterElementImpl> get typeParameters;
@@ -465,6 +465,7 @@ class SubstitutedFieldFormalParameterElementImpl
required MapSubstitution substitution,
}) {
var freshTypeParameters = _SubstitutedTypeParameters(
// ignore: deprecated_member_use_from_same_package
baseElement.typeParameters,
substitution,
);
@@ -519,6 +520,7 @@ class SubstitutedFieldFormalParameterElementImpl
class SubstitutedFormalParameterElementImpl
extends SubstitutedVariableElementImpl
with InternalFormalParameterElement {
@Deprecated('Use the function type of this parameter instead')
@override
final List<TypeParameterElementImpl> typeParameters;
@@ -526,6 +528,7 @@ class SubstitutedFormalParameterElementImpl
required FormalParameterElementImpl baseElement,
required MapSubstitution substitution,
}) {
// ignore: deprecated_member_use_from_same_package
var typeParameters = baseElement.typeParameters;
if (typeParameters.isEmpty) {
// Happens often. Avoid doing unneeded allocation.
@@ -558,6 +561,7 @@ class SubstitutedFormalParameterElementImpl
@override
List<Element> get children {
// ignore: deprecated_member_use_from_same_package
return [...typeParameters, ...formalParameters];
}
@@ -573,6 +577,7 @@ class SubstitutedFormalParameterElementImpl
@override
FormalParameterFragmentImpl get firstFragment => baseElement.firstFragment;
@Deprecated('Use the function type of this parameter instead')
@override
List<FormalParameterElementImpl> get formalParameters =>
baseElement.formalParameters;
@@ -904,6 +909,7 @@ class SubstitutedSuperFormalParameterElementImpl
required MapSubstitution substitution,
}) {
var freshTypeParameters = _SubstitutedTypeParameters(
// ignore: deprecated_member_use_from_same_package
baseElement.typeParameters,
substitution,
);
@@ -795,7 +795,9 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
var element = node.declaredFragment!.element;
element.type = FunctionTypeImpl(
// ignore: deprecated_member_use_from_same_package
typeParameters: element.typeParameters,
// ignore: deprecated_member_use_from_same_package
formalParameters: element.formalParameters,
returnType: node.type?.type ?? _typeProvider.dynamicType,
nullabilitySuffix: _getNullability(
@@ -248,6 +248,7 @@ class ScopeContext {
node.type?.accept(visitor);
} else {
var element = node.declaredFragment!.element;
// ignore: deprecated_member_use_from_same_package
withTypeParameterScope(element.typeParameters, () {
node.type?.accept(visitor);
functionTypedSuffix.typeParameters?.accept(visitor);
@@ -788,6 +788,7 @@ class LibraryReader {
reader,
fragment.typeParameters,
);
// ignore: deprecated_member_use_from_same_package
_readTypeParameterElementResolutions(reader, element.typeParameters);
_readFormalParameterFragmentsResolution(
libraryFragment,
@@ -493,8 +493,10 @@ class BundleWriter {
_resolutionSink._writeMetadata(fragment.metadata);
// ignore: deprecated_member_use_from_same_package
_resolutionSink.withTypeParameters(fragment.element.typeParameters, () {
_sink.writeList(fragment.typeParameters, _writeTypeParameterFragment);
// ignore: deprecated_member_use_from_same_package
_writeTypeParameterElementResolutions(fragment.element.typeParameters);
_sink.writeList(fragment.formalParameters, _writeFormalParameterFragment);
_resolutionSink.writeBool(fragment.element.inheritsCovariant);
@@ -678,12 +678,14 @@ class _Element2Writer extends _AbstractElementWriter {
_writeElementList(
'typeParameters',
e,
// ignore: deprecated_member_use_from_same_package
e.typeParameters,
_writeTypeParameterElement,
);
_writeElementList(
'formalParameters',
e,
// ignore: deprecated_member_use_from_same_package
e.formalParameters,
_writeFormalParameterElement,
);