Skip to content

Commit 0449e9e

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Tracking for LibraryElementImpl.metadata
Change-Id: I07f3b4827f58293c9c324d284c4b7d5ca011fa8d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/449683 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent 634d0bc commit 0449e9e

File tree

7 files changed

+1599
-915
lines changed

7 files changed

+1599
-915
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6301,8 +6301,10 @@ class LibraryElementImpl extends ElementImpl
63016301
String? get lookupName => null;
63026302

63036303
@override
6304+
@trackedDirectly
63046305
MetadataImpl get metadata {
63056306
_ensureReadResolution();
6307+
globalResultRequirements?.record_library_metadata(element: this);
63066308
return _metadata;
63076309
}
63086310

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

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class LibraryManifest {
2626
final String? name;
2727
final Uint8List featureSet;
2828
final ManifestLibraryLanguageVersion languageVersion;
29+
final LibraryMetadataItem libraryMetadata;
2930

3031
final List<Uri> exportedLibraryUris;
3132

@@ -54,6 +55,7 @@ class LibraryManifest {
5455
required this.name,
5556
required this.featureSet,
5657
required this.languageVersion,
58+
required this.libraryMetadata,
5759
required this.exportedLibraryUris,
5860
required this.reExportMap,
5961
required this.reExportDeprecatedOnly,
@@ -75,6 +77,7 @@ class LibraryManifest {
7577
name: reader.readOptionalStringUtf8(),
7678
featureSet: reader.readUint8List(),
7779
languageVersion: ManifestLibraryLanguageVersion.read(reader),
80+
libraryMetadata: LibraryMetadataItem.read(reader),
7881
exportedLibraryUris: reader.readUriList(),
7982
reExportMap: reader.readLookupNameToIdMap(),
8083
reExportDeprecatedOnly: reader.readLookupNameSet(),
@@ -156,6 +159,7 @@ class LibraryManifest {
156159
sink.writeOptionalStringUtf8(name);
157160
sink.writeUint8List(featureSet);
158161
languageVersion.write(sink);
162+
libraryMetadata.write(sink);
159163
sink.writeUriList(exportedLibraryUris);
160164
reExportMap.write(sink);
161165
reExportDeprecatedOnly.write(sink);
@@ -784,12 +788,19 @@ class LibraryManifestBuilder {
784788
var newTopLevelFunctions = <LookupName, TopLevelFunctionItem>{};
785789
var newTopLevelVariables = <LookupName, TopLevelVariableItem>{};
786790

791+
var libraryMetadataItem = _getOrBuildElementItem(libraryElement, () {
792+
return LibraryMetadataItem.encode(
793+
id: ManifestItemId.generate(),
794+
context: encodingContext,
795+
metadata: libraryElement.metadata,
796+
);
797+
});
798+
787799
for (var element in libraryElement.children) {
788800
var lookupName = element.lookupName?.asLookupName;
789801
if (lookupName == null) {
790802
continue;
791803
}
792-
793804
switch (element) {
794805
case ClassElementImpl():
795806
_addClass(
@@ -870,6 +881,7 @@ class LibraryManifestBuilder {
870881
languageVersion: ManifestLibraryLanguageVersion.encode(
871882
libraryElement.languageVersion,
872883
),
884+
libraryMetadata: libraryMetadataItem,
873885
exportedLibraryUris: libraryElement.exportedLibraries
874886
.map((e) => e.uri)
875887
.toList(),
@@ -1093,6 +1105,7 @@ class LibraryManifestBuilder {
10931105
name: null,
10941106
featureSet: Uint8List(0),
10951107
languageVersion: ManifestLibraryLanguageVersion.empty(),
1108+
libraryMetadata: LibraryMetadataItem.empty(),
10961109
exportedLibraryUris: [],
10971110
reExportMap: {},
10981111
reExportDeprecatedOnly: <LookupName>{},
@@ -1222,6 +1235,10 @@ class _LibraryMatch {
12221235
});
12231236

12241237
void compareStructures() {
1238+
if (!_matchLibraryMetadata()) {
1239+
structureMismatched.add(library);
1240+
}
1241+
12251242
for (var element in library.children) {
12261243
var name = element.lookupName?.asLookupName;
12271244
switch (element) {
@@ -1584,6 +1601,18 @@ class _LibraryMatch {
15841601
}
15851602
}
15861603

1604+
bool _matchLibraryMetadata() {
1605+
var item = manifest.libraryMetadata;
1606+
1607+
var matchContext = MatchContext(parent: null);
1608+
if (!item.match(matchContext, library)) {
1609+
return false;
1610+
}
1611+
1612+
_addMatchingElementItem(library, item, matchContext);
1613+
return true;
1614+
}
1615+
15871616
bool _matchMixin({
15881617
required LookupName? name,
15891618
required MixinElementImpl element,

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,44 @@ sealed class InterfaceItem<E extends InterfaceElementImpl>
848848
}
849849
}
850850

851+
class LibraryMetadataItem extends ManifestItem<LibraryElementImpl> {
852+
LibraryMetadataItem({
853+
required super.id,
854+
required super.flags,
855+
required super.metadata,
856+
});
857+
858+
factory LibraryMetadataItem.empty() {
859+
return LibraryMetadataItem(
860+
id: ManifestItemId.generate(),
861+
flags: _ManifestItemFlags.empty(),
862+
metadata: ManifestMetadata(annotations: []),
863+
);
864+
}
865+
866+
factory LibraryMetadataItem.encode({
867+
required ManifestItemId id,
868+
required EncodeContext context,
869+
required MetadataImpl metadata,
870+
}) {
871+
return LibraryMetadataItem(
872+
id: id,
873+
flags: _ManifestItemFlags.empty(),
874+
metadata: ManifestMetadata.encode(context, metadata),
875+
);
876+
}
877+
878+
factory LibraryMetadataItem.read(SummaryDataReader reader) {
879+
return LibraryMetadataItem(
880+
id: ManifestItemId.read(reader),
881+
flags: _ManifestItemFlags.read(reader),
882+
metadata: ManifestMetadata.read(reader),
883+
);
884+
}
885+
886+
bool get isEmpty => metadata.annotations.isEmpty;
887+
}
888+
851889
class ManifestAnnotation {
852890
final ManifestNode ast;
853891

@@ -1946,6 +1984,10 @@ extension type _ManifestItemFlags._(int _bits) {
19461984
static final int _base = 0;
19471985
static final int _next = _base + _ManifestItemFlag.values.length;
19481986

1987+
factory _ManifestItemFlags.empty() {
1988+
return _ManifestItemFlags._(0);
1989+
}
1990+
19491991
factory _ManifestItemFlags.encode(ElementImpl element) {
19501992
var bits = 0;
19511993
if (element.isSynthetic) {
@@ -1954,6 +1996,10 @@ extension type _ManifestItemFlags._(int _bits) {
19541996
return _ManifestItemFlags._(bits);
19551997
}
19561998

1999+
factory _ManifestItemFlags.read(SummaryDataReader reader) {
2000+
return _ManifestItemFlags._(reader.readUint30());
2001+
}
2002+
19572003
bool get isSynthetic {
19582004
return _has(_ManifestItemFlag.isSynthetic);
19592005
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,15 @@ class LibraryLanguageVersionMismatch extends RequirementFailure {
352352
}
353353
}
354354

355+
class LibraryMetadataMismatch extends RequirementFailure {
356+
final Uri libraryUri;
357+
358+
LibraryMetadataMismatch({required this.libraryUri});
359+
360+
@override
361+
String toString() => 'LibraryMetadataMismatch(libraryUri: $libraryUri)';
362+
}
363+
355364
class LibraryMissing extends RequirementFailure {
356365
final Uri uri;
357366

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,7 @@ class LibraryRequirements {
374374
String? name;
375375
Uint8List? featureSet;
376376
ManifestLibraryLanguageVersion? languageVersion;
377+
ManifestItemId? libraryMetadataId;
377378

378379
List<Uri>? exportedLibraryUris;
379380

@@ -418,6 +419,7 @@ class LibraryRequirements {
418419
required this.name,
419420
required this.featureSet,
420421
required this.languageVersion,
422+
required this.libraryMetadataId,
421423
required this.exportedLibraryUris,
422424
required this.exportedTopLevels,
423425
required this.instances,
@@ -451,6 +453,7 @@ class LibraryRequirements {
451453
name: null,
452454
featureSet: null,
453455
languageVersion: null,
456+
libraryMetadataId: null,
454457
exportedLibraryUris: null,
455458
exportedTopLevels: {},
456459
instances: {},
@@ -485,6 +488,7 @@ class LibraryRequirements {
485488
name: reader.readOptionalStringUtf8(),
486489
featureSet: reader.readOptionalUint8List(),
487490
languageVersion: ManifestLibraryLanguageVersion.readOptional(reader),
491+
libraryMetadataId: ManifestItemId.readOptional(reader),
488492
exportedLibraryUris: reader.readOptionalUriList(),
489493
exportedTopLevels: reader.readNameToOptionalIdMap(),
490494
instances: reader.readMap(
@@ -527,6 +531,7 @@ class LibraryRequirements {
527531
sink.writeOptionalStringUtf8(name);
528532
sink.writeOptionalUint8List(featureSet);
529533
sink.writeOptionalObject(languageVersion, (it) => it.write(sink));
534+
libraryMetadataId.writeOptional(sink);
530535
sink.writeOptionalUriList(exportedLibraryUris);
531536
sink.writeNameToIdMap(exportedTopLevels);
532537

@@ -743,6 +748,13 @@ class RequirementsManifest {
743748
}
744749
}
745750

751+
if (libraryRequirements.libraryMetadataId case var expectedId?) {
752+
var actualId = libraryManifest.libraryMetadata.id;
753+
if (actualId != expectedId) {
754+
return LibraryMetadataMismatch(libraryUri: libraryUri);
755+
}
756+
}
757+
746758
for (var topLevelEntry in libraryRequirements.exportedTopLevels.entries) {
747759
var name = topLevelEntry.key;
748760
var actualId = libraryManifest.getExportedId(name);
@@ -2048,6 +2060,20 @@ class RequirementsManifest {
20482060
requirements.languageVersion = manifest.languageVersion;
20492061
}
20502062

2063+
void record_library_metadata({required LibraryElementImpl element}) {
2064+
if (_recordingLockLevel != 0) {
2065+
return;
2066+
}
2067+
2068+
var manifest = element.manifest;
2069+
if (manifest == null) {
2070+
return;
2071+
}
2072+
2073+
var requirements = _getLibraryRequirements(element);
2074+
requirements.libraryMetadataId ??= manifest.libraryMetadata.id;
2075+
}
2076+
20512077
/// Record that all accessible extensions inside a [LibraryFragmentImpl]
20522078
/// are requested, which means dependency on all extensions exported
20532079
/// from [importedLibraries].

0 commit comments

Comments
 (0)