Skip to content

Commit 1967514

Browse files
scheglovCommit Queue
authored and
Commit Queue
committed
Parts. Move the element to imports map to tracking, fix heap usage.
Change-Id: I9debc9fe1633db3ee3c7d6001a4599746672052d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/384442 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 5a4bcb2 commit 1967514

File tree

1 file changed

+24
-8
lines changed

1 file changed

+24
-8
lines changed

pkg/analyzer/lib/src/dart/element/scope.dart

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,10 @@ class ImportsTracking {
137137

138138
class ImportsTrackingOfPrefix {
139139
final PrefixScope scope;
140-
final Map<Element, List<LibraryImportElementImpl>> elementImports;
140+
141+
/// Key: an element.
142+
/// Value: the imports that provide the element.
143+
final Map<Element, List<LibraryImportElementImpl>> _elementImports = {};
141144

142145
/// Key: an import.
143146
/// Value: used elements imported from the import.
@@ -159,8 +162,9 @@ class ImportsTrackingOfPrefix {
159162

160163
ImportsTrackingOfPrefix({
161164
required this.scope,
162-
required this.elementImports,
163-
});
165+
}) {
166+
_buildElementToImportsMap();
167+
}
164168

165169
/// The elements that are used from [import].
166170
Set<Element> elementsOf(LibraryImportElementImpl import) {
@@ -218,14 +222,14 @@ class ImportsTrackingOfPrefix {
218222
}
219223

220224
// SAFETY: if we have `element`, it is from a local import.
221-
var imports = elementImports[element]!;
225+
var imports = _elementImports[element]!;
222226
for (var import in imports) {
223227
(importToUsedElements[import] ??= {}).add(element);
224228
}
225229
}
226230

227231
void notifyExtensionUsed(ExtensionElement element) {
228-
var imports = elementImports[element];
232+
var imports = _elementImports[element];
229233
if (imports != null) {
230234
for (var import in imports) {
231235
(importToUsedElements[import] ??= {}).add(element);
@@ -242,6 +246,21 @@ class ImportsTrackingOfPrefix {
242246
void notifyPrefixUsedInCommentReference() {
243247
hasPrefixUsedInCommentReference = true;
244248
}
249+
250+
void _buildElementToImportsMap() {
251+
for (var import in scope._importElements) {
252+
var importedLibrary = import.importedLibrary!;
253+
var elementFactory = importedLibrary.session.elementFactory;
254+
var combinators = import.combinators.build();
255+
for (var exportedReference in importedLibrary.exportedReferences) {
256+
var reference = exportedReference.reference;
257+
if (combinators.allows(reference.name)) {
258+
var element = elementFactory.elementOfReference(reference)!;
259+
(_elementImports[element] ??= []).add(import);
260+
}
261+
}
262+
}
263+
}
245264
}
246265

247266
/// The scope defined by an instance element.
@@ -482,7 +501,6 @@ class PrefixScope implements Scope {
482501
final PrefixScope? parent;
483502

484503
final List<LibraryImportElementImpl> _importElements = [];
485-
final Map<Element, List<LibraryImportElementImpl>> _elementImports = {};
486504

487505
final Map<String, Element> _getters = {};
488506
final Map<String, Element> _setters = {};
@@ -512,7 +530,6 @@ class PrefixScope implements Scope {
512530
if (combinators.allows(reference.name)) {
513531
var element = elementFactory.elementOfReference(reference)!;
514532
if (_shouldAdd(importedLibrary, element)) {
515-
(_elementImports[element] ??= []).add(import);
516533
_add(
517534
element,
518535
importedLibrary.isFromDeprecatedExport(exportedReference),
@@ -534,7 +551,6 @@ class PrefixScope implements Scope {
534551
ImportsTrackingOfPrefix importsTrackingInit() {
535552
return _importsTracking = ImportsTrackingOfPrefix(
536553
scope: this,
537-
elementImports: _elementImports,
538554
);
539555
}
540556

0 commit comments

Comments
 (0)