Fine. Tracking for LibraryElementImpl.exportedLibraries

Change-Id: Ia2a74667f97efbbb45dde7b95e4649edbc1a55dc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/449681
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/analyzer/lib/src/binary/binary_reader.dart b/pkg/analyzer/lib/src/binary/binary_reader.dart
index 941f461..704bb9b 100644
--- a/pkg/analyzer/lib/src/binary/binary_reader.dart
+++ b/pkg/analyzer/lib/src/binary/binary_reader.dart
@@ -135,6 +135,14 @@
     }
   }
 
+  List<Uri>? readOptionalUriList() {
+    if (readBool()) {
+      return readUriList();
+    } else {
+      return null;
+    }
+  }
+
   String readStringReference() {
     var index = readUint30();
     return stringOfIndex(index);
@@ -237,6 +245,10 @@
     return Uri.parse(uriStr);
   }
 
+  List<Uri> readUriList() {
+    return readTypedList(readUri);
+  }
+
   /// Temporary move to [offset] and run [operation].
   void runAtOffset(int offset, void Function() operation) {
     var oldOffset = this.offset;
diff --git a/pkg/analyzer/lib/src/binary/binary_writer.dart b/pkg/analyzer/lib/src/binary/binary_writer.dart
index a92c12d..9f8851f 100644
--- a/pkg/analyzer/lib/src/binary/binary_writer.dart
+++ b/pkg/analyzer/lib/src/binary/binary_writer.dart
@@ -189,6 +189,15 @@
     }
   }
 
+  void writeOptionalUriList(List<Uri>? value) {
+    if (value != null) {
+      writeBool(true);
+      writeUriList(value);
+    } else {
+      writeBool(false);
+    }
+  }
+
   /// Write the [value] as UTF8 encoded byte array.
   void writeStringUtf8(String value) {
     var bytes = const Utf8Encoder().convert(value);
@@ -246,6 +255,10 @@
     writeStringUtf8(uriStr);
   }
 
+  void writeUriList(List<Uri> uriList) {
+    writeList(uriList, writeUri);
+  }
+
   @pragma("vm:prefer-inline")
   void _addByte(int byte) {
     _buffer[_length++] = byte;
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index d2f0337..d3e25d4 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -106,7 +106,7 @@
 // TODO(scheglov): Clean up the list of implicitly analyzed files.
 class AnalysisDriver {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 555;
+  static const int DATA_VERSION = 556;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 23c735e..b002bc7 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -6092,8 +6092,10 @@
   }
 
   @override
+  @trackedDirectly
   List<LibraryElementImpl> get exportedLibraries {
-    return fragments
+    globalResultRequirements?.record_library_exportedLibraries(element: this);
+    return _fragments
         .expand((fragment) => fragment.libraryExports)
         .map((export) => export.exportedLibrary)
         .nonNulls
diff --git a/pkg/analyzer/lib/src/fine/library_manifest.dart b/pkg/analyzer/lib/src/fine/library_manifest.dart
index b22480d..81bb84a 100644
--- a/pkg/analyzer/lib/src/fine/library_manifest.dart
+++ b/pkg/analyzer/lib/src/fine/library_manifest.dart
@@ -27,6 +27,8 @@
   final Uint8List featureSet;
   final ManifestLibraryLanguageVersion languageVersion;
 
+  final List<Uri> exportedLibraryUris;
+
   /// The names that are re-exported by this library.
   /// This does not include names that are declared in this library.
   final Map<LookupName, ManifestItemId> reExportMap;
@@ -52,6 +54,7 @@
     required this.name,
     required this.featureSet,
     required this.languageVersion,
+    required this.exportedLibraryUris,
     required this.reExportMap,
     required this.reExportDeprecatedOnly,
     required this.declaredClasses,
@@ -72,6 +75,7 @@
       name: reader.readOptionalStringUtf8(),
       featureSet: reader.readUint8List(),
       languageVersion: ManifestLibraryLanguageVersion.read(reader),
+      exportedLibraryUris: reader.readUriList(),
       reExportMap: reader.readLookupNameToIdMap(),
       reExportDeprecatedOnly: reader.readLookupNameSet(),
       declaredClasses: reader.readLookupNameMap(
@@ -152,6 +156,7 @@
     sink.writeOptionalStringUtf8(name);
     sink.writeUint8List(featureSet);
     languageVersion.write(sink);
+    sink.writeUriList(exportedLibraryUris);
     reExportMap.write(sink);
     reExportDeprecatedOnly.write(sink);
     declaredClasses.write(sink);
@@ -865,6 +870,9 @@
         languageVersion: ManifestLibraryLanguageVersion.encode(
           libraryElement.languageVersion,
         ),
+        exportedLibraryUris: libraryElement.exportedLibraries
+            .map((e) => e.uri)
+            .toList(),
         reExportMap: {},
         reExportDeprecatedOnly: <LookupName>{},
         declaredClasses: newClassItems,
@@ -1085,6 +1093,7 @@
           name: null,
           featureSet: Uint8List(0),
           languageVersion: ManifestLibraryLanguageVersion.empty(),
+          exportedLibraryUris: [],
           reExportMap: {},
           reExportDeprecatedOnly: <LookupName>{},
           declaredClasses: {},
diff --git a/pkg/analyzer/lib/src/fine/requirement_failure.dart b/pkg/analyzer/lib/src/fine/requirement_failure.dart
index 4c4f689..df74b03 100644
--- a/pkg/analyzer/lib/src/fine/requirement_failure.dart
+++ b/pkg/analyzer/lib/src/fine/requirement_failure.dart
@@ -298,6 +298,24 @@
   }
 }
 
+class LibraryExportedUrisMismatch extends RequirementFailure {
+  final Uri libraryUri;
+  final List<Uri> expected;
+  final List<Uri> actual;
+
+  LibraryExportedUrisMismatch({
+    required this.libraryUri,
+    required this.expected,
+    required this.actual,
+  });
+
+  @override
+  String toString() {
+    return 'LibraryExportedUrisMismatch(libraryUri: $libraryUri, '
+        'expected: $expected, actual: $actual)';
+  }
+}
+
 class LibraryFeatureSetMismatch extends RequirementFailure {
   final Uri libraryUri;
   final Uint8List? expected;
@@ -326,6 +344,12 @@
     required this.expected,
     required this.actual,
   });
+
+  @override
+  String toString() {
+    return 'LibraryLanguageVersionMismatch(libraryUri: $libraryUri, '
+        'expected: $expected, actual: $actual)';
+  }
 }
 
 class LibraryMissing extends RequirementFailure {
diff --git a/pkg/analyzer/lib/src/fine/requirements.dart b/pkg/analyzer/lib/src/fine/requirements.dart
index 39f0ce0..0cf5de4 100644
--- a/pkg/analyzer/lib/src/fine/requirements.dart
+++ b/pkg/analyzer/lib/src/fine/requirements.dart
@@ -375,6 +375,8 @@
   Uint8List? featureSet;
   ManifestLibraryLanguageVersion? languageVersion;
 
+  List<Uri>? exportedLibraryUris;
+
   /// TopName => ID
   final Map<LookupName, ManifestItemId?> exportedTopLevels;
 
@@ -416,6 +418,7 @@
     required this.name,
     required this.featureSet,
     required this.languageVersion,
+    required this.exportedLibraryUris,
     required this.exportedTopLevels,
     required this.instances,
     required this.interfaces,
@@ -448,6 +451,7 @@
       name: null,
       featureSet: null,
       languageVersion: null,
+      exportedLibraryUris: null,
       exportedTopLevels: {},
       instances: {},
       interfaces: {},
@@ -481,6 +485,7 @@
       name: reader.readOptionalStringUtf8(),
       featureSet: reader.readOptionalUint8List(),
       languageVersion: ManifestLibraryLanguageVersion.readOptional(reader),
+      exportedLibraryUris: reader.readOptionalUriList(),
       exportedTopLevels: reader.readNameToOptionalIdMap(),
       instances: reader.readMap(
         readKey: () => LookupName.read(reader),
@@ -522,6 +527,7 @@
     sink.writeOptionalStringUtf8(name);
     sink.writeOptionalUint8List(featureSet);
     sink.writeOptionalObject(languageVersion, (it) => it.write(sink));
+    sink.writeOptionalUriList(exportedLibraryUris);
     sink.writeNameToIdMap(exportedTopLevels);
 
     sink.writeMap(
@@ -1314,6 +1320,17 @@
           );
         }
       }
+
+      if (libraryRequirements.exportedLibraryUris case var expected?) {
+        var actual = libraryManifest.exportedLibraryUris;
+        if (!const ListEquality<Uri>().equals(expected, actual)) {
+          return LibraryExportedUrisMismatch(
+            libraryUri: libraryUri,
+            expected: expected,
+            actual: actual,
+          );
+        }
+      }
     }
 
     for (var exportRequirement in exportRequirements) {
@@ -1823,6 +1840,20 @@
     requirements.exportedTopLevels[mainName] = id;
   }
 
+  void record_library_exportedLibraries({required LibraryElementImpl element}) {
+    if (_recordingLockLevel != 0) {
+      return;
+    }
+
+    var manifest = element.manifest;
+    if (manifest == null) {
+      return;
+    }
+
+    var requirements = _getLibraryRequirements(element);
+    requirements.exportedLibraryUris = manifest.exportedLibraryUris;
+  }
+
   void record_library_featureSet({required LibraryElementImpl element}) {
     if (_recordingLockLevel != 0) {
       return;
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 5abcecf..fb9af1f 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -19315,6 +19315,7 @@
   package:test/test.dart
     reExportMap
       A: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -19394,6 +19395,7 @@
         interface: #M7
     reExportMap
       A: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -19496,6 +19498,7 @@
         interface: #M5
     reExportMap
       A: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -19553,6 +19556,7 @@
     reExportMap
       A: #M0
       C: #M6
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -19621,6 +19625,7 @@
       A1: #M0
       A2: #M2
       A3: #M4
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/b.dart
@@ -19637,6 +19642,7 @@
       A2: #M2
       A3: #M4
       B: #M6
+    exportedLibraryUris: package:test/b.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -19693,6 +19699,7 @@
     reExportMap
       A2: #M8
       A3: #M4
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/b.dart
@@ -19715,6 +19722,7 @@
       A2: #M8
       A3: #M4
       B: #M6
+    exportedLibraryUris: package:test/b.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -19777,12 +19785,14 @@
       A1: #M0
       A2: #M2
       A3: #M4
+    exportedLibraryUris: package:test/a.dart
   package:test/test.dart
     reExportMap
       A1: #M0
       A2: #M2
       A3: #M4
       B: #M6
+    exportedLibraryUris: package:test/b.dart
   requirements
 [status] idle
 [future] getLibraryByUri T1
@@ -19812,11 +19822,13 @@
     reExportMap
       A2: #M8
       A3: #M4
+    exportedLibraryUris: package:test/a.dart
   package:test/test.dart
     reExportMap
       A2: #M8
       A3: #M4
       B: #M6
+    exportedLibraryUris: package:test/b.dart
   requirements
 [status] idle
 [future] getLibraryByUri T2
@@ -19858,6 +19870,7 @@
         interface: #M3
     reExportMap
       A: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/b.dart
@@ -19872,6 +19885,7 @@
     reExportMap
       A: #M0
       B: #M2
+    exportedLibraryUris: package:test/b.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -19981,6 +19995,7 @@
   package:test/test.dart
     reExportMap
       E: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -20083,6 +20098,7 @@
     reExportMap
       E: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -20165,6 +20181,7 @@
     reExportMap
       E: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -20270,6 +20287,7 @@
     reExportMap
       E: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -20375,6 +20393,7 @@
     reExportMap
       E: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -20456,6 +20475,7 @@
     reExportMap
       E1: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -20502,6 +20522,7 @@
       E1: #M0
       E2: #M1
     exportedExtensions: #M0 #M1
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -20555,6 +20576,7 @@
       E1: #M0
       E2: #M1
     exportedExtensions: #M0 #M1
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -20599,6 +20621,7 @@
     reExportMap
       E1: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -20652,6 +20675,7 @@
     reExportMap
       E: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -20747,6 +20771,7 @@
     reExportMap
       E: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -20844,6 +20869,7 @@
     reExportMap
       E: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -20935,6 +20961,7 @@
     reExportMap
       E: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21052,6 +21079,7 @@
     reExportMap
       E: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21169,6 +21197,7 @@
     reExportMap
       E: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21268,6 +21297,7 @@
   package:test/test.dart
     reExportMap
       E: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21356,6 +21386,7 @@
   package:test/test.dart
     reExportMap
       M: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21427,6 +21458,7 @@
   package:test/test.dart
     reExportMap
       a: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21495,6 +21527,7 @@
   package:test/test.dart
     reExportMap
       a: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21540,6 +21573,7 @@
     reExportMap
       a: #M0
       b: #M2
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21586,6 +21620,7 @@
   package:test/test.dart
     reExportMap
       a: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21659,6 +21694,7 @@
   package:test/test.dart
     reExportMap
       a: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21706,6 +21742,7 @@
     reExportMap
       a: #M0
       b: #M2
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21754,6 +21791,7 @@
   package:test/test.dart
     reExportMap
       a: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21827,6 +21865,7 @@
   package:test/test.dart
     reExportMap
       a: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21874,6 +21913,7 @@
     reExportMap
       a: #M0
       b: #M2
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21922,6 +21962,7 @@
   package:test/test.dart
     reExportMap
       a: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -21970,6 +22011,7 @@
     reExportMap
       a: #M0
       b: #M2
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -22019,6 +22061,7 @@
   package:test/test.dart
     reExportMap
       a: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -22094,6 +22137,7 @@
     reExportMap
       a: #M0
       b: #M1
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -22137,6 +22181,7 @@
   package:test/test.dart
     reExportMap
       a: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -22183,6 +22228,7 @@
   package:test/test.dart
     reExportMap
       a: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -22257,6 +22303,7 @@
     reExportMap
       a: #M0
       b: #M1
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -22305,6 +22352,7 @@
     reExportMap
       a: #M0
       c: #M4
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -22357,6 +22405,7 @@
   package:test/b.dart
     reExportMap
       a: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/b.dart
@@ -22417,6 +22466,7 @@
   package:test/b.dart
     reExportMap
       a: #M4
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/b.dart
@@ -22484,6 +22534,7 @@
   package:test/test.dart
     reExportMap
       A: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/test.dart
@@ -27992,6 +28043,7 @@
   package:test/a.dart
     reExportMap
       A: #M0
+    exportedLibraryUris: package:test/x.dart
   requirements
     exportRequirements
       package:test/a.dart
@@ -28038,6 +28090,7 @@
     reExportMap
       A: #M0
     reExportDeprecatedOnly: A
+    exportedLibraryUris: package:test/x.dart
   requirements
     exportRequirements
       package:test/a.dart
@@ -28115,6 +28168,7 @@
     reExportMap
       A: #M0
     reExportDeprecatedOnly: A
+    exportedLibraryUris: package:test/x.dart
   requirements
     exportRequirements
       package:test/a.dart
@@ -28163,6 +28217,7 @@
   package:test/a.dart
     reExportMap
       A: #M0
+    exportedLibraryUris: package:test/x.dart
   requirements
     exportRequirements
       package:test/a.dart
@@ -28245,6 +28300,7 @@
   package:test/a.dart
     reExportMap
       foo=: #M0
+    exportedLibraryUris: package:test/x.dart
   requirements
     exportRequirements
       package:test/a.dart
@@ -28291,6 +28347,7 @@
     reExportMap
       foo=: #M0
     reExportDeprecatedOnly: foo=
+    exportedLibraryUris: package:test/x.dart
   requirements
     exportRequirements
       package:test/a.dart
@@ -28375,6 +28432,7 @@
     reExportMap
       foo=: #M0
     reExportDeprecatedOnly: foo=
+    exportedLibraryUris: package:test/x.dart
   requirements
     exportRequirements
       package:test/a.dart
@@ -28423,6 +28481,7 @@
   package:test/a.dart
     reExportMap
       foo=: #M0
+    exportedLibraryUris: package:test/x.dart
   requirements
     exportRequirements
       package:test/a.dart
@@ -28498,6 +28557,7 @@
   package:test/a.dart
     reExportMap
       A: #M0
+    exportedLibraryUris: package:test/x.dart
   requirements
     exportRequirements
       package:test/a.dart
@@ -29553,6 +29613,102 @@
     );
   }
 
+  test_dependency_libraryElement_exportedLibraries() async {
+    configuration
+      ..withGetErrorsEvents = false
+      ..withStreamResolvedUnitResults = false;
+
+    _ManualRequirements.install((state) {
+      var library = state.singleUnit.importedLibraries.first;
+      library.exportedLibraries;
+    });
+
+    await _runChangeScenarioTA(
+      initialA: r'''
+export 'dart:math' show min;
+''',
+      testCode: r'''
+import 'a.dart';
+''',
+      operation: _FineOperationTestFileGetErrors(),
+      expectedInitialEvents: r'''
+[status] working
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/a.dart
+    reExportMap
+      min: #M0
+    exportedLibraryUris: dart:math
+  requirements
+    exportRequirements
+      package:test/a.dart
+        exports
+          dart:math
+            combinators
+              show min
+            min: #M0
+[operation] linkLibraryCycle
+  package:test/test.dart
+  requirements
+[operation] analyzeFile
+  file: /home/test/lib/test.dart
+  library: /home/test/lib/test.dart
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    libraries
+      package:test/a.dart
+        exportedLibraryUris: dart:math
+[status] idle
+''',
+      updatedA: r'''
+export 'dart:io' show exit;
+export 'dart:math' show min;
+''',
+      expectedUpdatedEvents: r'''
+[status] working
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/a.dart
+    reExportMap
+      exit: #M1
+      min: #M0
+    exportedLibraryUris: dart:io dart:math
+  requirements
+    exportRequirements
+      package:test/a.dart
+        exports
+          dart:io
+            combinators
+              show exit
+            exit: #M1
+          dart:math
+            combinators
+              show min
+            min: #M0
+[operation] reuseLinkedBundle
+  package:test/test.dart
+[operation] checkLibraryDiagnosticsRequirements
+  library: /home/test/lib/test.dart
+  libraryExportedUrisMismatch
+    libraryUri: package:test/a.dart
+    expected: dart:math
+    actual: dart:io dart:math
+[operation] analyzeFile
+  file: /home/test/lib/test.dart
+  library: /home/test/lib/test.dart
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    libraries
+      package:test/a.dart
+        exportedLibraryUris: dart:io dart:math
+[status] idle
+''',
+    );
+  }
+
   test_dependency_libraryElement_featureSet() async {
     configuration
       ..withGetErrorsEvents = false
@@ -35449,6 +35605,7 @@
   package:test/b.dart
     reExportMap
       a: #M0
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/b.dart
@@ -35505,6 +35662,7 @@
   package:test/b.dart
     reExportMap
       a: #M4
+    exportedLibraryUris: package:test/a.dart
   requirements
     exportRequirements
       package:test/b.dart
@@ -66398,6 +66556,7 @@
     reExportMap
       A: #M0
     exportedExtensions: #M0 #M3
+    exportedLibraryUris: package:test/a.dart
 ''',
       updatedCodeFile: a,
       updatedCode: r'''
@@ -66452,6 +66611,7 @@
     reExportMap
       A: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
 ''',
       updatedCodeFile: a,
       updatedCode: r'''
@@ -66510,6 +66670,7 @@
     reExportMap
       A: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
 ''',
       updatedCodeFile: a,
       updatedCode: r'''
@@ -66573,6 +66734,7 @@
     reExportMap
       A: #M0
     exportedExtensions: #M0
+    exportedLibraryUris: package:test/a.dart
 [operation] linkLibraryCycle
   package:test/test.dart
     declaredExtensions
@@ -66583,6 +66745,7 @@
     reExportMap
       A: #M0
     exportedExtensions: #M0 #M3
+    exportedLibraryUris: package:test/b.dart
 ''',
       updatedCodeFile: a,
       updatedCode: r'''
@@ -66646,6 +66809,7 @@
     reExportMap
       B: #M2
     exportedExtensions: #M2 #M4
+    exportedLibraryUris: package:test/a.dart
 ''',
       updatedCodeFile: a,
       updatedCode: r'''
diff --git a/pkg/analyzer/test/src/dart/analysis/result_printer.dart b/pkg/analyzer/test/src/dart/analysis/result_printer.dart
index 26028a0..3fab92e 100644
--- a/pkg/analyzer/test/src/dart/analysis/result_printer.dart
+++ b/pkg/analyzer/test/src/dart/analysis/result_printer.dart
@@ -73,6 +73,7 @@
           _writeInstanceItems(libraryRequirements);
           _writeInterfaceItems(libraryRequirements);
           _writeExportedExtensions(libraryRequirements);
+          _writeExportedLibraryUris(libraryRequirements);
         });
       });
 
@@ -98,6 +99,15 @@
     _writelnIdList('exportedExtensions', requirements.exportedExtensions);
   }
 
+  void _writeExportedLibraryUris(LibraryRequirements requirements) {
+    if (requirements.exportedLibraryUris case var uriList?) {
+      if (uriList.isNotEmpty) {
+        var uriListStr = uriList.join(' ');
+        sink.writelnWithIndent('exportedLibraryUris: $uriListStr');
+      }
+    }
+  }
+
   void _writeExportedTopLevels(LibraryRequirements requirements) {
     var entries = requirements.exportedTopLevels.sorted;
     sink.writeElements('exportedTopLevels', entries, (entry) {
@@ -679,6 +689,13 @@
           'expectedIds': failure.expectedIds.asString(idProvider),
           'actualIds': failure.actualIds.asString(idProvider),
         });
+      case LibraryExportedUrisMismatch():
+        sink.writelnWithIndent('libraryExportedUrisMismatch');
+        sink.writeProperties({
+          'libraryUri': failure.libraryUri,
+          'expected': failure.expected.join(' '),
+          'actual': failure.actual.join(' '),
+        });
       case InstanceFieldIdMismatch():
         sink.writelnWithIndent('instanceFieldIdMismatch');
         sink.writeProperties({
@@ -1217,6 +1234,11 @@
       var idListStr = exportedExtensionIds.asString(idProvider);
       sink.writelnWithIndent('exportedExtensions: $idListStr');
     }
+
+    if (manifest.exportedLibraryUris.isNotEmpty) {
+      var uriListStr = manifest.exportedLibraryUris.join(' ');
+      sink.writelnWithIndent('exportedLibraryUris: $uriListStr');
+    }
   }
 
   Map<String, bool> _executableItemFlags(ExecutableItem item) {