Skip to content

Commit 78697d9

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Tracking for LibraryElementImpl.exportedLibraries
Change-Id: Ia2a74667f97efbbb45dde7b95e4649edbc1a55dc Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/449681 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent 2ee25c7 commit 78697d9

File tree

9 files changed

+279
-2
lines changed

9 files changed

+279
-2
lines changed

pkg/analyzer/lib/src/binary/binary_reader.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,14 @@ class SummaryDataReader {
135135
}
136136
}
137137

138+
List<Uri>? readOptionalUriList() {
139+
if (readBool()) {
140+
return readUriList();
141+
} else {
142+
return null;
143+
}
144+
}
145+
138146
String readStringReference() {
139147
var index = readUint30();
140148
return stringOfIndex(index);
@@ -237,6 +245,10 @@ class SummaryDataReader {
237245
return Uri.parse(uriStr);
238246
}
239247

248+
List<Uri> readUriList() {
249+
return readTypedList(readUri);
250+
}
251+
240252
/// Temporary move to [offset] and run [operation].
241253
void runAtOffset(int offset, void Function() operation) {
242254
var oldOffset = this.offset;

pkg/analyzer/lib/src/binary/binary_writer.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,15 @@ class BufferedSink {
189189
}
190190
}
191191

192+
void writeOptionalUriList(List<Uri>? value) {
193+
if (value != null) {
194+
writeBool(true);
195+
writeUriList(value);
196+
} else {
197+
writeBool(false);
198+
}
199+
}
200+
192201
/// Write the [value] as UTF8 encoded byte array.
193202
void writeStringUtf8(String value) {
194203
var bytes = const Utf8Encoder().convert(value);
@@ -246,6 +255,10 @@ class BufferedSink {
246255
writeStringUtf8(uriStr);
247256
}
248257

258+
void writeUriList(List<Uri> uriList) {
259+
writeList(uriList, writeUri);
260+
}
261+
249262
@pragma("vm:prefer-inline")
250263
void _addByte(int byte) {
251264
_buffer[_length++] = byte;

pkg/analyzer/lib/src/dart/analysis/driver.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ testFineAfterLibraryAnalyzerHook;
106106
// TODO(scheglov): Clean up the list of implicitly analyzed files.
107107
class AnalysisDriver {
108108
/// The version of data format, should be incremented on every format change.
109-
static const int DATA_VERSION = 555;
109+
static const int DATA_VERSION = 556;
110110

111111
/// The number of exception contexts allowed to write. Once this field is
112112
/// zero, we stop writing any new exception contexts in this process.

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6092,8 +6092,10 @@ class LibraryElementImpl extends ElementImpl
60926092
}
60936093

60946094
@override
6095+
@trackedDirectly
60956096
List<LibraryElementImpl> get exportedLibraries {
6096-
return fragments
6097+
globalResultRequirements?.record_library_exportedLibraries(element: this);
6098+
return _fragments
60976099
.expand((fragment) => fragment.libraryExports)
60986100
.map((export) => export.exportedLibrary)
60996101
.nonNulls

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ class LibraryManifest {
2727
final Uint8List featureSet;
2828
final ManifestLibraryLanguageVersion languageVersion;
2929

30+
final List<Uri> exportedLibraryUris;
31+
3032
/// The names that are re-exported by this library.
3133
/// This does not include names that are declared in this library.
3234
final Map<LookupName, ManifestItemId> reExportMap;
@@ -52,6 +54,7 @@ class LibraryManifest {
5254
required this.name,
5355
required this.featureSet,
5456
required this.languageVersion,
57+
required this.exportedLibraryUris,
5558
required this.reExportMap,
5659
required this.reExportDeprecatedOnly,
5760
required this.declaredClasses,
@@ -72,6 +75,7 @@ class LibraryManifest {
7275
name: reader.readOptionalStringUtf8(),
7376
featureSet: reader.readUint8List(),
7477
languageVersion: ManifestLibraryLanguageVersion.read(reader),
78+
exportedLibraryUris: reader.readUriList(),
7579
reExportMap: reader.readLookupNameToIdMap(),
7680
reExportDeprecatedOnly: reader.readLookupNameSet(),
7781
declaredClasses: reader.readLookupNameMap(
@@ -152,6 +156,7 @@ class LibraryManifest {
152156
sink.writeOptionalStringUtf8(name);
153157
sink.writeUint8List(featureSet);
154158
languageVersion.write(sink);
159+
sink.writeUriList(exportedLibraryUris);
155160
reExportMap.write(sink);
156161
reExportDeprecatedOnly.write(sink);
157162
declaredClasses.write(sink);
@@ -865,6 +870,9 @@ class LibraryManifestBuilder {
865870
languageVersion: ManifestLibraryLanguageVersion.encode(
866871
libraryElement.languageVersion,
867872
),
873+
exportedLibraryUris: libraryElement.exportedLibraries
874+
.map((e) => e.uri)
875+
.toList(),
868876
reExportMap: {},
869877
reExportDeprecatedOnly: <LookupName>{},
870878
declaredClasses: newClassItems,
@@ -1085,6 +1093,7 @@ class LibraryManifestBuilder {
10851093
name: null,
10861094
featureSet: Uint8List(0),
10871095
languageVersion: ManifestLibraryLanguageVersion.empty(),
1096+
exportedLibraryUris: [],
10881097
reExportMap: {},
10891098
reExportDeprecatedOnly: <LookupName>{},
10901099
declaredClasses: {},

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,24 @@ class LibraryChildrenIdsMismatch extends RequirementFailure {
298298
}
299299
}
300300

301+
class LibraryExportedUrisMismatch extends RequirementFailure {
302+
final Uri libraryUri;
303+
final List<Uri> expected;
304+
final List<Uri> actual;
305+
306+
LibraryExportedUrisMismatch({
307+
required this.libraryUri,
308+
required this.expected,
309+
required this.actual,
310+
});
311+
312+
@override
313+
String toString() {
314+
return 'LibraryExportedUrisMismatch(libraryUri: $libraryUri, '
315+
'expected: $expected, actual: $actual)';
316+
}
317+
}
318+
301319
class LibraryFeatureSetMismatch extends RequirementFailure {
302320
final Uri libraryUri;
303321
final Uint8List? expected;
@@ -326,6 +344,12 @@ class LibraryLanguageVersionMismatch extends RequirementFailure {
326344
required this.expected,
327345
required this.actual,
328346
});
347+
348+
@override
349+
String toString() {
350+
return 'LibraryLanguageVersionMismatch(libraryUri: $libraryUri, '
351+
'expected: $expected, actual: $actual)';
352+
}
329353
}
330354

331355
class LibraryMissing extends RequirementFailure {

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,8 @@ class LibraryRequirements {
375375
Uint8List? featureSet;
376376
ManifestLibraryLanguageVersion? languageVersion;
377377

378+
List<Uri>? exportedLibraryUris;
379+
378380
/// TopName => ID
379381
final Map<LookupName, ManifestItemId?> exportedTopLevels;
380382

@@ -416,6 +418,7 @@ class LibraryRequirements {
416418
required this.name,
417419
required this.featureSet,
418420
required this.languageVersion,
421+
required this.exportedLibraryUris,
419422
required this.exportedTopLevels,
420423
required this.instances,
421424
required this.interfaces,
@@ -448,6 +451,7 @@ class LibraryRequirements {
448451
name: null,
449452
featureSet: null,
450453
languageVersion: null,
454+
exportedLibraryUris: null,
451455
exportedTopLevels: {},
452456
instances: {},
453457
interfaces: {},
@@ -481,6 +485,7 @@ class LibraryRequirements {
481485
name: reader.readOptionalStringUtf8(),
482486
featureSet: reader.readOptionalUint8List(),
483487
languageVersion: ManifestLibraryLanguageVersion.readOptional(reader),
488+
exportedLibraryUris: reader.readOptionalUriList(),
484489
exportedTopLevels: reader.readNameToOptionalIdMap(),
485490
instances: reader.readMap(
486491
readKey: () => LookupName.read(reader),
@@ -522,6 +527,7 @@ class LibraryRequirements {
522527
sink.writeOptionalStringUtf8(name);
523528
sink.writeOptionalUint8List(featureSet);
524529
sink.writeOptionalObject(languageVersion, (it) => it.write(sink));
530+
sink.writeOptionalUriList(exportedLibraryUris);
525531
sink.writeNameToIdMap(exportedTopLevels);
526532

527533
sink.writeMap(
@@ -1314,6 +1320,17 @@ class RequirementsManifest {
13141320
);
13151321
}
13161322
}
1323+
1324+
if (libraryRequirements.exportedLibraryUris case var expected?) {
1325+
var actual = libraryManifest.exportedLibraryUris;
1326+
if (!const ListEquality<Uri>().equals(expected, actual)) {
1327+
return LibraryExportedUrisMismatch(
1328+
libraryUri: libraryUri,
1329+
expected: expected,
1330+
actual: actual,
1331+
);
1332+
}
1333+
}
13171334
}
13181335

13191336
for (var exportRequirement in exportRequirements) {
@@ -1823,6 +1840,20 @@ class RequirementsManifest {
18231840
requirements.exportedTopLevels[mainName] = id;
18241841
}
18251842

1843+
void record_library_exportedLibraries({required LibraryElementImpl element}) {
1844+
if (_recordingLockLevel != 0) {
1845+
return;
1846+
}
1847+
1848+
var manifest = element.manifest;
1849+
if (manifest == null) {
1850+
return;
1851+
}
1852+
1853+
var requirements = _getLibraryRequirements(element);
1854+
requirements.exportedLibraryUris = manifest.exportedLibraryUris;
1855+
}
1856+
18261857
void record_library_featureSet({required LibraryElementImpl element}) {
18271858
if (_recordingLockLevel != 0) {
18281859
return;

0 commit comments

Comments
 (0)