Skip to content

Commit 6253555

Browse files
srawlinsCommit Queue
authored andcommitted
DAS: Only yield libraries that provide an extension member with a given name
The `DartFixContext.librariesWithExtensions` utility function accepts a `memberName` parameter but never did anything with it. This change adds filtering in that function based on the member name. This code depends on the set of exported extensions, which is provided in an extension (`LibraryElementExtensions.exportedExtensions`) in the analysis_server package, which must be moved to the analyzer package. Change-Id: I06c8a9a0e11ceb70e75517b30c0b048321d6b024 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/418641 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 3718ed6 commit 6253555

File tree

8 files changed

+29
-16
lines changed

8 files changed

+29
-16
lines changed

pkg/analysis_server/lib/src/cider/fixes.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,5 @@ class _CiderDartFixContextImpl extends DartFixContext {
101101
}
102102

103103
@override
104-
Stream<LibraryElement2> librariesWithExtensions(String memberName) async* {}
104+
Stream<LibraryElement2> librariesWithExtensions(Name memberName) async* {}
105105
}

pkg/analysis_server/lib/src/services/correction/dart/import_library.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import 'dart:collection';
66

77
import 'package:analysis_server/src/services/correction/fix.dart';
88
import 'package:analysis_server/src/services/correction/namespace.dart';
9-
import 'package:analysis_server/src/utilities/extensions/element.dart';
109
import 'package:analysis_server/src/utilities/extensions/iterable.dart';
1110
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
1211
import 'package:analysis_server_plugin/edit/fix/dart_fix_context.dart';
@@ -21,6 +20,7 @@ import 'package:analyzer/source/source_range.dart';
2120
import 'package:analyzer/src/dart/ast/extensions.dart';
2221
import 'package:analyzer/src/dart/element/type.dart';
2322
import 'package:analyzer/src/dart/resolver/applicable_extensions.dart';
23+
import 'package:analyzer/utilities/extensions/element.dart';
2424
import 'package:analyzer/utilities/extensions/uri.dart';
2525
import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart';
2626
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -508,7 +508,7 @@ class ImportLibrary extends MultiCorrectionProducer {
508508
dartFixContext.unitResult.libraryElement2,
509509
memberName,
510510
);
511-
await for (var libraryToImport in librariesWithExtensions(memberName)) {
511+
await for (var libraryToImport in librariesWithExtensions(name)) {
512512
names.addAll(
513513
_namesForExtensionInLibrary(libraryToImport, finalTargetType, name),
514514
);

pkg/analysis_server/lib/src/services/correction/dart/use_different_division_operator.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analysis_server/src/services/correction/fix.dart';
6-
import 'package:analysis_server/src/utilities/extensions/element.dart';
76
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
87
import 'package:analyzer/dart/ast/ast.dart';
98
import 'package:analyzer/dart/ast/token.dart';
109
import 'package:analyzer/dart/element/element2.dart';
1110
import 'package:analyzer/dart/element/type.dart';
1211
import 'package:analyzer/src/dart/element/type.dart';
1312
import 'package:analyzer/src/dart/resolver/applicable_extensions.dart';
13+
import 'package:analyzer/utilities/extensions/element.dart';
1414
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
1515
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
1616
import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -108,7 +108,7 @@ class _UseDifferentDivisionOperator extends ResolvedCorrectionProducer {
108108
otherOperator.lexeme,
109109
);
110110
var hasNoExtensionWithOtherDivisionOperator =
111-
await librariesWithExtensions(otherOperator.lexeme).where((library) {
111+
await librariesWithExtensions(name).where((library) {
112112
return library.exportedExtensions
113113
.havingMemberWithBaseName(name)
114114
.applicableTo(

pkg/analysis_server/lib/src/utilities/extensions/element.dart

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,6 @@ extension FragmentExtensions on Fragment {
8787
}
8888
}
8989

90-
extension LibraryElementExtensions on LibraryElement2 {
91-
/// Return all extensions exported from this library.
92-
Iterable<ExtensionElement2> get exportedExtensions {
93-
return exportNamespace.definedNames2.values.whereType();
94-
}
95-
}
96-
9790
extension MethodElementExtensions on MethodElement2 {
9891
/// Return `true` if this element represents the method `cast` from either
9992
/// `Iterable`, `List`, `Map`, or `Set`.

pkg/analysis_server_plugin/lib/edit/dart/correction_producer.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -779,7 +779,7 @@ sealed class _AbstractCorrectionProducer<T extends ParsedUnitResult> {
779779

780780
/// Returns libraries with extensions that declare non-static public
781781
/// extension members with the [memberName].
782-
Stream<LibraryElement2> librariesWithExtensions(String memberName) {
782+
Stream<LibraryElement2> librariesWithExtensions(Name memberName) {
783783
return _context.dartFixContext!.librariesWithExtensions(memberName);
784784
}
785785
}

pkg/analysis_server_plugin/lib/edit/fix/dart_fix_context.dart

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import 'package:analyzer/error/error.dart';
1010
import 'package:analyzer/instrumentation/service.dart';
1111
import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
1212
import 'package:analyzer/src/dart/analysis/file_state_filter.dart';
13+
import 'package:analyzer/src/dart/resolver/applicable_extensions.dart';
1314
import 'package:analyzer/src/services/top_level_declarations.dart';
15+
import 'package:analyzer/utilities/extensions/element.dart';
1416

1517
/// An object used to provide context information for Dart fix contributors.
1618
///
@@ -61,8 +63,7 @@ class DartFixContext implements FixContext {
6163

6264
/// Returns libraries with extensions that declare non-static public
6365
/// extension members with the [memberName].
64-
// TODO(srawlins): The documentation above is wrong; `memberName` is unused.
65-
Stream<LibraryElement2> librariesWithExtensions(String memberName) async* {
66+
Stream<LibraryElement2> librariesWithExtensions(Name memberName) async* {
6667
var analysisContext = unitResult.session.analysisContext;
6768
if (analysisContext is! DriverBasedAnalysisContext) {
6869
return;
@@ -86,7 +87,11 @@ class DartFixContext implements FixContext {
8687
continue;
8788
}
8889

89-
yield elementResult.element2;
90+
if (elementResult.element2.exportedExtensions
91+
.havingMemberWithBaseName(memberName)
92+
.isNotEmpty) {
93+
yield elementResult.element2;
94+
}
9095
}
9196
}
9297
}

pkg/analyzer/api.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5318,6 +5318,9 @@ package:analyzer/src/task/api/model.dart:
53185318
source (getter: Source?)
53195319
package:analyzer/src/workspace/workspace.dart:
53205320
Workspace (non-public)
5321+
package:analyzer/utilities/extensions/element.dart:
5322+
LibraryElement2Extensions (extension on LibraryElement2):
5323+
exportedExtensions (getter: Iterable<ExtensionElement2>)
53215324
package:analyzer/utilities/extensions/uri.dart:
53225325
UriExtension (extension on Uri):
53235326
isImplementation (getter: bool)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:analyzer/dart/element/element2.dart';
6+
7+
extension LibraryElement2Extensions on LibraryElement2 {
8+
/// All extensions exported from this library.
9+
Iterable<ExtensionElement2> get exportedExtensions {
10+
return exportNamespace.definedNames2.values.whereType();
11+
}
12+
}

0 commit comments

Comments
 (0)