From 3c5bdb63cfdf623c1da3427b1cdc11c0986de062 Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Mon, 30 Sep 2024 16:56:50 +0000 Subject: [PATCH] Elements. Migrate CreateMethod. Change-Id: I7e631dd63baf74060a94bd413f5ccdd527fd21f1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/387352 Reviewed-by: Brian Wilkerson Commit-Queue: Konstantin Shcheglov --- .../analyzer_use_new_elements.txt | 1 + .../correction/dart/create_field.dart | 1 - .../correction/dart/create_getter.dart | 1 - .../correction/dart/create_method.dart | 71 +++---- .../correction/dart/create_setter.dart | 1 - .../services/correction/dart/data_driven.dart | 2 - .../lib/edit/dart/correction_producer.dart | 24 +++ pkg/analyzer/lib/dart/element/element2.dart | 17 +- .../lib/src/dart/element/element.dart | 6 + .../change_builder/change_builder_dart.dart | 178 ++++++++++++++++++ .../change_builder/change_builder_dart.dart | 45 +++++ pkg/analyzer_plugin/pubspec.yaml | 2 +- 12 files changed, 310 insertions(+), 39 deletions(-) diff --git a/pkg/analysis_server/analyzer_use_new_elements.txt b/pkg/analysis_server/analyzer_use_new_elements.txt index 210476cd8b3..ae8ba89b7df 100644 --- a/pkg/analysis_server/analyzer_use_new_elements.txt +++ b/pkg/analysis_server/analyzer_use_new_elements.txt @@ -281,6 +281,7 @@ lib/src/services/correction/dart/create_field.dart lib/src/services/correction/dart/create_function.dart lib/src/services/correction/dart/create_getter.dart lib/src/services/correction/dart/create_local_variable.dart +lib/src/services/correction/dart/create_method.dart lib/src/services/correction/dart/create_method_or_function.dart lib/src/services/correction/dart/create_no_such_method.dart lib/src/services/correction/dart/create_parameter.dart diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart index db446ad462a..4eb1e3eda8d 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart @@ -8,7 +8,6 @@ import 'package:analysis_server/src/services/correction/util.dart'; import 'package:analysis_server/src/utilities/extensions/ast.dart'; import 'package:analysis_server_plugin/edit/dart/correction_producer.dart'; import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart'; diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart index 7dbb7521c8e..04d9e727cc5 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart @@ -6,7 +6,6 @@ import 'package:analysis_server/src/services/correction/fix.dart'; import 'package:analysis_server/src/services/correction/util.dart'; import 'package:analysis_server/src/utilities/extensions/ast.dart'; import 'package:analysis_server_plugin/edit/dart/correction_producer.dart'; -import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/src/dart/ast/ast.dart'; diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart index cc501c5525e..04995a2f795 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart @@ -6,7 +6,8 @@ import 'package:analysis_server/src/services/correction/fix.dart'; import 'package:analysis_server_plugin/edit/dart/correction_producer.dart'; import 'package:analyzer/dart/analysis/results.dart'; import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/src/dart/element/inheritance_manager3.dart'; import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart'; import 'package:analyzer_plugin/utilities/fixes/fixes.dart'; import 'package:analyzer_plugin/utilities/range_factory.dart'; @@ -59,27 +60,31 @@ class CreateMethod extends ResolvedCorrectionProducer { return; } - var classElement = classDecl.declaredElement!; + var classElement = classDecl.declaredFragment!.element; var missingEquals = memberDecl is FieldDeclaration || (memberDecl as MethodDeclaration).name.lexeme == 'hashCode'; await builder.addDartFileEdit(file, (fileBuilder) { fileBuilder.insertIntoUnitMember(classDecl, (builder) { - ExecutableElement? element; + ExecutableElement2? element; if (missingEquals) { _memberName = '=='; - element = classElement.lookUpInheritedMethod( - _memberName, classElement.library); + element = inheritanceManager.getInherited4( + classElement, + Name.forLibrary(classElement.library2, _memberName), + ); } else { _memberName = 'hashCode'; - element = classElement.lookUpInheritedConcreteGetter( - _memberName, classElement.library); + element = inheritanceManager.getInherited4( + classElement, + Name.forLibrary(classElement.library2, _memberName), + ); } if (element == null) { return; } - builder.writeOverride(element, invokeSuper: true); + builder.writeOverride2(element, invokeSuper: true); }); }); } @@ -91,31 +96,30 @@ class CreateMethod extends ResolvedCorrectionProducer { _memberName = (node as SimpleIdentifier).name; var invocation = node.parent as MethodInvocation; // Prepare environment. - Element? targetElement; + Fragment? targetFragment; var staticModifier = false; CompilationUnitMember? targetNode; var target = invocation.realTarget; if (target is ExtensionOverride) { - targetElement = target.element; - if (targetElement is ExtensionElement) { - targetNode = await getExtensionDeclaration(targetElement); + targetFragment = target.element2.firstFragment; + if (targetFragment is ExtensionFragment) { + targetNode = await getExtensionDeclaration2(targetFragment); if (targetNode == null) { return; } } - } else if (target is Identifier && - target.staticElement is ExtensionElement) { - targetElement = target.staticElement; - if (targetElement is ExtensionElement) { - targetNode = await getExtensionDeclaration(targetElement); + } else if (target is Identifier && target.element is ExtensionElement2) { + targetFragment = (target.element as ExtensionElement2).firstFragment; + if (targetFragment is ExtensionFragment) { + targetNode = await getExtensionDeclaration2(targetFragment); if (targetNode == null) { return; } } staticModifier = true; } else if (target == null) { - targetElement = unit.declaredElement; + targetFragment = unit.declaredFragment; var enclosingMember = node.thisOrAncestorOfType(); if (enclosingMember == null) { // If the undefined identifier isn't inside a class member, then it @@ -128,40 +132,43 @@ class CreateMethod extends ResolvedCorrectionProducer { staticModifier = inStaticContext; } } else { - var targetClassElement = getTargetInterfaceElement(target); + var targetClassElement = getTargetInterfaceElement2(target); if (targetClassElement == null) { return; } - targetElement = targetClassElement; - if (targetClassElement.library.isInSdk) { + targetFragment = targetClassElement.firstFragment; + if (targetClassElement.library2.isInSdk) { return; } // Prepare target ClassDeclaration. - if (targetClassElement is MixinElement) { - targetNode = await getMixinDeclaration(targetClassElement); - } else if (targetClassElement is ClassElement) { - targetNode = await getClassDeclaration(targetClassElement); - } else if (targetClassElement is ExtensionTypeElement) { - targetNode = await getExtensionTypeDeclaration(targetClassElement); + if (targetClassElement is MixinElement2) { + var fragment = targetClassElement.firstFragment; + targetNode = await getMixinDeclaration2(fragment); + } else if (targetClassElement is ClassElement2) { + var fragment = targetClassElement.firstFragment; + targetNode = await getClassDeclaration2(fragment); + } else if (targetClassElement is ExtensionTypeElement2) { + var fragment = targetClassElement.firstFragment; + targetNode = await getExtensionTypeDeclaration2(fragment); } if (targetNode == null) { return; } // Maybe static. if (target is Identifier) { - staticModifier = target.staticElement?.kind == ElementKind.CLASS || - target.staticElement?.kind == ElementKind.EXTENSION_TYPE || - target.staticElement?.kind == ElementKind.MIXIN; + staticModifier = target.element?.kind == ElementKind.CLASS || + target.element?.kind == ElementKind.EXTENSION_TYPE || + target.element?.kind == ElementKind.MIXIN; } // Use different utils. - var targetPath = targetClassElement.source.fullName; + var targetPath = targetFragment.libraryFragment.source.fullName; var targetResolveResult = await unitResult.session.getResolvedUnit(targetPath); if (targetResolveResult is! ResolvedUnitResult) { return; } } - var targetSource = targetElement?.source; + var targetSource = targetFragment?.libraryFragment.source; if (targetSource == null) { return; } diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart index 48592028a4f..cb767b43d83 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart @@ -7,7 +7,6 @@ import 'package:analysis_server/src/services/correction/util.dart'; import 'package:analysis_server/src/utilities/extensions/ast.dart'; import 'package:analysis_server_plugin/edit/dart/correction_producer.dart'; import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart'; diff --git a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart index 09be005afa5..781cd6efd1b 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart @@ -10,8 +10,6 @@ import 'package:analysis_server/src/services/correction/fix/data_driven/transfor import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set.dart'; import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_manager.dart'; import 'package:analysis_server_plugin/edit/dart/correction_producer.dart'; -import 'package:analyzer/dart/element/element.dart' - show DirectiveUriWithRelativeUri; import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart'; import 'package:analyzer_plugin/utilities/fixes/fixes.dart'; diff --git a/pkg/analysis_server_plugin/lib/edit/dart/correction_producer.dart b/pkg/analysis_server_plugin/lib/edit/dart/correction_producer.dart index 02a97124f15..9e1d3fd2546 100644 --- a/pkg/analysis_server_plugin/lib/edit/dart/correction_producer.dart +++ b/pkg/analysis_server_plugin/lib/edit/dart/correction_producer.dart @@ -434,6 +434,18 @@ abstract class ResolvedCorrectionProducer return null; } + /// Returns the extension declaration for the given [fragment], or `null` if + /// there is no such extension. + Future getExtensionDeclaration2( + ExtensionFragment fragment) async { + var result = await sessionHelper.getElementDeclaration2(fragment); + var node = result?.node; + if (node is ExtensionDeclaration) { + return node; + } + return null; + } + /// Returns the extension type for the given [element], or `null` if there /// is no such extension type. Future getExtensionTypeDeclaration( @@ -446,6 +458,18 @@ abstract class ResolvedCorrectionProducer return null; } + /// Returns the extension type for the given [fragment], or `null` if there + /// is no such extension type. + Future getExtensionTypeDeclaration2( + ExtensionTypeFragment fragment) async { + var result = await sessionHelper.getElementDeclaration2(fragment); + var node = result?.node; + if (node is ExtensionTypeDeclaration) { + return node; + } + return null; + } + /// Returns the mixin declaration for the given [element], or `null` if there /// is no such mixin. Future getMixinDeclaration(MixinElement element) async { diff --git a/pkg/analyzer/lib/dart/element/element2.dart b/pkg/analyzer/lib/dart/element/element2.dart index fcd94960347..4683bf2897b 100644 --- a/pkg/analyzer/lib/dart/element/element2.dart +++ b/pkg/analyzer/lib/dart/element/element2.dart @@ -66,7 +66,16 @@ import 'package:analyzer/source/source.dart'; import 'package:analyzer/src/dart/resolver/scope.dart'; import 'package:pub_semver/pub_semver.dart'; -export 'package:analyzer/dart/element/element.dart' show DirectiveUriWithSource; +export 'package:analyzer/dart/element/element.dart' + show + DirectiveUri, + DirectiveUriWithLibrary, + DirectiveUriWithRelativeUri, + DirectiveUriWithRelativeUriString, + DirectiveUriWithSource, + DirectiveUriWithUnit, + ElementAnnotation, + ElementKind; abstract class BindPatternVariableElement2 implements PatternVariableElement2 {} @@ -483,6 +492,9 @@ abstract class ExecutableFragment implements FunctionTypedFragment { abstract class ExtensionElement2 implements InstanceElement2 { /// The type that is extended by this extension. DartType get extendedType; + + @override + ExtensionFragment get firstFragment; } /// The portion of an [ExtensionElement2] contributed by a single @@ -498,6 +510,9 @@ abstract class ExtensionFragment implements InstanceFragment { /// /// Clients may not extend, implement or mix-in this class. abstract class ExtensionTypeElement2 implements InterfaceElement2 { + @override + ExtensionTypeFragment get firstFragment; + /// The primary constructor of this extension. ConstructorElement2 get primaryConstructor2; diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart index f2e04eef985..2572bd6c570 100644 --- a/pkg/analyzer/lib/src/dart/element/element.dart +++ b/pkg/analyzer/lib/src/dart/element/element.dart @@ -6714,6 +6714,9 @@ mixin MaybeAugmentedExtensionElementMixin on MaybeAugmentedInstanceElementMixin @override ExtensionElementImpl get declaration; + @override + ExtensionElementImpl get firstFragment => declaration; + @override DartType get thisType => extendedType; } @@ -6733,6 +6736,9 @@ mixin MaybeAugmentedExtensionTypeElementMixin @override ExtensionTypeElementImpl get declaration; + @override + ExtensionTypeElementImpl get firstFragment => declaration; + @override ConstructorElement2 get primaryConstructor2 => representation as ConstructorElement2; diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart index 257208195ce..4392edce331 100644 --- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart +++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart @@ -641,6 +641,137 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder { displayTextBuffer?.write(' { … }'); } + @override + void writeOverride2( + ExecutableElement2 element, { + StringBuffer? displayTextBuffer, + String? returnTypeGroupName, + bool invokeSuper = false, + bool setSelection = true, + }) { + void withCarbonCopyBuffer(void Function() f) { + _carbonCopyBuffer = displayTextBuffer; + try { + f(); + } finally { + _carbonCopyBuffer = null; + } + } + + void selectAllIfSetSelection(void Function() writer) => + setSelection ? selectAll(writer) : writer(); + + var prefix = getIndent(1); + var prefix2 = getIndent(2); + var elementKind = element.kind; + + var isGetter = elementKind == ElementKind.GETTER; + var isSetter = elementKind == ElementKind.SETTER; + var isMethod = elementKind == ElementKind.METHOD; + var isOperator = isMethod && (element as MethodElement2).isOperator; + var memberName = element.displayName; + + // `@override` annotation. + writeln('@override'); + write(prefix); + + if (isGetter) { + writeln('// TODO: implement $memberName'); + write(prefix); + } + + // Return type. + var returnType = element.returnType; + if (!isSetter) { + var typeWritten = writeType2(returnType, + groupName: returnTypeGroupName, methodBeingCopied: element); + if (typeWritten) { + write(' '); + } + } + if (isGetter) { + write(Keyword.GET.lexeme); + write(' '); + } else if (isSetter) { + write(Keyword.SET.lexeme); + write(' '); + } else if (isOperator) { + write(Keyword.OPERATOR.lexeme); + write(' '); + } + + // Name. + withCarbonCopyBuffer(() { + write(memberName); + }); + + // Parameters and body. + if (isGetter) { + if (invokeSuper) { + write(' => '); + selectAllIfSetSelection(() => write('super.$memberName')); + writeln(';'); + } else { + write(' => '); + selectAllIfSetSelection(() => write('throw UnimplementedError()')); + write(';'); + } + displayTextBuffer?.write(' => …'); + return; + } + + // Method. + var parameters = element.formalParameters; + withCarbonCopyBuffer(() { + writeTypeParameters2(element.type.typeParameters, + methodBeingCopied: element); + writeFormalParameters(parameters, methodBeingCopied: element); + }); + writeln(' {'); + + // TO-DO comment. + write(prefix2); + write('// TODO: implement $memberName'); + + if (isSetter) { + if (invokeSuper) { + writeln(); + write(prefix2); + selectAllIfSetSelection( + () => write('super.$memberName = ${parameters[0].name};')); + } else { + if (setSelection) selectHere(); + } + } else if (returnType is VoidType) { + if (invokeSuper) { + writeln(); + write(prefix2); + selectAllIfSetSelection(() { + write('super'); + _writeSuperMemberInvocation2(element, memberName, parameters); + }); + } else { + if (setSelection) selectHere(); + } + } else { + writeln(); + write(prefix2); + if (invokeSuper) { + selectAllIfSetSelection(() { + write('return super'); + _writeSuperMemberInvocation2(element, memberName, parameters); + }); + } else { + selectAllIfSetSelection(() => write('throw UnimplementedError();')); + } + } + writeln(); + // Close method. + write(prefix); + write('}'); + displayTextBuffer?.write(' { … }'); + } + @override void writeParameter(String name, {bool isCovariant = false, @@ -879,6 +1010,34 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder { return wroteType; } + @override + bool writeType2( + DartType? type, { + bool addSupertypeProposals = false, + String? groupName, + ExecutableElement2? methodBeingCopied, + bool required = false, + }) { + var wroteType = false; + if (type != null && type is! DynamicType) { + if (groupName != null) { + addLinkedEdit(groupName, (LinkedEditBuilder builder) { + wroteType = _writeType2(type, methodBeingCopied: methodBeingCopied); + if (wroteType && addSupertypeProposals) { + _addSuperTypeProposals(builder, type, {}); + } + }); + } else { + wroteType = _writeType2(type, methodBeingCopied: methodBeingCopied); + } + } + if (!wroteType && required) { + write(Keyword.VAR.lexeme); + return true; + } + return wroteType; + } + @override void writeTypeParameter(TypeParameterElement typeParameter, {ExecutableElement? methodBeingCopied}) { @@ -1362,6 +1521,25 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder { write(isOperator ? ';' : ');'); } + void _writeSuperMemberInvocation2(ExecutableElement2 element, + String memberName, List parameters) { + var isOperator = element is MethodElement2 && element.isOperator; + write(isOperator ? ' ' : '.'); + write(memberName); + write(isOperator ? ' ' : '('); + for (var i = 0; i < parameters.length; i++) { + if (i > 0) { + write(', '); + } + if (parameters[i].isNamed) { + write(parameters[i].name); + write(': '); + } + write(parameters[i].name); + } + write(isOperator ? ';' : ');'); + } + /// Writes the code to reference [type] in this compilation unit. /// /// If a [methodBeingCopied] is provided, then the type parameters of that diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart index c82f370a87f..4c648839112 100644 --- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart +++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart @@ -11,6 +11,7 @@ import 'package:analyzer/dart/element/type_provider.dart'; import 'package:analyzer/dart/element/type_system.dart'; import 'package:analyzer/source/source_range.dart'; import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart'; +import 'package:meta/meta.dart'; /// The optional generator for prefix that should be used for new imports. typedef ImportPrefixGenerator = String Function(Uri); @@ -130,6 +131,7 @@ abstract class DartEditBuilder implements EditBuilder { /// included in the parameter declaration. /// /// If [isRequiredType] is `true` then the type is always written. + @experimental void writeFormalParameter(String name, {bool isCovariant, bool isRequiredNamed, @@ -147,6 +149,7 @@ abstract class DartEditBuilder implements EditBuilder { /// types. /// /// If [requiredTypes] is `true`, then the types are always written. + @experimental void writeFormalParameters(Iterable parameters, {ExecutableElement2? methodBeingCopied, bool includeDefaultValues = true, @@ -248,6 +251,22 @@ abstract class DartEditBuilder implements EditBuilder { bool setSelection = true, }); + /// Appends a placeholder for an override of the specified inherited + /// [element]. + /// + /// If provided, writes a string value suitable for display (e.g., in a + /// completion popup) in the given [displayTextBuffer]. If [invokeSuper] is + /// `true`, then the corresponding `super.name()` will be added in the body. + /// If [setSelection] is `true`, then the cursor will be placed in the body of + /// the override. + @experimental + void writeOverride2( + ExecutableElement2 element, { + StringBuffer? displayTextBuffer, + bool invokeSuper = false, + bool setSelection = true, + }); + /// Writes the code for a single parameter with the given [name]. /// /// If a [methodBeingCopied] is provided, then type parameters defined by that @@ -354,6 +373,30 @@ abstract class DartEditBuilder implements EditBuilder { ExecutableElement? methodBeingCopied, bool required = false}); + /// Writes the code for a type annotation for the given [type]. + /// + /// If the [type] is either `null` or represents the type `dynamic`, then the + /// behavior depends on whether a type is [required]. If [required] is `true`, + /// then the keyword `var` will be written; otherwise, nothing is written. + /// + /// If the [groupName] is not `null`, then the name of the type (including + /// type parameters) will be included as a region in the linked edit group + /// with that name. If the [groupName] is not `null` and + /// [addSupertypeProposals] is `true`, then all of the supertypes of the + /// [type] will be added as suggestions for alternatives to the type name. + /// + /// If a [methodBeingCopied] is provided, then type parameters defined by that + /// method are assumed to be part of what is being written and hence valid + /// types. + /// + /// Returns `true` if any text was written. + @experimental + bool writeType2(DartType? type, + {bool addSupertypeProposals = false, + String? groupName, + ExecutableElement2? methodBeingCopied, + bool required = false}); + /// Writes the code to declare the given [typeParameter]. /// /// The enclosing angle brackets are not automatically written. @@ -371,6 +414,7 @@ abstract class DartEditBuilder implements EditBuilder { /// If a [methodBeingCopied] is provided, then type parameters defined by that /// method are assumed to be part of what is being written and hence valid /// types. + @experimental void writeTypeParameter2(TypeParameterElement2 typeParameter, {ExecutableElement2? methodBeingCopied}); @@ -389,6 +433,7 @@ abstract class DartEditBuilder implements EditBuilder { /// If a [methodBeingCopied] is provided, then type parameters defined by that /// method are assumed to be part of what is being written and hence valid /// types. + @experimental void writeTypeParameters2(List typeParameters, {ExecutableElement2? methodBeingCopied}); diff --git a/pkg/analyzer_plugin/pubspec.yaml b/pkg/analyzer_plugin/pubspec.yaml index 2674ea5e7ee..9846345d8e8 100644 --- a/pkg/analyzer_plugin/pubspec.yaml +++ b/pkg/analyzer_plugin/pubspec.yaml @@ -10,6 +10,7 @@ dependencies: analyzer: ^6.0.0 collection: ^1.15.0 dart_style: ^2.2.1 + meta: ^1.15.0 pub_semver: ^2.1.0 yaml: ^3.1.0 path: ^1.9.0 @@ -22,6 +23,5 @@ dev_dependencies: analyzer_utilities: any lints: any linter: any - meta: any test_reflective_loader: any test: any