From e22f0e80bbf8e88b5c4db9030abdcb0f8fccfc7e Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Mon, 14 Apr 2025 10:53:11 -0700 Subject: [PATCH] Fine. Rename BundleRequirementsManifest to RequirementsManifest. Also rename `linkingBundleManifest` to `globalResultRequirements`. Change-Id: Ia2ce5186d1be6eb97f3782ae2b08d1f4f4ddf52e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/422240 Commit-Queue: Konstantin Shcheglov Reviewed-by: Paul Berry --- .../lib/src/dart/analysis/driver.dart | 20 +- .../lib/src/dart/analysis/driver_event.dart | 9 +- .../lib/src/dart/analysis/file_state.dart | 2 +- .../src/dart/analysis/library_context.dart | 22 +- .../dart/element/inheritance_manager3.dart | 2 +- pkg/analyzer/lib/src/dart/element/scope.dart | 4 +- pkg/analyzer/lib/src/fine/requirements.dart | 344 +++++++++--------- .../test/src/dart/analysis/driver_test.dart | 2 +- .../src/dart/analysis/result_printer.dart | 16 +- 9 files changed, 210 insertions(+), 211 deletions(-) diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart index 8f5f13128a1..1646c5499c5 100644 --- a/pkg/analyzer/lib/src/dart/analysis/driver.dart +++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart @@ -1397,10 +1397,10 @@ class AnalysisDriver { libraryElement.typeSystem, strictCasts: analysisOptions.strictCasts); - BundleRequirementsManifest? libraryRequirements; + RequirementsManifest? requirements; if (withFineDependencies) { - libraryRequirements = BundleRequirementsManifest(); - linkingBundleManifest = libraryRequirements; + requirements = RequirementsManifest(); + globalResultRequirements = requirements; } var results = performance.run('LibraryAnalyzer', (performance) { @@ -1418,7 +1418,7 @@ class AnalysisDriver { }); if (withFineDependencies) { - linkingBundleManifest = null; + globalResultRequirements = null; } var isLibraryWithPriorityFile = _isLibraryWithPriorityFile(library); @@ -1479,7 +1479,7 @@ class AnalysisDriver { _updateHasErrorOrWarningFlag(unitFile, resolvedUnit.errors); } - if (withFineDependencies && libraryRequirements != null) { + if (withFineDependencies && requirements != null) { performance.run('writeResolvedLibrary', (_) { var mapSink = BufferedSink(); mapSink.writeMap( @@ -1490,12 +1490,12 @@ class AnalysisDriver { var mapBytes = mapSink.takeBytes(); library.lastResolutionResult = LibraryResolutionResult( - requirements: libraryRequirements!, + requirements: requirements!, bytes: mapBytes, ); var sink = BufferedSink(); - libraryRequirements.write(sink); + requirements.write(sink); sink.writeUint8List(mapBytes); var allBytes = sink.takeBytes(); @@ -1506,7 +1506,7 @@ class AnalysisDriver { _scheduler.eventsController.add( events.AnalyzedLibrary( library: library, - requirements: libraryRequirements, + requirements: requirements, ), ); } @@ -1784,7 +1784,7 @@ class AnalysisDriver { var reader = SummaryDataReader(reqAndUnitBytes); var requirements = performance.run('readRequirements', (_) { - return BundleRequirementsManifest.read(reader); + return RequirementsManifest.read(reader); }); var failure = requirements.isSatisfied( @@ -2099,7 +2099,7 @@ class AnalysisDriver { if (reqAndUnitBytes != null) { var reader = SummaryDataReader(reqAndUnitBytes); var requirements = performance.run('readRequirements', (_) { - return BundleRequirementsManifest.read(reader); + return RequirementsManifest.read(reader); }); var failure = requirements.isSatisfied( diff --git a/pkg/analyzer/lib/src/dart/analysis/driver_event.dart b/pkg/analyzer/lib/src/dart/analysis/driver_event.dart index 8655c507a06..a6e4f0bfc15 100644 --- a/pkg/analyzer/lib/src/dart/analysis/driver_event.dart +++ b/pkg/analyzer/lib/src/dart/analysis/driver_event.dart @@ -15,7 +15,7 @@ sealed class AnalysisDriverEvent {} /// The event after [library] analysis. final class AnalyzedLibrary extends AnalysisDriverEvent { final LibraryFileKind library; - final BundleRequirementsManifest? requirements; + final RequirementsManifest? requirements; AnalyzedLibrary({ required this.library, @@ -75,17 +75,16 @@ final class GetErrorsFromBytes extends AnalysisDriverEvent { } /// The event that libraries for [cycle] were linked, and accumulated the -/// [requirementsManifest] to be checked if we try to reuse the summary bundle -/// later. +/// [requirements] to be checked if we try to reuse the summary bundle later. final class LinkLibraryCycle extends AnalysisDriverEvent { final LinkedElementFactory elementFactory; final LibraryCycle cycle; - final BundleRequirementsManifest? requirementsManifest; + final RequirementsManifest? requirements; LinkLibraryCycle({ required this.elementFactory, required this.cycle, - required this.requirementsManifest, + required this.requirements, }); } diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart index 44fe468e7b7..8786030f630 100644 --- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart +++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart @@ -2135,7 +2135,7 @@ abstract class LibraryOrAugmentationFileKind extends FileKind { /// The resolution result for a library. class LibraryResolutionResult { - final BundleRequirementsManifest requirements; + final RequirementsManifest requirements; /// Approximately serialized map of file URIs to diagnostics. /// See uses for precise details. diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart index 64eb92e9c2d..c82b31db0fc 100644 --- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart +++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart @@ -207,8 +207,8 @@ class LibraryContext { Uint8List linkedBytes; try { if (withFineDependencies) { - var requirementsManifest = BundleRequirementsManifest(); - linkingBundleManifest = requirementsManifest; + var requirements = RequirementsManifest(); + globalResultRequirements = requirements; var linkResult = performance.run('link', (performance) { return link( @@ -219,7 +219,7 @@ class LibraryContext { inputLibraryManifests: inputLibraryManifests, ); }); - linkingBundleManifest = null; + globalResultRequirements = null; linkedBytes = linkResult.resolutionBytes; var newLibraryManifests = {}; @@ -234,16 +234,16 @@ class LibraryContext { elementFactory.libraryManifests.addAll(newLibraryManifests); }); - requirementsManifest.addExports( + requirements.addExports( elementFactory: elementFactory, libraryUriSet: cycle.libraryUris, ); - requirementsManifest.removeReqForLibs(cycle.libraryUris); + requirements.removeReqForLibs(cycle.libraryUris); bundleEntry = LinkedBundleEntry( apiSignature: cycle.nonTransitiveApiSignature, libraryManifests: newLibraryManifests, - requirements: requirementsManifest, + requirements: requirements, linkedBytes: linkedBytes, ); linkedBundleProvider.put( @@ -255,7 +255,7 @@ class LibraryContext { LinkLibraryCycle( elementFactory: elementFactory, cycle: cycle, - requirementsManifest: requirementsManifest, + requirements: requirements, ), ); } else { @@ -273,7 +273,7 @@ class LibraryContext { bundleEntry = LinkedBundleEntry( apiSignature: cycle.nonTransitiveApiSignature, libraryManifests: {}, - requirements: BundleRequirementsManifest(), + requirements: RequirementsManifest(), linkedBytes: linkedBytes, ); linkedBundleProvider.put( @@ -285,7 +285,7 @@ class LibraryContext { LinkLibraryCycle( elementFactory: elementFactory, cycle: cycle, - requirementsManifest: null, + requirements: null, ), ); } @@ -472,7 +472,7 @@ class LinkedBundleEntry { /// These requirements are to the libraries in dependencies. /// /// If [withFineDependencies] is `false`, the requirements are empty. - final BundleRequirementsManifest requirements; + final RequirementsManifest requirements; /// The serialized libraries, for [BundleReader]. final Uint8List linkedBytes; @@ -523,7 +523,7 @@ class LinkedBundleProvider { readKey: () => reader.readUri(), readValue: () => LibraryManifest.read(reader), ); - var requirements = BundleRequirementsManifest.read(reader); + var requirements = RequirementsManifest.read(reader); var linkedBytes = reader.readUint8List(); var result = LinkedBundleEntry( diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart index 60ab76145d2..1b564c55b0f 100644 --- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart +++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart @@ -328,7 +328,7 @@ class InheritanceManager3 { int forMixinIndex = -1, bool forSuper = false, }) { - linkingBundleManifest?.notifyInterfaceRequest( + globalResultRequirements?.notifyInterfaceRequest( element: element.asElement2, nameObj: name); var interface = getInterface(element); if (forSuper) { diff --git a/pkg/analyzer/lib/src/dart/element/scope.dart b/pkg/analyzer/lib/src/dart/element/scope.dart index 4149efdd419..5eddd9e76d4 100644 --- a/pkg/analyzer/lib/src/dart/element/scope.dart +++ b/pkg/analyzer/lib/src/dart/element/scope.dart @@ -580,9 +580,9 @@ class PrefixScope implements Scope { ); } - if (linkingBundleManifest case var linkingBundleManifest?) { + if (globalResultRequirements case var resultRequirements?) { for (var importedLibrary in _importedLibraries) { - linkingBundleManifest.notifyRequest( + resultRequirements.notifyRequest( importedLibrary: importedLibrary, nameStr: id, ); diff --git a/pkg/analyzer/lib/src/fine/requirements.dart b/pkg/analyzer/lib/src/fine/requirements.dart index 38c445a7cc5..f7fa114e629 100644 --- a/pkg/analyzer/lib/src/fine/requirements.dart +++ b/pkg/analyzer/lib/src/fine/requirements.dart @@ -18,14 +18,180 @@ import 'package:meta/meta.dart'; /// When [withFineDependencies], this variable might be set to accumulate /// requirements for the analysis result being computed. -BundleRequirementsManifest? linkingBundleManifest; +RequirementsManifest? globalResultRequirements; -/// Whether fine grained dependencies feature is enabled. +/// Whether fine-grained dependencies feature is enabled. /// /// This cannot be `const` because we change it in tests. bool withFineDependencies = false; -class BundleRequirementsManifest { +@visibleForTesting +class ExportRequirement { + final Uri fragmentUri; + final Uri exportedUri; + final List combinators; + final Map exportedIds; + + ExportRequirement({ + required this.fragmentUri, + required this.exportedUri, + required this.combinators, + required this.exportedIds, + }); + + factory ExportRequirement.read(SummaryDataReader reader) { + return ExportRequirement( + fragmentUri: reader.readUri(), + exportedUri: reader.readUri(), + combinators: reader.readTypedList( + () => ExportRequirementCombinator.read(reader), + ), + exportedIds: reader.readMap( + readKey: () => LookupName.read(reader), + readValue: () => ManifestItemId.read(reader), + ), + ); + } + + ExportFailure? isSatisfied({ + required LinkedElementFactory elementFactory, + }) { + var libraryElement = elementFactory.libraryOfUri(exportedUri); + var libraryManifest = libraryElement?.manifest; + if (libraryManifest == null) { + return ExportLibraryMissing(uri: exportedUri); + } + + // Every now exported ID must be previously exported. + var actualCount = 0; + for (var topEntry in libraryManifest.items.entries) { + var name = topEntry.key; + if (name.isPrivate) { + continue; + } + + if (!_passCombinators(name)) { + continue; + } + + actualCount++; + var actualId = topEntry.value.id; + var expectedId = exportedIds[topEntry.key]; + if (actualId != expectedId) { + return ExportIdMismatch( + fragmentUri: fragmentUri, + exportedUri: exportedUri, + name: name, + expectedId: expectedId, + actualId: actualId, + ); + } + } + + // Every now previously ID must be now exported. + if (exportedIds.length != actualCount) { + return ExportCountMismatch( + fragmentUri: fragmentUri, + exportedUri: exportedUri, + actualCount: actualCount, + requiredCount: exportedIds.length, + ); + } + + return null; + } + + void write(BufferedSink sink) { + sink.writeUri(fragmentUri); + sink.writeUri(exportedUri); + sink.writeList(combinators, (combinator) => combinator.write(sink)); + sink.writeMap( + exportedIds, + writeKey: (lookupName) => lookupName.write(sink), + writeValue: (id) => id.write(sink), + ); + } + + bool _passCombinators(LookupName lookupName) { + var baseName = lookupName.asBaseName; + for (var combinator in combinators) { + switch (combinator) { + case ExportRequirementHideCombinator(): + if (combinator.hiddenBaseNames.contains(baseName)) { + return false; + } + case ExportRequirementShowCombinator(): + if (!combinator.shownBaseNames.contains(baseName)) { + return false; + } + } + } + return true; + } +} + +@visibleForTesting +sealed class ExportRequirementCombinator { + ExportRequirementCombinator(); + + factory ExportRequirementCombinator.read(SummaryDataReader reader) { + var kind = reader.readEnum(_ExportRequirementCombinatorKind.values); + switch (kind) { + case _ExportRequirementCombinatorKind.hide: + return ExportRequirementHideCombinator.read(reader); + case _ExportRequirementCombinatorKind.show: + return ExportRequirementShowCombinator.read(reader); + } + } + + void write(BufferedSink sink); +} + +@visibleForTesting +final class ExportRequirementHideCombinator + extends ExportRequirementCombinator { + final Set hiddenBaseNames; + + ExportRequirementHideCombinator({ + required this.hiddenBaseNames, + }); + + factory ExportRequirementHideCombinator.read(SummaryDataReader reader) { + return ExportRequirementHideCombinator( + hiddenBaseNames: reader.readBaseNameSet(), + ); + } + + @override + void write(BufferedSink sink) { + sink.writeEnum(_ExportRequirementCombinatorKind.hide); + sink.writeBaseNameIterable(hiddenBaseNames); + } +} + +@visibleForTesting +final class ExportRequirementShowCombinator + extends ExportRequirementCombinator { + final Set shownBaseNames; + + ExportRequirementShowCombinator({ + required this.shownBaseNames, + }); + + factory ExportRequirementShowCombinator.read(SummaryDataReader reader) { + return ExportRequirementShowCombinator( + shownBaseNames: reader.readBaseNameSet(), + ); + } + + @override + void write(BufferedSink sink) { + sink.writeEnum(_ExportRequirementCombinatorKind.show); + sink.writeBaseNameIterable(shownBaseNames); + } +} + +class RequirementsManifest { /// LibraryUri => TopName => ID final Map> topLevels = {}; @@ -35,10 +201,10 @@ class BundleRequirementsManifest { final List exportRequirements = []; - BundleRequirementsManifest(); + RequirementsManifest(); - factory BundleRequirementsManifest.read(SummaryDataReader reader) { - var result = BundleRequirementsManifest(); + factory RequirementsManifest.read(SummaryDataReader reader) { + var result = RequirementsManifest(); Map readNameToIdMap() { return reader.readMap( @@ -322,172 +488,6 @@ class BundleRequirementsManifest { } } -@visibleForTesting -class ExportRequirement { - final Uri fragmentUri; - final Uri exportedUri; - final List combinators; - final Map exportedIds; - - ExportRequirement({ - required this.fragmentUri, - required this.exportedUri, - required this.combinators, - required this.exportedIds, - }); - - factory ExportRequirement.read(SummaryDataReader reader) { - return ExportRequirement( - fragmentUri: reader.readUri(), - exportedUri: reader.readUri(), - combinators: reader.readTypedList( - () => ExportRequirementCombinator.read(reader), - ), - exportedIds: reader.readMap( - readKey: () => LookupName.read(reader), - readValue: () => ManifestItemId.read(reader), - ), - ); - } - - ExportFailure? isSatisfied({ - required LinkedElementFactory elementFactory, - }) { - var libraryElement = elementFactory.libraryOfUri(exportedUri); - var libraryManifest = libraryElement?.manifest; - if (libraryManifest == null) { - return ExportLibraryMissing(uri: exportedUri); - } - - // Every now exported ID must be previously exported. - var actualCount = 0; - for (var topEntry in libraryManifest.items.entries) { - var name = topEntry.key; - if (name.isPrivate) { - continue; - } - - if (!_passCombinators(name)) { - continue; - } - - actualCount++; - var actualId = topEntry.value.id; - var expectedId = exportedIds[topEntry.key]; - if (actualId != expectedId) { - return ExportIdMismatch( - fragmentUri: fragmentUri, - exportedUri: exportedUri, - name: name, - expectedId: expectedId, - actualId: actualId, - ); - } - } - - // Every now previously ID must be now exported. - if (exportedIds.length != actualCount) { - return ExportCountMismatch( - fragmentUri: fragmentUri, - exportedUri: exportedUri, - actualCount: actualCount, - requiredCount: exportedIds.length, - ); - } - - return null; - } - - void write(BufferedSink sink) { - sink.writeUri(fragmentUri); - sink.writeUri(exportedUri); - sink.writeList(combinators, (combinator) => combinator.write(sink)); - sink.writeMap( - exportedIds, - writeKey: (lookupName) => lookupName.write(sink), - writeValue: (id) => id.write(sink), - ); - } - - bool _passCombinators(LookupName lookupName) { - var baseName = lookupName.asBaseName; - for (var combinator in combinators) { - switch (combinator) { - case ExportRequirementHideCombinator(): - if (combinator.hiddenBaseNames.contains(baseName)) { - return false; - } - case ExportRequirementShowCombinator(): - if (!combinator.shownBaseNames.contains(baseName)) { - return false; - } - } - } - return true; - } -} - -@visibleForTesting -sealed class ExportRequirementCombinator { - ExportRequirementCombinator(); - - factory ExportRequirementCombinator.read(SummaryDataReader reader) { - var kind = reader.readEnum(_ExportRequirementCombinatorKind.values); - switch (kind) { - case _ExportRequirementCombinatorKind.hide: - return ExportRequirementHideCombinator.read(reader); - case _ExportRequirementCombinatorKind.show: - return ExportRequirementShowCombinator.read(reader); - } - } - - void write(BufferedSink sink); -} - -@visibleForTesting -final class ExportRequirementHideCombinator - extends ExportRequirementCombinator { - final Set hiddenBaseNames; - - ExportRequirementHideCombinator({ - required this.hiddenBaseNames, - }); - - factory ExportRequirementHideCombinator.read(SummaryDataReader reader) { - return ExportRequirementHideCombinator( - hiddenBaseNames: reader.readBaseNameSet(), - ); - } - - @override - void write(BufferedSink sink) { - sink.writeEnum(_ExportRequirementCombinatorKind.hide); - sink.writeBaseNameIterable(hiddenBaseNames); - } -} - -@visibleForTesting -final class ExportRequirementShowCombinator - extends ExportRequirementCombinator { - final Set shownBaseNames; - - ExportRequirementShowCombinator({ - required this.shownBaseNames, - }); - - factory ExportRequirementShowCombinator.read(SummaryDataReader reader) { - return ExportRequirementShowCombinator( - shownBaseNames: reader.readBaseNameSet(), - ); - } - - @override - void write(BufferedSink sink) { - sink.writeEnum(_ExportRequirementCombinatorKind.show); - sink.writeBaseNameIterable(shownBaseNames); - } -} - enum _ExportRequirementCombinatorKind { hide, show, diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart index d97ba7f5667..762b1e692d0 100644 --- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart +++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart @@ -21753,7 +21753,7 @@ int get b => 0; withFineDependencies = true; configuration - ..withBundleRequirements = true + ..withResultRequirements = true ..withLibraryManifest = true ..withLinkBundleEvents = true; diff --git a/pkg/analyzer/test/src/dart/analysis/result_printer.dart b/pkg/analyzer/test/src/dart/analysis/result_printer.dart index f1217b3de16..61a54e561cb 100644 --- a/pkg/analyzer/test/src/dart/analysis/result_printer.dart +++ b/pkg/analyzer/test/src/dart/analysis/result_printer.dart @@ -42,7 +42,7 @@ class BundleRequirementsPrinter { required this.idProvider, }); - void write(BundleRequirementsManifest requirements) { + void write(RequirementsManifest requirements) { sink.writelnWithIndent('requirements'); sink.withIndent(() { _writeTopLevels(requirements); @@ -64,7 +64,7 @@ class BundleRequirementsPrinter { }); } - void _writeExportRequirements(BundleRequirementsManifest requirements) { + void _writeExportRequirements(RequirementsManifest requirements) { var exportRequirements = requirements.exportRequirements.sortedBy( (requirement) => requirement.exportedUri.toString(), ); @@ -82,7 +82,7 @@ class BundleRequirementsPrinter { }); } - void _writeInterfaceMembers(BundleRequirementsManifest requirements) { + void _writeInterfaceMembers(RequirementsManifest requirements) { var libEntries = requirements.interfaceMembers.sorted; sink.writeElements('interfaceMembers', libEntries, (libEntry) { var topEntries = libEntry.value.sorted; @@ -104,7 +104,7 @@ class BundleRequirementsPrinter { } } - void _writeTopLevels(BundleRequirementsManifest requirements) { + void _writeTopLevels(RequirementsManifest requirements) { var libEntries = requirements.topLevels.sorted; sink.writeElements('topLevels', libEntries, (libEntry) { var topEntries = libEntry.value.sorted; @@ -335,7 +335,7 @@ class DriverEventsPrinter { }); } } - _writeRequirements(object.requirementsManifest); + _writeRequirements(object.requirements); }); } @@ -394,8 +394,8 @@ class DriverEventsPrinter { } } - void _writeRequirements(BundleRequirementsManifest? requirements) { - if (!configuration.withBundleRequirements) { + void _writeRequirements(RequirementsManifest? requirements) { + if (!configuration.withResultRequirements) { return; } @@ -561,7 +561,7 @@ class DriverEventsPrinterConfiguration { var unitElementConfiguration = UnitElementPrinterConfiguration(); var errorsConfiguration = ErrorsResultPrinterConfiguration(); var elementTextConfiguration = ElementTextConfiguration(); - var withBundleRequirements = false; + var withResultRequirements = false; var withGetLibraryByUri = true; var withElementManifests = false; var withLibraryManifest = false;