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 <scheglov@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
This commit is contained in:
Konstantin Shcheglov
2025-04-14 10:53:11 -07:00
committed by Commit Queue
parent d057a3311e
commit e22f0e80bb
9 changed files with 210 additions and 211 deletions
+10 -10
View File
@@ -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(
@@ -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,
});
}
@@ -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.
@@ -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 = <Uri, LibraryManifest>{};
@@ -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(
@@ -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) {
+2 -2
View File
@@ -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,
);
+172 -172
View File
@@ -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<ExportRequirementCombinator> combinators;
final Map<LookupName, ManifestItemId> 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<BaseName> 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<BaseName> 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<Uri, Map<LookupName, ManifestItemId?>> topLevels = {};
@@ -35,10 +201,10 @@ class BundleRequirementsManifest {
final List<ExportRequirement> exportRequirements = [];
BundleRequirementsManifest();
RequirementsManifest();
factory BundleRequirementsManifest.read(SummaryDataReader reader) {
var result = BundleRequirementsManifest();
factory RequirementsManifest.read(SummaryDataReader reader) {
var result = RequirementsManifest();
Map<LookupName, ManifestItemId?> readNameToIdMap() {
return reader.readMap(
@@ -322,172 +488,6 @@ class BundleRequirementsManifest {
}
}
@visibleForTesting
class ExportRequirement {
final Uri fragmentUri;
final Uri exportedUri;
final List<ExportRequirementCombinator> combinators;
final Map<LookupName, ManifestItemId> 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<BaseName> 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<BaseName> 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,
@@ -21753,7 +21753,7 @@ int get b => 0;
withFineDependencies = true;
configuration
..withBundleRequirements = true
..withResultRequirements = true
..withLibraryManifest = true
..withLinkBundleEvents = true;
@@ -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;