From ea50ec6486efd0bc661c72aeaf89d1744b82cefb Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Tue, 9 Jun 2026 09:51:14 -0700 Subject: [PATCH] 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())` vs. `void f(int Function() 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 Reviewed-by: Johnni Winther Commit-Queue: Konstantin Shcheglov --- pkg/analyzer/CHANGELOG.md | 3 ++- pkg/analyzer/api.txt | 4 ++-- pkg/analyzer/lib/dart/element/element.dart | 2 ++ pkg/analyzer/lib/src/dart/element/element.dart | 3 +++ pkg/analyzer/lib/src/dart/element/member.dart | 6 ++++++ pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart | 2 ++ pkg/analyzer/lib/src/dart/resolver/scope_context.dart | 1 + pkg/analyzer/lib/src/summary2/bundle_reader.dart | 1 + pkg/analyzer/lib/src/summary2/bundle_writer.dart | 2 ++ pkg/analyzer/test/src/summary/element_text.dart | 2 ++ 10 files changed, 23 insertions(+), 3 deletions(-) diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md index 321f553dc12..2e4b14a0c3a 100644 --- a/pkg/analyzer/CHANGELOG.md +++ b/pkg/analyzer/CHANGELOG.md @@ -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 diff --git a/pkg/analyzer/api.txt b/pkg/analyzer/api.txt index ebbf9a3099e..10ebf57ca13 100644 --- a/pkg/analyzer/api.txt +++ b/pkg/analyzer/api.txt @@ -3669,7 +3669,7 @@ package:analyzer/dart/element/element.dart: baseElement (getter: FormalParameterElement) defaultValueCode (getter: String?) firstFragment (getter: FormalParameterFragment) - formalParameters (getter: List) + formalParameters (getter: List, deprecated) fragments (getter: List) 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) + typeParameters (getter: List, deprecated) appendToWithoutDelimiters (method: void Function(StringBuffer)) FormalParameterFragment (class extends Object implements VariableFragment, LocalFragment, abstract): new (constructor: FormalParameterFragment Function()) diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart index ceceef5c61e..8025c641fbf 100644 --- a/pkg/analyzer/lib/dart/element/element.dart +++ b/pkg/analyzer/lib/dart/element/element.dart @@ -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 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 get typeParameters; /// Appends the type, name and possibly the default value of this parameter diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart index dd6b9a770f0..10085142c85 100644 --- a/pkg/analyzer/lib/src/dart/element/element.dart +++ b/pkg/analyzer/lib/src/dart/element/element.dart @@ -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 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 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 get typeParameters; diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart index f18627c3419..bf4262cdfe8 100644 --- a/pkg/analyzer/lib/src/dart/element/member.dart +++ b/pkg/analyzer/lib/src/dart/element/member.dart @@ -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 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 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 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, ); diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart index 23ef5f26a00..1677c5a69fe 100644 --- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart +++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart @@ -795,7 +795,9 @@ class ResolutionVisitor extends RecursiveAstVisitor { 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( diff --git a/pkg/analyzer/lib/src/dart/resolver/scope_context.dart b/pkg/analyzer/lib/src/dart/resolver/scope_context.dart index a5fcae2716e..c2ebbccf816 100644 --- a/pkg/analyzer/lib/src/dart/resolver/scope_context.dart +++ b/pkg/analyzer/lib/src/dart/resolver/scope_context.dart @@ -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); diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart index 6ffec7e187f..224509b1daa 100644 --- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart +++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart @@ -788,6 +788,7 @@ class LibraryReader { reader, fragment.typeParameters, ); + // ignore: deprecated_member_use_from_same_package _readTypeParameterElementResolutions(reader, element.typeParameters); _readFormalParameterFragmentsResolution( libraryFragment, diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart index fb6603b2468..02b3d53d944 100644 --- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart +++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart @@ -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); diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart index 27687332d3c..54eb82788f1 100644 --- a/pkg/analyzer/test/src/summary/element_text.dart +++ b/pkg/analyzer/test/src/summary/element_text.dart @@ -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, );