Skip to content

Commit 49a8721

Browse files
committed
Fine. Tracking for LibraryElementImpl.exportNamespace
Change-Id: I175f032c551e4993a1959e7ba0aa1a48c8e4345e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/449981 Reviewed-by: Johnni Winther <[email protected]>
1 parent 942989e commit 49a8721

File tree

4 files changed

+645
-76
lines changed

4 files changed

+645
-76
lines changed

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import 'package:analyzer/src/dart/element/type_algebra.dart';
4242
import 'package:analyzer/src/dart/element/type_provider.dart';
4343
import 'package:analyzer/src/dart/element/type_system.dart';
4444
import 'package:analyzer/src/dart/resolver/scope.dart'
45-
show Namespace, NamespaceBuilder;
45+
show Namespace, NamespaceBuilder, RecordingExportNamespace;
4646
import 'package:analyzer/src/error/inference_error.dart';
4747
import 'package:analyzer/src/fine/annotations.dart';
4848
import 'package:analyzer/src/fine/library_manifest.dart';
@@ -6111,9 +6111,13 @@ class LibraryElementImpl extends ElementImpl
61116111
}
61126112

61136113
@override
6114+
@trackedDirectly
61146115
Namespace get exportNamespace {
61156116
_ensureReadResolution();
6116-
return _exportNamespace ??= Namespace({});
6117+
return RecordingExportNamespace(
6118+
owner: this,
6119+
base: _exportNamespace ??= Namespace({}),
6120+
);
61176121
}
61186122

61196123
set exportNamespace(Namespace exportNamespace) {

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:_fe_analyzer_shared/src/scanner/string_canonicalizer.dart';
77
import 'package:analyzer/dart/element/element.dart';
88
import 'package:analyzer/src/dart/ast/ast.dart';
99
import 'package:analyzer/src/dart/element/element.dart';
10+
import 'package:analyzer/src/fine/requirements.dart';
1011
import 'package:analyzer/src/generated/engine.dart';
1112

1213
/// The scope defined by a block.
@@ -325,3 +326,35 @@ class PrefixedNamespace implements Namespace {
325326
return null;
326327
}
327328
}
329+
330+
class RecordingExportNamespace implements Namespace {
331+
final LibraryElementImpl owner;
332+
final Namespace base;
333+
334+
RecordingExportNamespace({required this.owner, required this.base});
335+
336+
@override
337+
Map<String, Element> get definedNames2 {
338+
globalResultRequirements?.record_library_allExportedTopLevels(
339+
element: owner,
340+
);
341+
return base.definedNames2;
342+
}
343+
344+
@override
345+
Map<String, Element> get _definedNames => throw UnimplementedError();
346+
347+
@override
348+
Element? get2(String name) {
349+
globalResultRequirements?.record_library_exportScope_get(
350+
element: owner,
351+
name: name,
352+
);
353+
return base.get2(name);
354+
}
355+
356+
@override
357+
Element? getPrefixed2(String prefix, String name) {
358+
return base.getPrefixed2(prefix, name);
359+
}
360+
}

pkg/analyzer/lib/src/fine/requirements.dart

Lines changed: 115 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import 'package:analyzer/src/fine/manifest_id.dart';
1515
import 'package:analyzer/src/fine/manifest_item.dart';
1616
import 'package:analyzer/src/fine/requirement_failure.dart';
1717
import 'package:analyzer/src/summary2/linked_element_factory.dart';
18+
import 'package:analyzer/src/utilities/extensions/string.dart';
1819
import 'package:collection/collection.dart';
1920
import 'package:meta/meta.dart';
2021

@@ -368,6 +369,84 @@ class LibraryExportRequirements {
368369
declaredTopNames.write(sink);
369370
sink.writeList(exports, (export) => export.write(sink));
370371
}
372+
373+
static LibraryExportRequirements? build(LibraryElementImpl libraryElement) {
374+
var declaredTopNames = libraryElement.children
375+
.map((element) => element.lookupName)
376+
.nonNulls
377+
.map((nameStr) => nameStr.asLookupName)
378+
.toSet();
379+
380+
var fragments = <ExportRequirement>[];
381+
382+
for (var fragment in libraryElement.fragments) {
383+
for (var export in fragment.libraryExports) {
384+
var exportedLibrary = export.exportedLibrary;
385+
386+
// If no library, then there is nothing to re-export.
387+
if (exportedLibrary == null) {
388+
continue;
389+
}
390+
391+
var combinators = export.combinators.map((combinator) {
392+
switch (combinator) {
393+
case HideElementCombinator():
394+
return ExportRequirementHideCombinator(
395+
hiddenBaseNames: combinator.hiddenNames.toBaseNameSet(),
396+
);
397+
case ShowElementCombinator():
398+
return ExportRequirementShowCombinator(
399+
shownBaseNames: combinator.shownNames.toBaseNameSet(),
400+
);
401+
}
402+
}).toList();
403+
404+
// SAFETY: every library has the manifest.
405+
var manifest = exportedLibrary.manifest!;
406+
407+
var exportMap = globalResultRequirements.untracked(
408+
reason: 'Recoding requirements',
409+
operation: () {
410+
return NamespaceBuilder()
411+
.createExportNamespaceForDirective2(export)
412+
.definedNames2;
413+
},
414+
);
415+
416+
var exportedIds = <LookupName, ManifestItemId>{};
417+
for (var entry in exportMap.entries) {
418+
var lookupName = entry.key.asLookupName;
419+
if (declaredTopNames.contains(lookupName)) {
420+
continue;
421+
}
422+
// TODO(scheglov): must always be not null.
423+
var id = manifest.getExportedId(lookupName);
424+
if (id != null) {
425+
exportedIds[lookupName] = id;
426+
}
427+
}
428+
429+
fragments.add(
430+
ExportRequirement(
431+
fragmentUri: fragment.source.uri,
432+
exportedUri: exportedLibrary.uri,
433+
combinators: combinators,
434+
exportedIds: exportedIds,
435+
),
436+
);
437+
}
438+
}
439+
440+
if (fragments.isNotEmpty) {
441+
return LibraryExportRequirements(
442+
libraryUri: libraryElement.uri,
443+
declaredTopNames: declaredTopNames,
444+
exports: fragments,
445+
);
446+
} else {
447+
return null;
448+
}
449+
}
371450
}
372451

373452
class LibraryRequirements {
@@ -670,8 +749,11 @@ class RequirementsManifest {
670749
required Set<Uri> libraryUriSet,
671750
}) {
672751
for (var libraryUri in libraryUriSet) {
673-
var libraryElement = elementFactory.libraryOfUri2(libraryUri);
674-
_addExports(libraryElement);
752+
var element = elementFactory.libraryOfUri2(libraryUri);
753+
var exports = LibraryExportRequirements.build(element);
754+
if (exports != null) {
755+
exportRequirements.add(exports);
756+
}
675757
}
676758
}
677759

@@ -1408,6 +1490,11 @@ class RequirementsManifest {
14081490
required String id,
14091491
}) {
14101492
assert(!id.endsWith('='));
1493+
1494+
if (_recordingLockLevel != 0) {
1495+
return;
1496+
}
1497+
14111498
var getterLookupName = id.asLookupName;
14121499
var setterLookupName = '$id='.asLookupName;
14131500

@@ -1720,6 +1807,22 @@ class RequirementsManifest {
17201807
);
17211808
}
17221809

1810+
void record_library_allExportedTopLevels({
1811+
required LibraryElementImpl element,
1812+
}) {
1813+
if (_recordingLockLevel != 0) {
1814+
return;
1815+
}
1816+
1817+
var manifest = element.manifest;
1818+
if (manifest == null) {
1819+
return;
1820+
}
1821+
1822+
var requirements = _getLibraryRequirements(element);
1823+
requirements.exportedTopLevels.addAll(manifest.exportedIds);
1824+
}
1825+
17231826
void record_library_allExtensions({required LibraryElementImpl element}) {
17241827
if (_recordingLockLevel != 0) {
17251828
return;
@@ -1882,6 +1985,16 @@ class RequirementsManifest {
18821985
requirements.exportedLibraryUris = manifest.exportedLibraryUris;
18831986
}
18841987

1988+
void record_library_exportScope_get({
1989+
required LibraryElementImpl element,
1990+
required String name,
1991+
}) {
1992+
record_importPrefixScope_lookup(
1993+
importedLibraries: [element],
1994+
id: name.removeSuffix('=') ?? name,
1995+
);
1996+
}
1997+
18851998
void record_library_featureSet({required LibraryElementImpl element}) {
18861999
if (_recordingLockLevel != 0) {
18872000
return;
@@ -2207,78 +2320,6 @@ class RequirementsManifest {
22072320
sink.writeList(opaqueApiUses, (usage) => usage.write(sink));
22082321
}
22092322

2210-
void _addExports(LibraryElementImpl libraryElement) {
2211-
var declaredTopNames = libraryElement.children
2212-
.map((element) => element.lookupName)
2213-
.nonNulls
2214-
.map((nameStr) => nameStr.asLookupName)
2215-
.toSet();
2216-
2217-
var fragments = <ExportRequirement>[];
2218-
2219-
for (var fragment in libraryElement.fragments) {
2220-
for (var export in fragment.libraryExports) {
2221-
var exportedLibrary = export.exportedLibrary;
2222-
2223-
// If no library, then there is nothing to re-export.
2224-
if (exportedLibrary == null) {
2225-
continue;
2226-
}
2227-
2228-
var combinators = export.combinators.map((combinator) {
2229-
switch (combinator) {
2230-
case HideElementCombinator():
2231-
return ExportRequirementHideCombinator(
2232-
hiddenBaseNames: combinator.hiddenNames.toBaseNameSet(),
2233-
);
2234-
case ShowElementCombinator():
2235-
return ExportRequirementShowCombinator(
2236-
shownBaseNames: combinator.shownNames.toBaseNameSet(),
2237-
);
2238-
}
2239-
}).toList();
2240-
2241-
// SAFETY: every library has the manifest.
2242-
var manifest = exportedLibrary.manifest!;
2243-
2244-
var exportedIds = <LookupName, ManifestItemId>{};
2245-
var exportMap = NamespaceBuilder().createExportNamespaceForDirective2(
2246-
export,
2247-
);
2248-
for (var entry in exportMap.definedNames2.entries) {
2249-
var lookupName = entry.key.asLookupName;
2250-
if (declaredTopNames.contains(lookupName)) {
2251-
continue;
2252-
}
2253-
// TODO(scheglov): must always be not null.
2254-
var id = manifest.getExportedId(lookupName);
2255-
if (id != null) {
2256-
exportedIds[lookupName] = id;
2257-
}
2258-
}
2259-
2260-
fragments.add(
2261-
ExportRequirement(
2262-
fragmentUri: fragment.source.uri,
2263-
exportedUri: exportedLibrary.uri,
2264-
combinators: combinators,
2265-
exportedIds: exportedIds,
2266-
),
2267-
);
2268-
}
2269-
}
2270-
2271-
if (fragments.isNotEmpty) {
2272-
exportRequirements.add(
2273-
LibraryExportRequirements(
2274-
libraryUri: libraryElement.uri,
2275-
declaredTopNames: declaredTopNames,
2276-
exports: fragments,
2277-
),
2278-
);
2279-
}
2280-
}
2281-
22822323
_InstanceItemWithRequirements? _getInstanceItem(InstanceElementImpl element) {
22832324
var libraryElement = element.library;
22842325
var manifest = libraryElement.manifest;

0 commit comments

Comments
 (0)