Skip to content

Commit 979f3ea

Browse files
scheglovCommit Bot
authored and
Commit Bot
committed
Use LibraryElement(s) to find extensions for 'Import Library' quick fix.
So, we don't need ExtensionCache anymore. This fixes the issue with importing a library from lib/src sometimes. Bug: #47842 Change-Id: I9a28fb2e1e14ab96a58c3ef72daa87562f1bccd6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/223441 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 7f07c9d commit 979f3ea

File tree

16 files changed

+112
-205
lines changed

16 files changed

+112
-205
lines changed

pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart

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

55
import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
6-
import 'package:analysis_server/src/services/completion/dart/extension_cache.dart';
76
import 'package:analyzer/dart/analysis/results.dart';
87
import 'package:analyzer/dart/element/element.dart';
98
import 'package:analyzer/instrumentation/service.dart';
@@ -13,9 +12,6 @@ import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
1312
///
1413
/// Clients may not extend, implement or mix-in this class.
1514
abstract class DartFixContext implements FixContext {
16-
/// Return the extension cache used to find available extensions.
17-
ExtensionCache get extensionCache;
18-
1915
/// Return the instrumentation service used to report errors that prevent a
2016
/// fix from being composed.
2117
InstrumentationService get instrumentationService;
@@ -31,4 +27,8 @@ abstract class DartFixContext implements FixContext {
3127
Future<Map<LibraryElement, List<Element>>> getTopLevelDeclarations(
3228
String name,
3329
);
30+
31+
/// Return libraries with extensions that declare non-static public
32+
/// extension members with the [memberName].
33+
Stream<LibraryElement> librariesWithExtensions(String memberName);
3434
}

pkg/analysis_server/lib/src/analysis_server.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,6 @@ class ServerContextManagerCallbacks extends ContextManagerCallbacks {
783783
var path = result.path;
784784

785785
analysisServer.getDocumentationCacheFor(result)?.cacheFromResult(result);
786-
analysisServer.getExtensionCacheFor(result)?.cacheFromResult(result);
787786

788787
var unit = result.unit;
789788
if (analysisServer._hasAnalysisServiceSubscription(

pkg/analysis_server/lib/src/analysis_server_abstract.dart

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import 'package:analysis_server/src/plugin/plugin_watcher.dart';
1515
import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
1616
import 'package:analysis_server/src/server/diagnostic_server.dart';
1717
import 'package:analysis_server/src/services/completion/dart/documentation_cache.dart';
18-
import 'package:analysis_server/src/services/completion/dart/extension_cache.dart';
1918
import 'package:analysis_server/src/services/correction/namespace.dart';
2019
import 'package:analysis_server/src/services/pub/pub_api.dart';
2120
import 'package:analysis_server/src/services/pub/pub_command.dart';
@@ -95,10 +94,6 @@ abstract class AbstractAnalysisServer {
9594
/// each context.
9695
Map<AnalysisContext, DocumentationCache> documentationForContext = {};
9796

98-
/// A map from analysis contexts to the extension cache associated with
99-
/// each context.
100-
Map<AnalysisContext, ExtensionCache> extensionForContext = {};
101-
10297
/// The DiagnosticServer for this AnalysisServer. If available, it can be used
10398
/// to start an http diagnostics server or return the port for an existing
10499
/// server.
@@ -252,7 +247,6 @@ abstract class AbstractAnalysisServer {
252247
void addContextsToDeclarationsTracker() {
253248
declarationsTracker?.discardContexts();
254249
documentationForContext.clear();
255-
extensionForContext.clear();
256250
for (var driver in driverMap.values) {
257251
declarationsTracker?.addContext(driver.analysisContext!);
258252
}
@@ -383,14 +377,6 @@ abstract class AbstractAnalysisServer {
383377
return element;
384378
}
385379

386-
/// Return the object used to cache information about extensions in the
387-
/// context that produced the [result], or `null` if there is no cache for the
388-
/// context.
389-
ExtensionCache? getExtensionCacheFor(ResolvedUnitResult result) {
390-
var context = result.session.analysisContext;
391-
return extensionForContext.putIfAbsent(context, () => ExtensionCache());
392-
}
393-
394380
/// Return a [Future] that completes with the resolved [AstNode] at the
395381
/// given [offset] of the given [file], or with `null` if there is no node as
396382
/// the [offset].

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,7 @@ class _CiderDartFixContextImpl extends DartFixContextImpl {
9797
}
9898
return result;
9999
}
100+
101+
@override
102+
Stream<LibraryElement> librariesWithExtensions(String memberName) async* {}
100103
}

pkg/analysis_server/lib/src/edit/edit_domain.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -603,8 +603,7 @@ class EditDomainHandler extends AbstractRequestHandler {
603603
if (errorLine == requestLine) {
604604
var workspace = DartChangeWorkspace(server.currentSessions);
605605
var context = DartFixContextImpl(
606-
server.instrumentationService, workspace, result, error,
607-
extensionCache: server.getExtensionCacheFor(result));
606+
server.instrumentationService, workspace, result, error);
608607

609608
List<Fix> fixes;
610609
try {

pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,8 +346,7 @@ class CodeActionHandler extends MessageHandler<CodeActionParams,
346346
}
347347
var workspace = DartChangeWorkspace(server.currentSessions);
348348
var context = DartFixContextImpl(
349-
server.instrumentationService, workspace, unit, error,
350-
extensionCache: server.getExtensionCacheFor(unit));
349+
server.instrumentationService, workspace, unit, error);
351350
final fixes = await fixContributor.computeFixes(context);
352351
if (fixes.isNotEmpty) {
353352
final diagnostic = toDiagnostic(

pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -896,7 +896,6 @@ class LspServerContextManagerCallbacks extends ContextManagerCallbacks {
896896
var path = result.path;
897897

898898
analysisServer.getDocumentationCacheFor(result)?.cacheFromResult(result);
899-
analysisServer.getExtensionCacheFor(result)?.cacheFromResult(result);
900899

901900
final unit = result.unit;
902901
if (analysisServer.shouldSendClosingLabelsFor(path)) {

pkg/analysis_server/lib/src/services/completion/dart/extension_cache.dart

Lines changed: 0 additions & 105 deletions
This file was deleted.

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

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

77
import 'package:_fe_analyzer_shared/src/scanner/token.dart';
88
import 'package:analysis_server/plugin/edit/fix/fix_dart.dart';
9-
import 'package:analysis_server/src/services/completion/dart/extension_cache.dart';
109
import 'package:analysis_server/src/services/correction/fix/data_driven/transform_override_set.dart';
1110
import 'package:analysis_server/src/services/correction/util.dart';
1211
import 'package:analysis_server/src/utilities/flutter.dart';
@@ -412,9 +411,6 @@ abstract class _AbstractCorrectionProducer {
412411
/// Returns the EOL to use for this [CompilationUnit].
413412
String get eol => utils.endOfLine;
414413

415-
/// Return the extension cache used to find available extensions.
416-
ExtensionCache get extensionCache => _context.dartFixContext!.extensionCache;
417-
418414
String get file => _context.file;
419415

420416
Flutter get flutter => Flutter.instance;
@@ -525,6 +521,12 @@ abstract class _AbstractCorrectionProducer {
525521
return false;
526522
}
527523

524+
/// Return libraries with extensions that declare non-static public
525+
/// extension members with the [memberName].
526+
Stream<LibraryElement> librariesWithExtensions(String memberName) {
527+
return _context.dartFixContext!.librariesWithExtensions(memberName);
528+
}
529+
528530
/// Return `true` if the given [node] is in a location where an implicit
529531
/// constructor invocation would be allowed.
530532
bool mightBeImplicitConstructor(AstNode node) {

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

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import 'package:analysis_server/src/services/correction/fix.dart';
99
import 'package:analysis_server/src/services/correction/namespace.dart';
1010
import 'package:analysis_server/src/services/linter/lint_names.dart';
1111
import 'package:analysis_server/src/utilities/extensions/element.dart';
12-
import 'package:analyzer/dart/analysis/results.dart';
1312
import 'package:analyzer/dart/ast/ast.dart';
1413
import 'package:analyzer/dart/element/element.dart';
1514
import 'package:analyzer/dart/element/type.dart';
@@ -45,16 +44,9 @@ class ImportLibrary extends MultiCorrectionProducer {
4544
if (targetType == null) {
4645
return;
4746
}
48-
var definingLibraries =
49-
extensionCache.membersByName[memberName]?.toList();
50-
if (definingLibraries != null) {
51-
for (var definingLibrary in definingLibraries) {
52-
var libraryPath = definingLibrary.libraryPath;
53-
var uri = sessionHelper.session.uriConverter.pathToUri(libraryPath);
54-
if (uri != null) {
55-
yield* _importExtensionInLibrary(uri, targetType, memberName);
56-
}
57-
}
47+
await for (var libraryToImport in librariesWithExtensions(memberName)) {
48+
yield* _importExtensionInLibrary(
49+
libraryToImport, targetType, memberName);
5850
}
5951
}
6052

@@ -146,15 +138,18 @@ class ImportLibrary extends MultiCorrectionProducer {
146138
}
147139

148140
Stream<CorrectionProducer> _importExtensionInLibrary(
149-
Uri uri, DartType targetType, String memberName) async* {
141+
LibraryElement libraryToImport,
142+
DartType targetType,
143+
String memberName,
144+
) async* {
150145
// Look to see whether the library at the [uri] is already imported. If it
151146
// is, then we can check the extension elements without needing to perform
152147
// additional analysis.
153148
var foundImport = false;
154149
for (var imp in libraryElement.imports) {
155150
// prepare element
156151
var importedLibrary = imp.importedLibrary;
157-
if (importedLibrary == null || importedLibrary.source.uri != uri) {
152+
if (importedLibrary == null || importedLibrary != libraryToImport) {
158153
continue;
159154
}
160155
foundImport = true;
@@ -169,8 +164,8 @@ class ImportLibrary extends MultiCorrectionProducer {
169164
// TODO(brianwilkerson) Support removing the extension name from a
170165
// hide combinator.
171166
} else if (combinator is ShowElementCombinator) {
172-
yield _ImportLibraryShow(
173-
uri.toString(), combinator, extension.name!);
167+
yield _ImportLibraryShow(libraryToImport.source.uri.toString(),
168+
combinator, extension.name!);
174169
}
175170
}
176171
}
@@ -180,7 +175,8 @@ class ImportLibrary extends MultiCorrectionProducer {
180175
// correction producer that will either add an import or not based on the
181176
// result of analyzing the library.
182177
if (!foundImport) {
183-
yield _ImportLibraryContainingExtension(uri, targetType, memberName);
178+
yield _ImportLibraryContainingExtension(
179+
libraryToImport, targetType, memberName);
184180
}
185181
}
186182

@@ -429,8 +425,8 @@ enum _ImportKind {
429425
/// A correction processor that can add an import of a library containing an
430426
/// extension, but which does so only if the extension applies to a given type.
431427
class _ImportLibraryContainingExtension extends CorrectionProducer {
432-
/// The URI of the library defining the extension.
433-
Uri uri;
428+
/// The library defining the extension.
429+
LibraryElement library;
434430

435431
/// The type of the target that the extension must apply to.
436432
DartType targetType;
@@ -441,7 +437,11 @@ class _ImportLibraryContainingExtension extends CorrectionProducer {
441437
/// The URI that is being proposed for the import directive.
442438
String _uriText = '';
443439

444-
_ImportLibraryContainingExtension(this.uri, this.targetType, this.memberName);
440+
_ImportLibraryContainingExtension(
441+
this.library,
442+
this.targetType,
443+
this.memberName,
444+
);
445445

446446
@override
447447
List<Object> get fixArguments => [_uriText];
@@ -451,16 +451,12 @@ class _ImportLibraryContainingExtension extends CorrectionProducer {
451451

452452
@override
453453
Future<void> compute(ChangeBuilder builder) async {
454-
var result = await sessionHelper.session.getLibraryByUri(uri.toString());
455-
if (result is LibraryElementResult) {
456-
var library = result.element;
457-
if (library
458-
.matchingExtensionsWithMember(libraryElement, targetType, memberName)
459-
.isNotEmpty) {
460-
await builder.addDartFileEdit(file, (builder) {
461-
_uriText = builder.importLibrary(uri);
462-
});
463-
}
454+
if (library
455+
.matchingExtensionsWithMember(libraryElement, targetType, memberName)
456+
.isNotEmpty) {
457+
await builder.addDartFileEdit(file, (builder) {
458+
_uriText = builder.importLibrary(library.source.uri);
459+
});
464460
}
465461
}
466462
}

0 commit comments

Comments
 (0)