Version 2.18.0-230.0.dev

Merge commit 'bf3652e57f31e8e658ccbe6a3d853266e798d679' into 'dev'
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index ab9e741..4f09f27 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -1387,6 +1387,24 @@
     return flag;
   }
 
+  /// When printing the state for testing, we want to see all files.
+  @visibleForTesting
+  void pullReferencedFiles() {
+    while (true) {
+      final fileCount = _pathToFile.length;
+      for (final file in _pathToFile.values.toList()) {
+        final kind = file.kind;
+        if (kind is LibraryOrAugmentationFileKind) {
+          kind.imports;
+          kind.exports;
+        }
+      }
+      if (_pathToFile.length == fileCount) {
+        break;
+      }
+    }
+  }
+
   /// Remove the file with the given [path].
   void removeFile(String path) {
     _clearFiles();
@@ -1478,6 +1496,9 @@
   FileTestData._(this.file, this.uri);
 
   @override
+  int get hashCode => file.hashCode;
+
+  @override
   bool operator ==(Object other) {
     return other is FileTestData && other.file == file && other.uri == uri;
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/analyzer_state_printer.dart b/pkg/analyzer/test/src/dart/analysis/analyzer_state_printer.dart
index 1a318c2..8acb50c 100644
--- a/pkg/analyzer/test/src/dart/analysis/analyzer_state_printer.dart
+++ b/pkg/analyzer/test/src/dart/analysis/analyzer_state_printer.dart
@@ -14,23 +14,27 @@
 
 class AnalyzerStatePrinter {
   final MemoryByteStore byteStore;
+  final FileStateKindIdProvider fileStateKindIdProvider;
   final FileStateIdProvider fileStateIdProvider;
   final KeyShorter keyShorter;
   final LibraryContext libraryContext;
   final bool omitSdkFiles;
   final ResourceProvider resourceProvider;
   final StringSink sink;
+  final bool withKeysGetPut;
 
   String _indent = '';
 
   AnalyzerStatePrinter({
     required this.byteStore,
+    required this.fileStateKindIdProvider,
     required this.fileStateIdProvider,
     required this.keyShorter,
     required this.libraryContext,
     required this.omitSdkFiles,
     required this.resourceProvider,
     required this.sink,
+    required this.withKeysGetPut,
   });
 
   FileSystemState get fileSystemState => libraryContext.fileSystemState;
@@ -39,7 +43,6 @@
     _writeFiles(testData.fileSystem);
     _writeLibraryContext(testData.libraryContext);
     _writeElementFactory();
-    _writeByteStore();
   }
 
   void writeFileResolver(FileResolverTestData testData) {
@@ -68,6 +71,15 @@
     _indent = indent;
   }
 
+  /// TODO(scheglov) Support unresolved URIs, not augmentations, etc.
+  void _writeAugmentations(LibraryOrAugmentationFileKind kind) {
+    final files = kind.file.augmentationFiles.whereNotNull();
+    if (files.isNotEmpty) {
+      final keys = files.map((e) => fileStateIdProvider[e]).join(' ');
+      _writelnWithIndent('augmentations: $keys');
+    }
+  }
+
   void _writeByteStore() {
     _writelnWithIndent('byteStore');
     _withIndent(() {
@@ -98,48 +110,198 @@
     });
   }
 
+  void _writeElements<T>(String name, List<T> elements, void Function(T) f) {
+    if (elements.isNotEmpty) {
+      _writelnWithIndent(name);
+      _withIndent(() {
+        for (var element in elements) {
+          f(element);
+        }
+      });
+    }
+  }
+
   void _writeFile(FileState file) {
     _withIndent(() {
       _writelnWithIndent('id: ${fileStateIdProvider[file]}');
       _writeFileKind(file);
+      _writeReferencingFiles(file);
       _writeFileUnlinkedKey(file);
     });
   }
 
+  void _writeFileExports(LibraryOrAugmentationFileKind file) {
+    _writeElements<ExportDirectiveState>('exports', file.exports, (export) {
+      if (export is ExportDirectiveWithFile) {
+        final file = export.exportedFile;
+        sink.write(_indent);
+
+        final exportedLibrary = export.exportedLibrary;
+        if (exportedLibrary != null) {
+          expect(exportedLibrary.file, file);
+          sink.write(fileStateKindIdProvider[exportedLibrary]);
+        } else {
+          sink.write('notLibrary ${fileStateIdProvider[file]}');
+        }
+
+        if (omitSdkFiles && file.uri.isScheme('dart')) {
+          sink.write(' ${file.uri}');
+        }
+        sink.writeln();
+      } else if (export is ExportDirectiveWithInSummarySource) {
+        sink.write(_indent);
+        sink.write('inSummary ${export.exportedSource.uri}');
+
+        final librarySource = export.exportedLibrarySource;
+        if (librarySource != null) {
+          expect(librarySource, same(export.exportedSource));
+        } else {
+          sink.write(' notLibrary');
+        }
+        sink.writeln();
+      } else {
+        sink.write(_indent);
+        sink.write('uri: ${export.directive.uri}');
+        sink.writeln();
+      }
+    });
+  }
+
+  void _writeFileImports(LibraryOrAugmentationFileKind file) {
+    _writeElements<ImportDirectiveState>('imports', file.imports, (import) {
+      if (import is ImportDirectiveWithFile) {
+        final file = import.importedFile;
+        sink.write(_indent);
+
+        final importedLibrary = import.importedLibrary;
+        if (importedLibrary != null) {
+          expect(importedLibrary.file, file);
+          sink.write(fileStateKindIdProvider[importedLibrary]);
+        } else {
+          sink.write('notLibrary ${fileStateIdProvider[file]}');
+        }
+
+        if (omitSdkFiles && file.uri.isScheme('dart')) {
+          sink.write(' ${file.uri}');
+        }
+
+        if (import.isSyntheticDartCoreImport) {
+          sink.write(' synthetic');
+        }
+        sink.writeln();
+      } else if (import is ImportDirectiveWithInSummarySource) {
+        sink.write(_indent);
+        sink.write('inSummary ${import.importedSource.uri}');
+
+        final librarySource = import.importedLibrarySource;
+        if (librarySource != null) {
+          expect(librarySource, same(import.importedSource));
+        } else {
+          sink.write(' notLibrary');
+        }
+
+        if (import.isSyntheticDartCoreImport) {
+          sink.write(' synthetic');
+        }
+        sink.writeln();
+      } else {
+        sink.write(_indent);
+        sink.write('uri: ${import.directive.uri}');
+        if (import.isSyntheticDartCoreImport) {
+          sink.write(' synthetic');
+        }
+        sink.writeln();
+      }
+    });
+  }
+
   void _writeFileKind(FileState file) {
     final kind = file.kind;
-    if (kind is LibraryFileStateKind) {
-      _writelnWithIndent('kind: library');
-      expect(kind.library.file, same(file));
-    } else if (kind is PartOfNameFileStateKind) {
-      _writelnWithIndent('kind: partOfName');
+    expect(kind.file, same(file));
+
+    _writelnWithIndent('kind: ${fileStateKindIdProvider[kind]}');
+    if (kind is AugmentationKnownFileStateKind) {
       _withIndent(() {
+        final augmented = kind.augmented;
+        if (augmented != null) {
+          final id = fileStateKindIdProvider[augmented];
+          _writelnWithIndent('augmented: $id');
+        } else {
+          final id = fileStateIdProvider[kind.uriFile];
+          _writelnWithIndent('uriFile: $id');
+        }
+
         final library = kind.library;
         if (library != null) {
-          final id = fileStateIdProvider[library.file];
+          final id = fileStateKindIdProvider[library];
+          _writelnWithIndent('library: $id');
+        }
+
+        _writeFileImports(kind);
+        _writeFileExports(kind);
+        _writeAugmentations(kind);
+      });
+    } else if (kind is AugmentationUnknownFileStateKind) {
+      _withIndent(() {
+        _writelnWithIndent('uri: ${kind.directive.uri}');
+      });
+    } else if (kind is LibraryFileStateKind) {
+      expect(kind.library, same(kind));
+
+      _withIndent(() {
+        final name = kind.name;
+        if (name != null) {
+          _writelnWithIndent('name: $name');
+        }
+
+        _writeFileImports(kind);
+        _writeFileExports(kind);
+        _writeLibraryParts(kind);
+        _writeAugmentations(kind);
+      });
+    } else if (kind is PartOfNameFileStateKind) {
+      _withIndent(() {
+        final libraries = kind.libraries;
+        if (libraries.isNotEmpty) {
+          final keys = libraries
+              .map((library) => fileStateKindIdProvider[library])
+              .sorted(compareNatural)
+              .join(' ');
+          _writelnWithIndent('libraries: $keys');
+        }
+
+        final library = kind.library;
+        if (library != null) {
+          final id = fileStateKindIdProvider[library];
           _writelnWithIndent('library: $id');
         } else {
           _writelnWithIndent('name: ${kind.directive.name}');
         }
       });
     } else if (kind is PartOfUriKnownFileStateKind) {
-      _writelnWithIndent('kind: partOfUriKnown');
       _withIndent(() {
         final library = kind.library;
         if (library != null) {
-          final id = fileStateIdProvider[library.file];
+          final id = fileStateKindIdProvider[library];
           _writelnWithIndent('library: $id');
         } else {
           final id = fileStateIdProvider[kind.uriFile];
           _writelnWithIndent('uriFile: $id');
         }
       });
+    } else if (kind is PartOfUriUnknownFileStateKind) {
+      _withIndent(() {
+        _writelnWithIndent('uri: ${kind.directive.uri}');
+        expect(kind.library, isNull);
+      });
     } else {
       throw UnimplementedError('${kind.runtimeType}');
     }
   }
 
   void _writeFiles(FileSystemTestData testData) {
+    fileSystemState.pullReferencedFiles();
+
     final fileDataList = <FileTestData>[];
     for (final fileData in testData.files.values) {
       if (omitSdkFiles && fileData.uri.isScheme('dart')) {
@@ -163,18 +325,20 @@
         final file = fileData.file;
         _writelnWithIndent(_posixPath(file));
         _withIndent(() {
+          _writelnWithIndent('uri: ${fileData.uri}');
+
           final current = fileSystemState.getExisting(file);
           if (current != null) {
             _writelnWithIndent('current');
             _writeFile(current);
           }
 
-          final shortGets = keyShorter.shortKeys(fileData.unlinkedKeyGet);
-          final shortPuts = keyShorter.shortKeys(fileData.unlinkedKeyPut);
-          _writelnWithIndent('unlinkedGet: $shortGets');
-          _writelnWithIndent('unlinkedPut: $shortPuts');
-
-          _writelnWithIndent('uri: ${fileData.uri}');
+          if (withKeysGetPut) {
+            final shortGets = keyShorter.shortKeys(fileData.unlinkedKeyGet);
+            final shortPuts = keyShorter.shortKeys(fileData.unlinkedKeyPut);
+            _writelnWithIndent('unlinkedGet: $shortGets');
+            _writelnWithIndent('unlinkedPut: $shortPuts');
+          }
         });
       }
     });
@@ -239,11 +403,30 @@
     });
   }
 
+  /// TODO(scheglov) Support unresolved URIs, not parts, etc.
+  void _writeLibraryParts(LibraryFileStateKind library) {
+    final parts = library.file.partedFiles.whereNotNull();
+    if (parts.isNotEmpty) {
+      final partKeys = parts.map((e) => fileStateIdProvider[e]).join(' ');
+      _writelnWithIndent('parts: $partKeys');
+    }
+  }
+
   void _writelnWithIndent(String line) {
     sink.write(_indent);
     sink.writeln(line);
   }
 
+  void _writeReferencingFiles(FileState file) {
+    final referencingFiles = file.referencingFiles;
+    if (referencingFiles.isNotEmpty) {
+      final fileIds = referencingFiles
+          .map((e) => fileStateIdProvider[e])
+          .sorted(compareNatural);
+      _writelnWithIndent('referencingFiles: $fileIds');
+    }
+  }
+
   void _writeUriList(String name, Iterable<Uri> uriIterable) {
     final uriStrList = <String>[];
     for (final uri in uriIterable) {
@@ -273,6 +456,28 @@
   }
 }
 
+class FileStateKindIdProvider {
+  final Map<FileStateKind, String> _map = Map.identity();
+
+  String operator [](FileStateKind kind) {
+    if (kind is AugmentationKnownFileStateKind) {
+      return _map[kind] ??= 'augmentation_${_map.length}';
+    } else if (kind is AugmentationUnknownFileStateKind) {
+      return _map[kind] ??= 'augmentationUnknown_${_map.length}';
+    } else if (kind is LibraryFileStateKind) {
+      return _map[kind] ??= 'library_${_map.length}';
+    } else if (kind is PartOfNameFileStateKind) {
+      return _map[kind] ??= 'partOfName_${_map.length}';
+    } else if (kind is PartOfUriKnownFileStateKind) {
+      return _map[kind] ??= 'partOfUriKnown_${_map.length}';
+    } else if (kind is PartFileStateKind) {
+      return _map[kind] ??= 'partOfUriUnknown_${_map.length}';
+    } else {
+      throw UnimplementedError('${kind.runtimeType}');
+    }
+  }
+}
+
 /// Keys in the byte store are long hashes, which are hard to read.
 /// So, we generate short unique versions for them.
 class KeyShorter {
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index 3cf0ed1..690116e 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -21,23 +21,22 @@
     show AnalysisOptions, AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer/src/util/either.dart';
 import 'package:analyzer/src/workspace/basic.dart';
-import 'package:analyzer_utilities/check/check.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../resolution/context_collection_resolution.dart';
+import '../resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FileSystemStateTest);
     defineReflectiveTests(FileSystemState_BazelWorkspaceTest);
     defineReflectiveTests(FileSystemState_PubPackageTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -125,18 +124,6 @@
   @override
   bool get retainDataForTesting => true;
 
-  FileState get _dartAsyncState {
-    return fileStateForUriStr('dart:async');
-  }
-
-  FileState get _dartCoreState {
-    return fileStateForUriStr('dart:core');
-  }
-
-  FileState get _dartMathState {
-    return fileStateForUriStr('dart:math');
-  }
-
   FileState fileStateFor(File file) {
     return fsStateFor(file).getFileForPath(file.path);
   }
@@ -155,11 +142,11 @@
   }
 
   test_newFile_augmentation_augmentationExists_hasImport() async {
-    final a = newFile('$testPackageLibPath/a.dart', r'''
+    newFile('$testPackageLibPath/a.dart', r'''
 import augment 'b.dart';
 ''');
 
-    final b = newFile('$testPackageLibPath/b.dart', r'''
+    newFile('$testPackageLibPath/b.dart', r'''
 library augment 'a.dart';
 import augment 'c.dart';
 ''');
@@ -168,45 +155,49 @@
 library augment 'b.dart';
 ''');
 
-    final cState = fileStateFor(c);
-    // We have not asked for `b.dart` yet, but it was found using URI.
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile.path, b.path);
-      expect(kind.augmented?.file.path, b.path);
-    });
+    fileStateFor(c);
 
-    final bState = fileStateFor(b);
-    _assertAugmentationFiles(bState, [c]);
-    // We have not asked for `a.dart` yet, but it was found using URI.
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile.path, a.path);
-      expect(kind.augmented?.file.path, a.path);
-    });
-
-    final aState = fileStateFor(a);
-    _assertAugmentationFiles(aState, [b]);
-
-    // Check `c.dart` again, now using the `b.dart` state.
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(bState);
-      kind.assertLibrary(aState);
-    });
-
-    // Check `b.dart` again, now using the `a.dart` state.
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(aState);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        augmented: library_0
+        library: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_2
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: augmentation_3
+        augmented: augmentation_2
+        library: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_1]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_augmentation_augmentationExists_hasImport_disconnected() async {
-    final a = getFile('$testPackageLibPath/a.dart');
-
-    final b = newFile('$testPackageLibPath/b.dart', r'''
+    newFile('$testPackageLibPath/b.dart', r'''
 library augment 'a.dart';
 import augment 'c.dart';
 ''');
@@ -215,52 +206,51 @@
 library augment 'b.dart';
 ''');
 
-    final cState = fileStateFor(c);
-    // We have not asked for `b.dart` yet, but it was found using URI.
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile.path, b.path);
-      expect(kind.augmented?.file.path, b.path);
-    });
+    fileStateFor(c);
 
-    final bState = fileStateFor(b);
-    _assertAugmentationFiles(bState, [c]);
-    // We have not asked for `a.dart` yet, but it was found using URI.
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile.path, a.path);
-      // The file `a.dart` does not exist, so no import, so `null`.
-      expect(kind.augmented, isNull);
-      expect(kind.library, isNull);
-    });
-    // Check `c.dart` again, now using the `b.dart` state.
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(bState);
-      expect(kind.library, isNull);
-    });
-
-    // The file `a.dart` does not exist.
-    final aState = fileStateFor(a);
-    expect(aState.exists, isFalse);
-    _assertAugmentationFiles(aState, []);
-    // Check `b.dart` again, now using the `a.dart` state.
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      // The URI can be resolved, it points at `a.dart` file.
-      expect(kind.uriFile, same(aState));
-      // The file `a.dart` does not exist, so no import, so `null`.
-      expect(kind.augmented, isNull);
-      expect(kind.library, isNull);
-    });
+    // `b.dart` points at `a.dart`, but `a.dart` does not import it.
+    // So, we can resolve the file, but decline to consider it augmented.
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        uriFile: file_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_2
+      unlinkedKey: k01
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: augmentation_3
+        augmented: augmentation_2
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_1]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_augmentation_augmentationExists_noImport() async {
-    final a = newFile('$testPackageLibPath/a.dart', r'''
+    newFile('$testPackageLibPath/a.dart', r'''
 import augment 'b.dart';
 ''');
 
-    final b = newFile('$testPackageLibPath/b.dart', r'''
+    newFile('$testPackageLibPath/b.dart', r'''
 library augment 'a.dart';
 ''');
 
@@ -268,40 +258,44 @@
 library augment 'b.dart';
 ''');
 
-    // We found `b.dart` from the augmentation file `c.dart`.
-    final cState = fileStateFor(c);
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile.path, b.path);
-      // `b.dart` does not import `c.dart` as an augmentation.
-      expect(kind.augmented, isNull);
-      expect(kind.library, isNull);
-    });
+    fileStateFor(c);
 
-    // Reading `a.dart` does not change anything.
-    final aState = fileStateFor(a);
-    _assertAugmentationFiles(aState, [b]);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-    });
-
-    // `b.dart` does not import `c.dart` as an augmentation.
-    final bState = fileStateFor(b);
-    _assertAugmentationFiles(bState, []);
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(aState);
-      kind.assertLibrary(aState);
-    });
-
-    // Check `c.dart` again, now using the `b.dart` state.
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile, same(bState));
-      expect(kind.augmented, isNull);
-      expect(kind.library, isNull);
-    });
+    // `c.dart` points at `b.dart`, but `b.dart` does not import it.
+    // So, we can resolve the file, but decline to consider it augmented.
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        augmented: library_0
+        library: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: augmentation_3
+        uriFile: file_1
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_augmentation_cycle1_augmentSelf() async {
@@ -309,29 +303,42 @@
 import augment 'b.dart';
 ''');
 
-    final b = newFile('$testPackageLibPath/b.dart', r'''
+    newFile('$testPackageLibPath/b.dart', r'''
 library augment 'b.dart';
 import augment 'b.dart';
 ''');
 
-    final aState = fileStateFor(a);
-    _assertAugmentationFiles(aState, [b]);
+    fileStateFor(a);
 
-    // We can construct a cycle using augmentations.
-    final bState = fileStateFor(b);
-    _assertAugmentationFiles(bState, [b]);
-    bState.assertKind((bKind) {
-      bKind as AugmentationKnownFileStateKind;
-      bKind.assertAugmented(bState);
-      expect(bKind.library, isNull);
-    });
+    // There is a cycle of augmentations from `b.dart` to itself.
+    // This does not lead to a library, so it is absent.
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        augmented: augmentation_2
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      referencingFiles: [file_0, file_1]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
-    // The cycle does not prevent building of the library cycle.
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-      // TODO(scheglov) ask for the cycle signature
-    });
+    // The cycle does not prevent building of the library cycle. TODO
   }
 
   test_newFile_augmentation_cycle2() async {
@@ -339,43 +346,58 @@
 import augment 'b.dart';
 ''');
 
-    final b = newFile('$testPackageLibPath/b.dart', r'''
+    newFile('$testPackageLibPath/b.dart', r'''
 library augment 'a.dart';
 import augment 'c.dart';
 ''');
 
-    final c = newFile('$testPackageLibPath/c.dart', r'''
+    newFile('$testPackageLibPath/c.dart', r'''
 library augment 'b.dart';
 import augment 'b.dart';
 ''');
 
-    final aState = fileStateFor(a);
-    _assertAugmentationFiles(aState, [b]);
+    fileStateFor(a);
 
-    final bState = fileStateFor(b);
-    _assertAugmentationFiles(bState, [c]);
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        augmented: library_0
+        library: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_2
+      referencingFiles: [file_0, file_2]
+      unlinkedKey: k01
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: augmentation_3
+        augmented: augmentation_2
+        library: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      referencingFiles: [file_1]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
 
-    final cState = fileStateFor(c);
-    _assertAugmentationFiles(cState, [b]);
-
-    // We can construct a cycle using augmentations.
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(aState);
-      kind.assertLibrary(aState);
-    });
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(bState);
-      kind.assertLibrary(aState);
-    });
-
-    // The cycle does not prevent building of the library cycle.
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-      // TODO(scheglov) ask for the cycle signature
-    });
+    // The cycle does not prevent building of the library cycle. TODO
   }
 
   test_newFile_augmentation_invalid() async {
@@ -383,17 +405,25 @@
 library augment 'da:';
 ''');
 
+    fileStateFor(a);
+
     // The URI is invalid, so there is no way to discover the target.
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as AugmentationUnknownFileStateKind;
-      expect(kind.directive.uri, 'da:');
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: augmentationUnknown_0
+        uri: da:
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_augmentation_libraryExists_hasImport() async {
-    final a = newFile('$testPackageLibPath/a.dart', r'''
+    newFile('$testPackageLibPath/a.dart', r'''
 import augment 'b.dart';
 ''');
 
@@ -401,22 +431,33 @@
 library augment 'a.dart';
 ''');
 
-    final bState = fileStateFor(b);
-    // We have not asked for `a.dart` yet, but it was found using URI.
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile.path, a.path);
-      expect(kind.augmented?.file.path, a.path);
-    });
+    fileStateFor(b);
 
-    final aState = fileStateFor(a);
-    _assertAugmentationFiles(aState, [b]);
-    // Check `b.dart` again, now using the `a.dart` state.
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(aState);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        augmented: library_0
+        library: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_augmentation_libraryExists_noImport() async {
@@ -426,58 +467,90 @@
 library augment 'a.dart';
 ''');
 
-    final aState = fileStateFor(a);
-    _assertAugmentationFiles(aState, []);
+    fileStateFor(b);
 
-    final bState = fileStateFor(b);
     // We can find `a.dart` using the URI.
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      // But `a.dart` does not import `b.dart`.
-      expect(kind.augmented, isNull);
-      expect(kind.library, isNull);
-    });
+    // But it does not import the augmentation `b.dart`, so we find the
+    // file that corresponds to the URI, but refuse to consider it augmented.
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        uriFile: file_0
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Refreshing `a.dart` does not change anything.
-    aState.refresh();
-    _assertAugmentationFiles(aState, []);
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      expect(kind.augmented, isNull);
-      expect(kind.library, isNull);
-    });
+    fileStateFor(a).refresh();
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        uriFile: file_0
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_augmentation_targetNotExists() async {
-    final a = getFile('$testPackageLibPath/a.dart');
-
     final b = newFile('$testPackageLibPath/b.dart', r'''
 library augment 'a.dart';
 ''');
 
-    final bState = fileStateFor(b);
-    // We can find `a.dart` from `b.dart` using the URI.
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile.path, a.path);
-      // The file `a.dart` does not exist, so no import.
-      expect(kind.augmented, isNull);
-      expect(kind.library, isNull);
-    });
+    fileStateFor(b);
 
-    // We can get `a.dart`, but it does not exist.
-    final aState = fileStateFor(a);
-    expect(aState.exists, isFalse);
-    _assertAugmentationFiles(aState, []);
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      // The file `a.dart` does not exist, so no import.
-      expect(kind.augmented, isNull);
-      expect(kind.library, isNull);
-    });
+    // We can find `a.dart` from `b.dart` using the URI.
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        uriFile: file_0
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_augmentation_twoLibraries() async {
@@ -489,93 +562,261 @@
 import augment 'c.dart';
 ''');
 
-    final c = newFile('$testPackageLibPath/c.dart', r'''
+    newFile('$testPackageLibPath/c.dart', r'''
 library augment 'a.dart';
 ''');
 
     final aState = fileStateFor(a);
-    _assertAugmentationFiles(aState, [c]);
 
     // We use the URI from `library augment` to find the augmentation target.
-    final cState = fileStateFor(c);
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(aState);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        augmented: library_0
+        library: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Reading `b.dart` does not update the augmentation.
     final bState = fileStateFor(b);
-    _assertAugmentationFiles(bState, [c]);
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(aState);
-      kind.assertLibrary(aState);
-    });
-
-    // Refreshing `a.dart` does not update the augmentation.
-    aState.refresh();
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(aState);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        augmented: library_0
+        library: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0, file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Refreshing `b.dart` does not update the augmentation.
     bState.refresh();
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(aState);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_4
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        augmented: library_0
+        library: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0, file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Exclude from `a.dart`, the URI still points at `a.dart`.
     // But `c.dart` is not a valid augmentation anymore.
     newFile(a.path, '');
     aState.refresh();
-    _assertAugmentationFiles(aState, []);
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      expect(kind.augmented, isNull);
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_5
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_4
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        uriFile: file_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Exclude from `b.dart`, still point at `a.dart`, still not valid.
     newFile(b.path, '');
     bState.refresh();
-    _assertAugmentationFiles(bState, []);
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      expect(kind.augmented, isNull);
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_5
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_6
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        uriFile: file_0
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Include into `b.dart`, still point at `a.dart`, still not valid.
     newFile(b.path, r'''
 import augment 'c.dart';
 ''');
     bState.refresh();
-    _assertAugmentationFiles(bState, [c]);
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      expect(kind.augmented, isNull);
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_5
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_7
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        uriFile: file_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Include into `a.dart`, restore to `a.dart` as the target.
     newFile(a.path, r'''
 import augment 'c.dart';
 ''');
     aState.refresh();
-    _assertAugmentationFiles(aState, [c]);
-    cState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(aState);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_8
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_7
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        augmented: library_8
+        library: library_8
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0, file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_doesNotExist() {
@@ -587,22 +828,65 @@
     expect(file.content, '');
     expect(file.exists, isFalse);
 
-    file.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-      kind.assertLibrary(file);
-      check(kind.imports).matches([
-        (import) => import
-          ..isLibrary(_dartCoreState)
-          ..isSyntheticDartCoreImport.isTrue,
-      ]);
-      check(kind.exports).isEmpty;
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
+  }
 
-    expect(file.exportedFiles, isEmpty);
-    expect(file.partedFiles, isEmpty);
-    expect(file.libraryFiles, [file]);
-    expect(file.isPart, isFalse);
+  test_newFile_library_exports_augmentation() async {
+    newFile('$testPackageLibPath/b.dart', r'''
+library augment 'a.dart';
+''');
+
+    final c = newFile('$testPackageLibPath/c.dart', r'''
+export 'b.dart';
+''');
+
+    fileStateFor(c);
+
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        uriFile: file_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2]
+      unlinkedKey: k01
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+        exports
+          notLibrary file_1
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_library_exports_dart() async {
@@ -611,14 +895,24 @@
 export 'dart:math';
 ''');
 
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.exports).matches([
-        (export) => export.isLibrary(_dartAsyncState),
-        (export) => export.isLibrary(_dartMathState),
-      ]);
-    });
+    fileStateFor(a);
+
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        exports
+          library_2 dart:async
+          library_3 dart:math
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_library_exports_inSummary_library() async {
@@ -667,25 +961,36 @@
 export 'b.dart';
 ''');
 
-    final b = getFile('$testPackageLibPath/b.dart');
+    fileStateFor(a);
 
-    final aState = fileStateFor(a);
-    final bState = fileStateFor(b);
-
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.exports).matches([
-        (import) {
-          final expected = Uri.parse('dart:async');
-          import.withInSummaryLibrary(expected);
-        },
-        (import) {
-          final expected = Uri.parse('package:foo/foo.dart');
-          import.withInSummaryLibrary(expected);
-        },
-        (import) => import.isLibrary(bState),
-      ]);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          inSummary dart:core synthetic
+        exports
+          inSummary dart:async
+          inSummary package:foo/foo.dart
+          library_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_1
+        imports
+          inSummary dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+  hasReader
+    package:foo/foo.dart
+''');
   }
 
   test_newFile_library_exports_inSummary_part() async {
@@ -739,61 +1044,107 @@
 export 'b.dart';
 ''');
 
-    final b = getFile('$testPackageLibPath/b.dart');
+    fileStateFor(a);
 
-    final aState = fileStateFor(a);
-    final bState = fileStateFor(b);
-
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.exports).matches([
-        (export) {
-          final expected = Uri.parse('package:foo/foo2.dart');
-          export.withInSummaryNotLibrary(expected);
-        },
-        (export) => export.isLibrary(bState),
-      ]);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          inSummary dart:core synthetic
+        exports
+          inSummary package:foo/foo2.dart notLibrary
+          library_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_1
+        imports
+          inSummary dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+  hasReader
+    package:foo/foo.dart
+''');
   }
 
   test_newFile_library_exports_invalidRelativeUri() async {
     final a = newFile('$testPackageLibPath/a.dart', r'''
-export '::net';
+export 'net:';
 ''');
 
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.exports).matches([
-        (export) => export.isNotFile(),
-      ]);
-    });
+    fileStateFor(a);
+
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        exports
+          uri: net:
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_library_exports_package() async {
-    final a = newFile('$testPackageLibPath/a.dart', '');
-    final b = newFile('$testPackageLibPath/b.dart', '');
-
     final c = newFile('$testPackageLibPath/c.dart', r'''
 export 'a.dart';
 export 'package:test/b.dart';
 ''');
 
-    final aState = fileStateFor(a);
-    final bState = fileStateFor(b);
-    final cState = fileStateFor(c);
+    fileStateFor(c);
 
-    cState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.exports).matches([
-        (export) => export.isLibrary(aState),
-        (export) => export.isLibrary(bState),
-      ]);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2]
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_2
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2]
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+        exports
+          library_0
+          library_2
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_library_exports_part() async {
-    final a = newFile('$testPackageLibPath/a.dart', r'''
+    newFile('$testPackageLibPath/a.dart', r'''
 part of my.lib;
 ''');
 
@@ -801,19 +1152,35 @@
 export 'a.dart';
 ''');
 
-    final aState = fileStateFor(a);
-    final bState = fileStateFor(b);
+    fileStateFor(b);
 
-    bState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.exports).matches([
-        (export) => export.isFile(aState),
-      ]);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: partOfName_0
+        name: my.lib
+      referencingFiles: [file_1]
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_1
+        imports
+          library_2 dart:core synthetic
+        exports
+          notLibrary file_0
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
-  test_newFile_library_imports_library_augmentation() async {
-    final b = newFile('$testPackageLibPath/b.dart', r'''
+  test_newFile_library_imports_augmentation() async {
+    newFile('$testPackageLibPath/b.dart', r'''
 library augment 'a.dart';
 ''');
 
@@ -821,18 +1188,63 @@
 import 'b.dart';
 ''');
 
-    final bState = fileStateFor(b);
-    final cState = fileStateFor(c);
+    fileStateFor(c);
 
-    cState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.imports).matches([
-        (import) => import.isFile(bState),
-        (import) => import
-          ..isLibrary(_dartCoreState)
-          ..isSyntheticDartCoreImport.isTrue,
-      ]);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        uriFile: file_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2]
+      unlinkedKey: k01
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: library_3
+        imports
+          notLibrary file_1
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
+  }
+
+  test_newFile_library_imports_invalidRelativeUri() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+import 'da:';
+''');
+
+    fileStateFor(a);
+
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          uri: da:
+          library_1 dart:core synthetic
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_library_imports_library_dart() async {
@@ -841,17 +1253,23 @@
 import 'dart:math';
 ''');
 
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.imports).matches([
-        (import) => import.isLibrary(_dartAsyncState),
-        (import) => import.isLibrary(_dartMathState),
-        (import) => import
-          ..isLibrary(_dartCoreState)
-          ..isSyntheticDartCoreImport.isTrue,
-      ]);
-    });
+    fileStateFor(a);
+
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:async
+          library_2 dart:math
+          library_3 dart:core synthetic
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_library_imports_library_dart_explicitDartCore() async {
@@ -860,16 +1278,22 @@
 import 'dart:math';
 ''');
 
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.imports).matches([
-        (import) => import
-          ..isLibrary(_dartCoreState)
-          ..isSyntheticDartCoreImport.isFalse,
-        (import) => import.isLibrary(_dartMathState),
-      ]);
-    });
+    fileStateFor(a);
+
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core
+          library_2 dart:math
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_library_imports_library_inSummary_library() async {
@@ -918,31 +1342,35 @@
 import 'b.dart';
 ''');
 
-    final b = getFile('$testPackageLibPath/b.dart');
+    fileStateFor(a);
 
-    final aState = fileStateFor(a);
-    final bState = fileStateFor(b);
-
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.imports).matches([
-        (import) {
-          final expected = Uri.parse('dart:async');
-          import.withInSummaryLibrary(expected);
-        },
-        (import) {
-          final expected = Uri.parse('package:foo/foo.dart');
-          import.withInSummaryLibrary(expected);
-        },
-        (import) => import.isLibrary(bState),
-        (import) {
-          final expected = Uri.parse('dart:core');
-          import
-            ..withInSummaryLibrary(expected)
-            ..isSyntheticDartCoreImport.isTrue;
-        },
-      ]);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          inSummary dart:async
+          inSummary package:foo/foo.dart
+          library_1
+          inSummary dart:core synthetic
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_1
+        imports
+          inSummary dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+  hasReader
+    package:foo/foo.dart
+''');
   }
 
   test_newFile_library_imports_library_inSummary_part() async {
@@ -996,71 +1424,84 @@
 import 'b.dart';
 ''');
 
-    final b = getFile('$testPackageLibPath/b.dart');
+    fileStateFor(a);
 
-    final aState = fileStateFor(a);
-    final bState = fileStateFor(b);
-
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.imports).matches([
-        (export) {
-          final expected = Uri.parse('package:foo/foo2.dart');
-          export.withInSummaryNotLibrary(expected);
-        },
-        (export) => export.isLibrary(bState),
-        (export) {
-          final expected = Uri.parse('dart:core');
-          export
-            ..withInSummaryLibrary(expected)
-            ..isSyntheticDartCoreImport.isTrue;
-        },
-      ]);
-    });
-  }
-
-  test_newFile_library_imports_library_invalidRelativeUri() async {
-    final a = newFile('$testPackageLibPath/a.dart', r'''
-import '::net';
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          inSummary package:foo/foo2.dart notLibrary
+          library_1
+          inSummary dart:core synthetic
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_1
+        imports
+          inSummary dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+  hasReader
+    package:foo/foo.dart
 ''');
-
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.imports).matches([
-        (import) => import.isNotFile(),
-        (import) => import.isLibrary(_dartCoreState),
-      ]);
-    });
   }
 
   test_newFile_library_imports_library_package() async {
-    final a = newFile('$testPackageLibPath/a.dart', '');
-    final b = newFile('$testPackageLibPath/b.dart', '');
+    newFile('$testPackageLibPath/a.dart', '');
+    newFile('$testPackageLibPath/b.dart', '');
 
     final c = newFile('$testPackageLibPath/c.dart', r'''
 import 'a.dart';
 import 'package:test/b.dart';
 ''');
 
-    final aState = fileStateFor(a);
-    final bState = fileStateFor(b);
-    final cState = fileStateFor(c);
+    fileStateFor(c);
 
-    cState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.imports).matches([
-        (import) => import.isLibrary(aState),
-        (import) => import.isLibrary(bState),
-        (import) => import
-          ..isLibrary(_dartCoreState)
-          ..isSyntheticDartCoreImport.isTrue,
-      ]);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2]
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_2
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2]
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: library_3
+        imports
+          library_0
+          library_2
+          library_1 dart:core synthetic
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
-  test_newFile_library_imports_library_part() async {
-    final a = newFile('$testPackageLibPath/a.dart', r'''
+  test_newFile_library_imports_part() async {
+    newFile('$testPackageLibPath/a.dart', r'''
 part of my.lib;
 ''');
 
@@ -1068,18 +1509,30 @@
 import 'a.dart';
 ''');
 
-    final aState = fileStateFor(a);
-    final bState = fileStateFor(b);
+    fileStateFor(b);
 
-    bState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      check(kind.imports).matches([
-        (import) => import.isFile(aState),
-        (import) => import
-          ..isLibrary(_dartCoreState)
-          ..isSyntheticDartCoreImport.isTrue,
-      ]);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: partOfName_0
+        name: my.lib
+      referencingFiles: [file_1]
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_1
+        imports
+          notLibrary file_0
+          library_2 dart:core synthetic
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_library_includePart_withoutPartOf() async {
@@ -1087,33 +1540,61 @@
 part 'b.dart';
 ''');
 
-    final b = newFile('$testPackageLibPath/b.dart', r'''
+    newFile('$testPackageLibPath/b.dart', r'''
 // no part of
 ''');
 
     final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-    });
 
-    // Library `a.dart` includes `b.dart` as a part.
-    _assertPartedFiles(aState, [b]);
-
-    // But `b.dart` thinks that it is a library itself.
-    final bState = fileStateFor(b);
-    bState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_2
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Refreshing the library does not change this.
     aState.refresh();
-    _assertPartedFiles(aState, [b]);
-    bState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_2
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_libraryDirective() async {
@@ -1121,22 +1602,42 @@
 library my;
 ''');
 
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, 'my');
-      kind.assertLibrary(aState);
-    });
+    fileStateFor(a);
+
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        name: my
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_noDirectives() async {
     final a = newFile('$testPackageLibPath/a.dart', '');
 
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-    });
+    fileStateFor(a);
+
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
   }
 
   /// TODO(scheglov) Test discovery of a sibling library
@@ -1150,31 +1651,51 @@
 part of my.lib;
 ''');
 
-    final bState = fileStateFor(b);
+    fileStateFor(b);
 
     // We don't know the library initially.
     // Even though the library file exists, we have not seen it yet.
-    bState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      expect(kind.directive.name, 'my.lib');
-      expect(kind.libraries, isEmpty);
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_0
+      kind: partOfName_0
+        name: my.lib
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
 
     // Read the library file.
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, 'my.lib');
-    });
-    _assertPartedFiles(aState, [b]);
+    fileStateFor(a);
 
     // Now the part knows its library.
-    bState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([aState]);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_0
+      kind: partOfName_0
+        libraries: library_1
+        library: library_1
+      referencingFiles: [file_1]
+      unlinkedKey: k00
+  /home/test/lib/nested/a.dart
+    uri: package:test/nested/a.dart
+    current
+      id: file_1
+      kind: library_1
+        name: my.lib
+        imports
+          library_2 dart:core synthetic
+        parts: file_0
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_partOfName_differentName() async {
@@ -1187,31 +1708,51 @@
 part of other.lib;
 ''');
 
-    final bState = fileStateFor(b);
+    fileStateFor(b);
 
     // We don't know the library initially.
-    bState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      expect(kind.directive.name, 'other.lib');
-      kind.assertLibraries([]);
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_0
+      kind: partOfName_0
+        name: other.lib
+      referencingFiles: [file_1]
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
 
     // Read the library file.
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, 'my.lib');
-    });
-    _assertPartedFiles(aState, [b]);
+    fileStateFor(a);
 
     // We still don't know the library, because the part wants `other.lib`,
     // but `a.dart` that includes `b.dart` has the name `my.lib`.
-    bState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([]);
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_1
+      kind: library_1
+        name: my.lib
+        imports
+          library_2 dart:core synthetic
+        parts: file_0
+      unlinkedKey: k01
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_0
+      kind: partOfName_0
+        name: other.lib
+      referencingFiles: [file_1]
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_partOfName_twoLibraries() async {
@@ -1225,71 +1766,217 @@
 part 'c.dart';
 ''');
 
-    final c = newFile('$testPackageLibPath/c.dart', r'''
+    newFile('$testPackageLibPath/c.dart', r'''
 part of my.lib;
 ''');
 
     final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, 'my.lib');
-    });
-    _assertPartedFiles(aState, [c]);
 
-    // We set the library while reading `a.dart` file.
-    final cState = fileStateFor(c);
-    cState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([aState]);
-      kind.assertLibrary(aState);
-    });
+    // When reading `a.dart` we also read `c.dart` part.
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfName_2
+        libraries: library_0
+        library: library_0
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
-    // Reading `b.dart` does not update the part.
+    // After reading `b.dart` the part has two libraries to choose from.
+    // We still keep `a.dart`, because its path is sorted first.
     final bState = fileStateFor(b);
-    bState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, 'my.lib');
-    });
-    _assertPartedFiles(bState, [c]);
-    cState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([aState, bState]);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_3
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfName_2
+        libraries: library_0 library_3
+        library: library_0
+      referencingFiles: [file_0, file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
-    // Refreshing `b.dart` does not update the part.
+    // Refresh `b.dart`, the part still uses `a.dart` as the library.
     bState.refresh();
-    cState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([aState, bState]);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_4
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfName_2
+        libraries: library_0 library_4
+        library: library_0
+      referencingFiles: [file_0, file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
-    // Refreshing `a.dart` does not update the part.
+    // Refresh `a.dart`, the part still uses `a.dart` as the library.
     aState.refresh();
-    cState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([aState, bState]);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_5
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_4
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfName_2
+        libraries: library_4 library_5
+        library: library_5
+      referencingFiles: [file_0, file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Exclude the part from `a.dart`, switch to `b.dart` instead.
     newFile(a.path, '');
     aState.refresh();
-    cState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([bState]);
-      kind.assertLibrary(bState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_6
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_4
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfName_2
+        libraries: library_4
+        library: library_4
+      referencingFiles: [file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Exclude the part from `b.dart`, no library.
     newFile(b.path, '');
     bState.refresh();
-    cState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([]);
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_6
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_7
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfName_2
+        name: my.lib
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Include into `b.dart`, use it as the library.
     newFile(b.path, r'''
@@ -1297,11 +1984,38 @@
 part 'c.dart';
 ''');
     bState.refresh();
-    cState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([bState]);
-      kind.assertLibrary(bState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_6
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_8
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfName_2
+        libraries: library_8
+        library: library_8
+      referencingFiles: [file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Include into `a.dart`, switch to `a.dart`.
     newFile(a.path, r'''
@@ -1309,11 +2023,40 @@
 part 'c.dart';
 ''');
     aState.refresh();
-    cState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([aState, bState]);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_9
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_8
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfName_2
+        libraries: library_8 library_9
+        library: library_9
+      referencingFiles: [file_0, file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_partOfUri_doesNotExist() async {
@@ -1328,23 +2071,26 @@
     // The URI in `part of URI` tells us which library to use.
     // However it does not exist, so it does not include the file, so the
     // part file will not be analyzed during the library analysis.
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile.path, a.path);
-      expect(kind.library, isNull);
-    });
-
-    final aState = fileStateFor(a);
-    expect(aState.exists, isFalse);
-    _assertPartedFiles(aState, []);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-    });
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        uriFile: file_0
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Create `a.dart` that includes the part file.
     newFile(a.path, r'''
@@ -1353,27 +2099,61 @@
 
     // The library file has already been read because of `part of uri`.
     // So, we explicitly refresh it.
+    final aState = fileStateFor(a);
     aState.refresh();
-    _assertPartedFiles(aState, [b]);
 
     // Now the part file knows its library.
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k02
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        library: library_3
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Refreshing the part file does not break the kind.
     bState.refresh();
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k02
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_4
+        library: library_3
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_partOfUri_exists_hasPart() async {
-    final a = newFile('$testPackageLibPath/a.dart', r'''
+    newFile('$testPackageLibPath/a.dart', r'''
 part 'b.dart';
 ''');
 
@@ -1382,32 +2162,56 @@
 ''');
 
     final bState = fileStateFor(b);
+
     // We have not read the library file explicitly yet.
     // But it was read because of the `part of` directive.
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile.path, a.path);
-      expect(kind.library?.file.path, a.path);
-    });
-
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-    });
-    _assertPartedFiles(aState, [b]);
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        library: library_0
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Refreshing the part file does not break the kind.
     bState.refresh();
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_3
+        library: library_0
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_partOfUri_exists_noPart() async {
@@ -1417,17 +2221,32 @@
 part of 'a.dart';
 ''');
 
-    final aState = fileStateFor(a);
-    final bState = fileStateFor(b);
+    fileStateFor(a);
+    fileStateFor(b);
 
     // The URI in `part of URI` tells us which library to use.
     // However `a.dart` does not include `b.dart` as a part, so `b.dart` will
     // not be analyzed during the library analysis.
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        uriFile: file_0
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_partOfUri_invalid() async {
@@ -1435,29 +2254,50 @@
 part of 'da:';
 ''');
 
-    final bState = fileStateFor(b);
+    fileStateFor(b);
 
     // The URI is invalid, so there is no way to discover the library.
-    bState.assertKind((kind) {
-      kind as PartOfUriUnknownFileStateKind;
-      expect(kind.directive.uri, 'da:');
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_0
+      kind: partOfUriUnknown_0
+        uri: da:
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
 
     // Reading a library that includes this part does not change the fact
     // that the URI in the `part of URI` in `b.dart` cannot be resolved.
     final a = newFile('$testPackageLibPath/a.dart', r'''
 part 'b.dart';
 ''');
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-    });
-    _assertPartedFiles(aState, [b]);
-
-    bState.assertKind((kind) {
-      kind as PartOfUriUnknownFileStateKind;
-      expect(kind.directive.uri, 'da:');
-    });
+    fileStateFor(a);
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_1
+      kind: library_1
+        imports
+          library_2 dart:core synthetic
+        parts: file_0
+      unlinkedKey: k01
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_0
+      kind: partOfUriUnknown_0
+        uri: da:
+      referencingFiles: [file_1]
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
   }
 
   test_newFile_partOfUri_twoLibraries() async {
@@ -1477,74 +2317,270 @@
     _assertPartedFiles(aState, [c]);
 
     // We set the library while reading `a.dart` file.
-    final cState = fileStateFor(c);
-    cState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        library: library_0
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Reading `b.dart` does not update the part.
     final bState = fileStateFor(b);
-    _assertPartedFiles(bState, [c]);
-    cState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        library: library_0
+      referencingFiles: [file_0, file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Refreshing `b.dart` does not update the part.
     bState.refresh();
-    cState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_4
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        library: library_0
+      referencingFiles: [file_0, file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Refreshing `a.dart` does not update the part.
     aState.refresh();
-    cState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_5
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_4
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        library: library_5
+      referencingFiles: [file_0, file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
-    // Exclude the part from `a.dart`, but the URI in `part of` still resolves
-    // to `a.dart`, so no changes.
+    // Exclude the part from `a.dart`, the URI in `part of` still resolves
+    // to `a.dart`, but it is not the library of the part anymore.
     newFile(a.path, '');
     aState.refresh();
-    cState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_6
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_4
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        uriFile: file_0
+      referencingFiles: [file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Exclude the part from `b.dart`, no changes.
     newFile(b.path, '');
     bState.refresh();
-    cState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_6
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_7
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        uriFile: file_0
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Include into `b.dart`, no changes.
     newFile(b.path, r'''
 part 'c.dart';
 ''');
     bState.refresh();
-    cState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_6
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k02
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_8
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        uriFile: file_0
+      referencingFiles: [file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
-    // Include into `a.dart`, no changes.
+    // Include into `a.dart`, restore `a.dart` as the library of the part.
     newFile(a.path, r'''
 part 'c.dart';
 ''');
     aState.refresh();
-    cState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_9
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_2
+      kind: library_8
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        library: library_9
+      referencingFiles: [file_0, file_2]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_refresh_augmentation_to_library() async {
@@ -1557,31 +2593,87 @@
 ''');
 
     final aState = fileStateFor(a);
-    _assertAugmentationFiles(aState, [b]);
-
-    final bState = fileStateFor(b);
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(aState);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        augmented: library_0
+        library: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Make it a library.
     newFile(b.path, '');
+    fileStateFor(b).refresh();
 
     // Not an augmentation anymore, but a library.
-    bState.refresh();
-    bState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-    });
-
     // But `a.dart` still uses `b.dart` as an augmentation.
-    _assertAugmentationFiles(aState, [b]);
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
 
     // ...even if we attempt to refresh.
     aState.refresh();
-    _assertAugmentationFiles(aState, [b]);
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_4
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
   }
 
   test_refresh_augmentation_to_partOfName() async {
@@ -1595,14 +2687,33 @@
 ''');
 
     final aState = fileStateFor(a);
-    _assertAugmentationFiles(aState, [b]);
 
-    final bState = fileStateFor(b);
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(aState);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        augmented: library_0
+        library: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Make it a part.
     newFile(b.path, r'''
@@ -1612,21 +2723,61 @@
     // Not an augmentation anymore, but a part.
     // This part can find the referenced library by name `my.lib`.
     // But the library does not include this part, so no library.
-    bState.refresh();
-    bState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([aState]);
-      expect(kind.library, isNull);
-    });
-
+    //
     // But `a.dart` still uses `b.dart` as an augmentation.
-    _assertAugmentationFiles(aState, [b]);
-    _assertPartedFiles(aState, []);
+    final bState = fileStateFor(b);
+    bState.refresh();
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfName_3
+        libraries: library_0
+        name: my.lib
+      referencingFiles: [file_0]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
 
     // ...even if we attempt to refresh.
     aState.refresh();
-    _assertAugmentationFiles(aState, [b]);
-    _assertPartedFiles(aState, []);
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_4
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfName_3
+        libraries: library_4
+        name: my.lib
+      referencingFiles: [file_0]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
 
     // Now include `b.dart` into `a.dart` as a part.
     newFile(a.path, r'''
@@ -1636,13 +2787,30 @@
     aState.refresh();
 
     // ...not an augmentation, but a known part.
-    _assertAugmentationFiles(aState, []);
-    _assertPartedFiles(aState, [b]);
-    bState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([aState]);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_5
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k03
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfName_3
+        libraries: library_5
+        library: library_5
+      referencingFiles: [file_0]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
   }
 
   test_refresh_augmentation_to_partOfUri() async {
@@ -1655,14 +2823,31 @@
 ''');
 
     final aState = fileStateFor(a);
-    _assertAugmentationFiles(aState, [b]);
-
-    final bState = fileStateFor(b);
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(aState);
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_2
+        augmented: library_0
+        library: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // Make it a part.
     newFile(b.path, r'''
@@ -1670,21 +2855,56 @@
 ''');
 
     // Not an augmentation anymore, but a part.
-    bState.refresh();
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      expect(kind.library, isNull);
-    });
-
     // But `a.dart` still uses `b.dart` as an augmentation.
-    _assertAugmentationFiles(aState, [b]);
-    _assertPartedFiles(aState, []);
+    final bState = fileStateFor(b);
+    bState.refresh();
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_3
+        uriFile: file_0
+      referencingFiles: [file_0]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
 
     // ...even if we attempt to refresh.
     aState.refresh();
-    _assertAugmentationFiles(aState, [b]);
-    _assertPartedFiles(aState, []);
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_4
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_3
+        uriFile: file_0
+      referencingFiles: [file_0]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
 
     // Now include `b.dart` into `a.dart` as a part.
     newFile(a.path, r'''
@@ -1693,21 +2913,36 @@
     aState.refresh();
 
     // ...not an augmentation, but a known part.
-    _assertAugmentationFiles(aState, []);
-    _assertPartedFiles(aState, [b]);
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      kind.assertLibrary(aState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_5
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k03
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_3
+        library: library_5
+      referencingFiles: [file_0]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
   }
 
   test_refresh_library_removePart_partOfName() async {
-    final a = newFile('$testPackageLibPath/a.dart', r'''
+    newFile('$testPackageLibPath/a.dart', r'''
 part of my;
 ''');
 
-    final b = newFile('$testPackageLibPath/b.dart', r'''
+    newFile('$testPackageLibPath/b.dart', r'''
 part of my;
 ''');
 
@@ -1718,26 +2953,41 @@
 ''');
 
     final cState = fileStateFor(c);
-    cState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, 'my');
-    });
-    _assertPartedFiles(cState, [a, b]);
-
-    final aState = fileStateFor(a);
-    final bState = fileStateFor(b);
 
     // Both part files know the library.
-    aState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([cState]);
-      kind.assertLibrary(cState);
-    });
-    bState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([cState]);
-      kind.assertLibrary(cState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: partOfName_0
+        libraries: library_1
+        library: library_1
+      referencingFiles: [file_2]
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfName_2
+        libraries: library_1
+        library: library_1
+      referencingFiles: [file_2]
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: library_1
+        name: my
+        imports
+          library_3 dart:core synthetic
+        parts: file_0 file_1
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     newFile(c.path, r'''
 library my;
@@ -1746,58 +2996,87 @@
 
     // Stop referencing `a.dart` part file.
     cState.refresh();
-    _assertPartedFiles(cState, [b]);
-
-    // The library does not include `a.dart` as a part anymore.
-    // The part `b.dart` is still connected.
-    aState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([cState]);
-      expect(kind.library, isNull);
-    });
-    bState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([cState]);
-      kind.assertLibrary(cState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: partOfName_0
+        libraries: library_4
+        name: my
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfName_2
+        libraries: library_4
+        library: library_4
+      referencingFiles: [file_2]
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: library_4
+        name: my
+        imports
+          library_3 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
   }
 
   test_refresh_library_removePart_partOfUri() async {
-    final a = newFile('$testPackageLibPath/a.dart', r'''
+    newFile('$testPackageLibPath/a.dart', r'''
 part of 'c.dart';
 ''');
 
-    final b = newFile('$testPackageLibPath/b.dart', r'''
+    newFile('$testPackageLibPath/b.dart', r'''
 part of 'c.dart';
 ''');
 
     final c = newFile('$testPackageLibPath/c.dart', r'''
-library my;
 part 'a.dart';
 part 'b.dart';
 ''');
 
     final cState = fileStateFor(c);
-    cState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, 'my');
-    });
-    _assertPartedFiles(cState, [a, b]);
-
-    final aState = fileStateFor(a);
-    final bState = fileStateFor(b);
 
     // Both part files know the library.
-    aState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, cState);
-      kind.assertLibrary(cState);
-    });
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, cState);
-      kind.assertLibrary(cState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: partOfUriKnown_0
+        library: library_1
+      referencingFiles: [file_2]
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        library: library_1
+      referencingFiles: [file_2]
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: library_1
+        imports
+          library_3 dart:core synthetic
+        parts: file_0 file_1
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     newFile(c.path, r'''
 library my;
@@ -1806,20 +3085,36 @@
 
     // Stop referencing `a.dart` part file.
     cState.refresh();
-    _assertPartedFiles(cState, [b]);
-
-    // But the URIs in the `part of URI` are still the same.
-    // So, both parts are still linked to the library.
-    aState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(cState));
-      expect(kind.library, isNull);
-    });
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, cState);
-      kind.assertLibrary(cState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: partOfUriKnown_0
+        uriFile: file_2
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        library: library_4
+      referencingFiles: [file_2]
+      unlinkedKey: k00
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: library_4
+        name: my
+        imports
+          library_3 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
   }
 
   test_refresh_library_to_augmentation() async {
@@ -1831,29 +3126,64 @@
 library b;
 ''');
 
-    final aState = fileStateFor(a);
-    _assertAugmentationFiles(aState, [b]);
+    fileStateFor(a);
 
-    // TODO(scheglov) Restore.
-    // final aCycle_1 = aState.libraryCycle;
-
-    final bState = fileStateFor(b);
-    bState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, 'b');
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_2
+        name: b
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     newFile(b.path, r'''
 library augment 'a.dart';
 ''');
 
     // We will discover the target by URI.
-    bState.refresh();
-    bState.assertKind((kind) {
-      kind as AugmentationKnownFileStateKind;
-      kind.assertAugmented(aState);
-      kind.assertLibrary(aState);
-    });
+    fileStateFor(b).refresh();
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        augmentations: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: augmentation_3
+        augmented: library_0
+        library: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
 
     // The file `b.dart` was something else, but now it is a known augmentation.
     // This affects libraries that include it.
@@ -1872,30 +3202,65 @@
     final b = newFile('$testPackageLibPath/b.dart', '');
 
     final aState = fileStateFor(a);
-    _assertPartedFiles(aState, [b]);
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_2
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     final aCycle_1 = aState.libraryCycle;
 
-    // No `part of`, so it is a library.
-    // It does not matter, that `a.dart` tried to use it as part.
-    final bState = fileStateFor(b);
-    bState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-    });
-
     // Make it a part.
     newFile(b.path, r'''
 part of my.lib;
 ''');
 
     // We will discover the library by name.
-    bState.refresh();
-    bState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      kind.assertLibraries([aState]);
-      kind.assertLibrary(aState);
-    });
+    fileStateFor(b).refresh();
+
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        name: my.lib
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfName_3
+        libraries: library_0
+        library: library_0
+      referencingFiles: [file_0]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
 
     // The file `b.dart` was something else, but now it is a known part.
     // This affects libraries that include it.
@@ -1909,10 +3274,21 @@
 ''');
 
     final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, 'my');
-    });
+
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        name: my
+        imports
+          library_1 dart:core synthetic
+      unlinkedKey: k00
+libraryCycles
+elementFactory
+''');
 
     newFile(a.path, r'''
 part of my;
@@ -1921,12 +3297,18 @@
     aState.refresh();
 
     // No library that includes it, so it stays unknown.
-    aState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      expect(kind.directive.name, 'my');
-      kind.assertLibraries([]);
-      expect(kind.library, isNull);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: partOfName_2
+        name: my
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
   }
 
   test_refresh_library_to_partOfUri() async {
@@ -1939,27 +3321,62 @@
 ''');
 
     final aState = fileStateFor(a);
-    _assertPartedFiles(aState, [b]);
+
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_2
+        name: b
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     final aCycle_1 = aState.libraryCycle;
 
-    final bState = fileStateFor(b);
-    bState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, 'b');
-    });
-
     newFile(b.path, r'''
 part of 'a.dart';
 ''');
 
     // We will discover the library using the URI.
-    bState.refresh();
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      kind.assertLibrary(aState);
-    });
+    fileStateFor(b).refresh();
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_3
+        library: library_0
+      referencingFiles: [file_0]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
 
     // The file `b.dart` was something else, but now it is a known part.
     // This affects libraries that include it.
@@ -1984,26 +3401,68 @@
 ''');
 
     final bState = fileStateFor(b);
-    bState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, 'my.lib');
-    });
-    _assertPartedFiles(bState, [a]);
 
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: partOfName_0
+        libraries: library_1
+        library: library_1
+      referencingFiles: [file_1]
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_1
+        name: my.lib
+        imports
+          library_2 dart:core synthetic
+        parts: file_0
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
+
+    // Get `c.dart`, not there are two libraries to chose from.
     final cState = fileStateFor(c);
-    cState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, 'my.lib');
-    });
-    _assertPartedFiles(cState, [a]);
-
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      expect(kind.directive.name, 'my.lib');
-      kind.assertLibraries([bState, cState]);
-      kind.assertLibrary(bState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: partOfName_0
+        libraries: library_1 library_3
+        library: library_1
+      referencingFiles: [file_1, file_2]
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_1
+        name: my.lib
+        imports
+          library_2 dart:core synthetic
+        parts: file_0
+      unlinkedKey: k01
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: library_3
+        name: my.lib
+        imports
+          library_2 dart:core synthetic
+        parts: file_0
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     final bCycle_1 = bState.libraryCycle;
     final cCycle_1 = cState.libraryCycle;
@@ -2013,14 +3472,43 @@
 part of my.lib;
 class A2 {}
 ''');
-    aState.refresh();
+    fileStateFor(a).refresh();
+
     // `a.dart` is still a part.
-    aState.assertKind((kind) {
-      kind as PartOfNameFileStateKind;
-      expect(kind.directive.name, 'my.lib');
-      kind.assertLibraries([bState, cState]);
-      kind.assertLibrary(bState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: partOfName_4
+        libraries: library_1 library_3
+        library: library_1
+      referencingFiles: [file_1, file_2]
+      unlinkedKey: k02
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_1
+        name: my.lib
+        imports
+          library_2 dart:core synthetic
+        parts: file_0
+      unlinkedKey: k01
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: library_3
+        name: my.lib
+        imports
+          library_2 dart:core synthetic
+        parts: file_0
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // ...but the unlinked signature of `a.dart` is different.
     // We invalidate `b.dart` it references `a.dart`.
@@ -2042,34 +3530,63 @@
 ''');
 
     final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-    });
-    _assertPartedFiles(aState, [b]);
+
+    // There is `part of` in `b.dart`, so it is a part.
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: partOfUriKnown_2
+        library: library_0
+      referencingFiles: [file_0]
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     final aCycle_1 = aState.libraryCycle;
 
-    // There is `part of` in `b.dart`, so it is a part.
-    final bState = fileStateFor(b);
-    bState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(aState));
-      kind.assertLibrary(aState);
-    });
-
-    // There are no directives in `b.dart`, so it is a library.
     newFile(b.path, r'''
 // no part of
 ''');
-    bState.refresh();
-    bState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-    });
+    fileStateFor(b).refresh();
 
+    // There are no directives in `b.dart`, so it is a library.
     // Library `a.dart` still considers `b.dart` its part.
-    _assertPartedFiles(aState, [b]);
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_0]
+      unlinkedKey: k02
+libraryCycles
+elementFactory
+''');
 
     // The library cycle for `a.dart` is different now.
     final aCycle_2 = aState.libraryCycle;
@@ -2091,25 +3608,62 @@
 ''');
 
     final bState = fileStateFor(b);
-    bState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-    });
-    _assertPartedFiles(bState, [a]);
+
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: partOfUriKnown_0
+        library: library_1
+      referencingFiles: [file_1]
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_1
+        imports
+          library_2 dart:core synthetic
+        parts: file_0
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     final cState = fileStateFor(c);
-    cState.assertKind((kind) {
-      kind as LibraryFileStateKind;
-      expect(kind.name, isNull);
-    });
-    _assertPartedFiles(cState, [a]);
-
-    final aState = fileStateFor(a);
-    aState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(bState));
-      kind.assertLibrary(bState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: partOfUriKnown_0
+        library: library_1
+      referencingFiles: [file_1, file_2]
+      unlinkedKey: k00
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_1
+        imports
+          library_2 dart:core synthetic
+        parts: file_0
+      unlinkedKey: k01
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: library_3
+        imports
+          library_2 dart:core synthetic
+        parts: file_0
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     final bCycle_1 = bState.libraryCycle;
     final cCycle_1 = cState.libraryCycle;
@@ -2119,33 +3673,53 @@
 part of 'b.dart';
 class A2 {}
 ''');
-    aState.refresh();
+
+    fileStateFor(a).refresh();
+
     // `a.dart` is still a part.
-    aState.assertKind((kind) {
-      kind as PartOfUriKnownFileStateKind;
-      expect(kind.uriFile, same(bState));
-      kind.assertLibrary(bState);
-    });
+    assertDriverStateString(testFile, r'''
+files
+  /home/test/lib/a.dart
+    uri: package:test/a.dart
+    current
+      id: file_0
+      kind: partOfUriKnown_4
+        library: library_1
+      referencingFiles: [file_1, file_2]
+      unlinkedKey: k02
+  /home/test/lib/b.dart
+    uri: package:test/b.dart
+    current
+      id: file_1
+      kind: library_1
+        imports
+          library_2 dart:core synthetic
+        parts: file_0
+      unlinkedKey: k01
+  /home/test/lib/c.dart
+    uri: package:test/c.dart
+    current
+      id: file_2
+      kind: library_3
+        imports
+          library_2 dart:core synthetic
+        parts: file_0
+      unlinkedKey: k01
+libraryCycles
+elementFactory
+''');
 
     // ...but the unlinked signature of `a.dart` is different.
     // We invalidate `b.dart` it references `a.dart`.
     // We invalidate `c.dart` it references `a.dart`.
     // Even though `a.dart` is not a valid part of `c.dart`.
+    // TODO(scheglov) Change all signature checks to the dump.
     final bCycle_2 = bState.libraryCycle;
     final cCycle_2 = cState.libraryCycle;
     expect(bCycle_2.apiSignature, isNot(bCycle_1.apiSignature));
     expect(cCycle_2.apiSignature, isNot(cCycle_1.apiSignature));
   }
 
-  void _assertAugmentationFiles(FileState fileState, List<File> expected) {
-    final actualFiles = fileState.augmentationFiles.map((part) {
-      if (part != null) {
-        return getFile(part.path);
-      }
-    }).toList();
-    expect(actualFiles, expected);
-  }
-
   void _assertPartedFiles(FileState fileState, List<File> expected) {
     final actualFiles = fileState.partedFiles.map((part) {
       if (part != null) {
@@ -2889,224 +4463,6 @@
   }
 }
 
-extension on FileState {
-  void assertKind(void Function(FileStateKind kind) f) {
-    expect(kind.file, same(this));
-    f(kind);
-  }
-}
-
-extension on FileStateKind {
-  void assertLibrary(FileState expectedLibraryFile) {
-    final expectedKind = expectedLibraryFile.kind as LibraryFileStateKind;
-    expect(library, same(expectedKind));
-  }
-}
-
-extension on AugmentationKnownFileStateKind {
-  void assertAugmented(FileState expectedFile) {
-    // The expected file must be a valid augmentation target.
-    final expectedKind = expectedFile.kind as LibraryOrAugmentationFileKind;
-
-    // Any valid augmentation target is always the URI target.
-    expect(uriFile, same(expectedFile));
-
-    // Check the augmentation target itself.
-    expect(augmented, same(expectedKind));
-  }
-}
-
-extension on PartOfNameFileStateKind {
-  void assertLibraries(Iterable<FileState> expectedFiles) {
-    final expectedKinds = expectedFiles.map((e) {
-      return e.kind as LibraryFileStateKind;
-    }).toList();
-    expect(libraries, unorderedEquals(expectedKinds));
-  }
-}
-
-extension on CheckTarget<ImportDirectiveState> {
-  @useResult
-  CheckTarget<Source?> get importedLibrarySource {
-    return nest(
-      value.importedLibrarySource,
-      (selected) => 'importedLibrarySource ${valueStr(selected)}',
-    );
-  }
-
-  @useResult
-  CheckTarget<bool> get isSyntheticDartCoreImport {
-    return nest(
-      value.isSyntheticDartCoreImport,
-      (selected) => 'isSyntheticDartCoreImport ${valueStr(selected)}',
-    );
-  }
-
-  /// Is [ImportDirectiveWithFile], but not a library.
-  void isFile(FileState expected) {
-    this.isA<ImportDirectiveWithFile>()
-      ..importedFile.isIdenticalTo(expected)
-      ..importedSource.uri.isEqualTo(expected.uri)
-      ..importedLibrary.isNull
-      ..importedLibrarySource.isNull;
-  }
-
-  /// Is [ImportDirectiveWithFile], and is a library.
-  void isLibrary(FileState expected) {
-    final expectedKind = expected.kind as LibraryFileStateKind;
-    this.isA<ImportDirectiveWithFile>()
-      ..importedFile.isIdenticalTo(expected)
-      ..importedSource.uri.isEqualTo(expected.uri)
-      ..importedLibrary.isNotNull.isIdenticalTo(expectedKind)
-      ..importedLibrarySource.isNotNull.uri.isEqualTo(expected.uri);
-  }
-
-  /// Exactly [ImportDirectiveState], even the file is not known.
-  void isNotFile() {
-    hasExactType<ImportDirectiveState>();
-  }
-
-  void withInSummaryLibrary(Uri expected) {
-    this.isA<ImportDirectiveWithInSummarySource>()
-      ..importedSource.uri.isEqualTo(expected)
-      ..importedLibrarySource.isNotNull.uri.isEqualTo(expected);
-  }
-
-  void withInSummaryNotLibrary(Uri expected) {
-    this.isA<ImportDirectiveWithInSummarySource>()
-      ..importedSource.uri.isEqualTo(expected)
-      ..importedLibrarySource.isNull;
-  }
-}
-
-extension on CheckTarget<ExportDirectiveState> {
-  @useResult
-  CheckTarget<Source?> get exportedLibrarySource {
-    return nest(
-      value.exportedLibrarySource,
-      (selected) => 'exportedLibrarySource ${valueStr(selected)}',
-    );
-  }
-
-  /// Is [ExportDirectiveWithFile], but not a library.
-  void isFile(FileState expected) {
-    this.isA<ExportDirectiveWithFile>()
-      ..exportedFile.isIdenticalTo(expected)
-      ..exportedSource.uri.isEqualTo(expected.uri)
-      ..exportedLibrary.isNull
-      ..exportedLibrarySource.isNull;
-  }
-
-  /// Is [ExportDirectiveWithFile], and is a library.
-  void isLibrary(FileState expected) {
-    final expectedKind = expected.kind as LibraryFileStateKind;
-    this.isA<ExportDirectiveWithFile>()
-      ..exportedFile.isIdenticalTo(expected)
-      ..exportedSource.uri.isEqualTo(expected.uri)
-      ..exportedLibrary.isIdenticalTo(expectedKind)
-      ..exportedLibrarySource.isNotNull.uri.isEqualTo(expected.uri);
-  }
-
-  /// Exactly [ExportDirectiveState], even the file is not known.
-  void isNotFile() {
-    hasExactType<ExportDirectiveState>();
-  }
-
-  void withInSummaryLibrary(Uri expected) {
-    this.isA<ExportDirectiveWithInSummarySource>()
-      ..exportedSource.uri.isEqualTo(expected)
-      ..exportedLibrarySource.isNotNull.uri.isEqualTo(expected);
-  }
-
-  void withInSummaryNotLibrary(Uri expected) {
-    this.isA<ExportDirectiveWithInSummarySource>()
-      ..exportedSource.uri.isEqualTo(expected)
-      ..exportedLibrarySource.isNull;
-  }
-}
-
-extension on CheckTarget<ImportDirectiveWithFile> {
-  @useResult
-  CheckTarget<FileState> get importedFile {
-    return nest(
-      value.importedFile,
-      (selected) => 'importedFile ${valueStr(selected)}',
-    );
-  }
-
-  @useResult
-  CheckTarget<LibraryFileStateKind?> get importedLibrary {
-    return nest(
-      value.importedLibrary,
-      (selected) => 'importedLibrary ${valueStr(selected)}',
-    );
-  }
-
-  @useResult
-  CheckTarget<Source> get importedSource {
-    return nest(
-      value.importedSource,
-      (selected) => 'importedSource ${valueStr(selected)}',
-    );
-  }
-}
-
-extension on CheckTarget<ExportDirectiveWithFile> {
-  @useResult
-  CheckTarget<FileState> get exportedFile {
-    return nest(
-      value.exportedFile,
-      (selected) => 'exportedFile ${valueStr(selected)}',
-    );
-  }
-
-  @useResult
-  CheckTarget<LibraryFileStateKind?> get exportedLibrary {
-    return nest(
-      value.exportedLibrary,
-      (selected) => 'exportedLibrary ${valueStr(selected)}',
-    );
-  }
-
-  @useResult
-  CheckTarget<Source> get exportedSource {
-    return nest(
-      value.exportedSource,
-      (selected) => 'exportedSource ${valueStr(selected)}',
-    );
-  }
-}
-
-extension on CheckTarget<ImportDirectiveWithInSummarySource> {
-  @useResult
-  CheckTarget<InSummarySource> get importedSource {
-    return nest(
-      value.importedSource,
-      (selected) => 'importedSource ${valueStr(selected)}',
-    );
-  }
-}
-
-extension on CheckTarget<ExportDirectiveWithInSummarySource> {
-  @useResult
-  CheckTarget<InSummarySource> get exportedSource {
-    return nest(
-      value.exportedSource,
-      (selected) => 'exportedSource ${valueStr(selected)}',
-    );
-  }
-}
-
-extension on CheckTarget<Source> {
-  @useResult
-  CheckTarget<Uri> get uri {
-    return nest(
-      value.uri,
-      (selected) => 'uri ${valueStr(selected)}',
-    );
-  }
-}
-
 extension _Either2Extension<T1, T2> on Either2<T1, T2> {
   T1 get t1 {
     late T1 result;
diff --git a/pkg/analyzer/test/src/dart/micro/file_resolution.dart b/pkg/analyzer/test/src/dart/micro/file_resolution.dart
index 85fcdfd..8b7da75 100644
--- a/pkg/analyzer/test/src/dart/micro/file_resolution.dart
+++ b/pkg/analyzer/test/src/dart/micro/file_resolution.dart
@@ -39,6 +39,8 @@
 
   late FileResolver fileResolver;
 
+  final printer.FileStateKindIdProvider _fileStateKindIdProvider =
+      printer.FileStateKindIdProvider();
   final printer.FileStateIdProvider _fileStateIdProvider =
       printer.FileStateIdProvider();
   final printer.KeyShorter _keyShorter = printer.KeyShorter();
@@ -74,12 +76,14 @@
     final buffer = StringBuffer();
     printer.AnalyzerStatePrinter(
       byteStore: byteStore,
+      fileStateKindIdProvider: _fileStateKindIdProvider,
       fileStateIdProvider: _fileStateIdProvider,
       keyShorter: _keyShorter,
       libraryContext: libraryContext,
       omitSdkFiles: omitSdkFiles,
       resourceProvider: resourceProvider,
       sink: buffer,
+      withKeysGetPut: true,
     ).writeFileResolver(testData);
     final actual = buffer.toString();
 
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index a65c96b..115aca1 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -45,32 +45,44 @@
     // First time we refresh everything.
     await resolveFile(c.path);
 
+    // TODO(scheglov) We have duplicates in `referencingFiles`.
+    // The reason is that we temporarily have two ways to access imports.
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2, file_2]
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
   /workspace/dart/test/lib/b.dart
+    uri: package:dart.test/b.dart
     current
       id: file_1
-      kind: library
+      kind: library_2
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2, file_2]
       unlinkedKey: k01
     unlinkedGet: []
     unlinkedPut: [k01]
-    uri: package:dart.test/b.dart
   /workspace/dart/test/lib/c.dart
+    uri: package:dart.test/c.dart
     current
       id: file_2
-      kind: library
+      kind: library_3
+        imports
+          library_0
+          library_2
+          library_1 dart:core synthetic
       unlinkedKey: k02
     unlinkedGet: []
     unlinkedPut: [k02]
-    uri: package:dart.test/c.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     current
@@ -104,29 +116,39 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2, file_2]
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
   /workspace/dart/test/lib/b.dart
+    uri: package:dart.test/b.dart
     current
       id: file_1
-      kind: library
+      kind: library_2
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2, file_2]
       unlinkedKey: k01
     unlinkedGet: []
     unlinkedPut: [k01]
-    uri: package:dart.test/b.dart
   /workspace/dart/test/lib/c.dart
+    uri: package:dart.test/c.dart
     current
       id: file_2
-      kind: library
+      kind: library_3
+        imports
+          library_0
+          library_2
+          library_1 dart:core synthetic
       unlinkedKey: k02
     unlinkedGet: []
     unlinkedPut: [k02]
-    uri: package:dart.test/c.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     current
@@ -160,29 +182,39 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2, file_2]
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
   /workspace/dart/test/lib/b.dart
+    uri: package:dart.test/b.dart
     current
       id: file_1
-      kind: library
+      kind: library_2
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2, file_2]
       unlinkedKey: k01
     unlinkedGet: []
     unlinkedPut: [k01]
-    uri: package:dart.test/b.dart
   /workspace/dart/test/lib/c.dart
+    uri: package:dart.test/c.dart
     current
       id: file_2
-      kind: library
+      kind: library_3
+        imports
+          library_0
+          library_2
+          library_1 dart:core synthetic
       unlinkedKey: k02
     unlinkedGet: []
     unlinkedPut: [k02]
-    uri: package:dart.test/c.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     current
@@ -216,21 +248,24 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
   /workspace/dart/test/lib/b.dart
+    uri: package:dart.test/b.dart
     current
       id: file_1
-      kind: library
+      kind: library_2
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2]
       unlinkedKey: k01
     unlinkedGet: []
     unlinkedPut: [k01]
-    uri: package:dart.test/b.dart
   /workspace/dart/test/lib/c.dart
+    uri: package:dart.test/c.dart
     unlinkedGet: []
     unlinkedPut: [k02]
-    uri: package:dart.test/c.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     get: []
@@ -256,29 +291,39 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     current
       id: file_3
-      kind: library
+      kind: library_4
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_4, file_4]
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00, k00]
-    uri: package:dart.test/a.dart
   /workspace/dart/test/lib/b.dart
+    uri: package:dart.test/b.dart
     current
       id: file_1
-      kind: library
+      kind: library_2
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_2, file_4, file_4]
       unlinkedKey: k01
     unlinkedGet: []
     unlinkedPut: [k01]
-    uri: package:dart.test/b.dart
   /workspace/dart/test/lib/c.dart
+    uri: package:dart.test/c.dart
     current
       id: file_4
-      kind: library
+      kind: library_5
+        imports
+          library_4
+          library_2
+          library_1 dart:core synthetic
       unlinkedKey: k02
     unlinkedGet: []
     unlinkedPut: [k02, k02]
-    uri: package:dart.test/c.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     current
@@ -427,22 +472,26 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
   /workspace/dart/test/lib/b.dart
+    uri: package:dart.test/b.dart
     current
       id: file_1
-      kind: partOfUriKnown
-        library: file_0
+      kind: partOfUriKnown_2
+        library: library_0
+      referencingFiles: [file_0]
       unlinkedKey: k01
     unlinkedGet: []
     unlinkedPut: [k01]
-    uri: package:dart.test/b.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     current
@@ -462,13 +511,13 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
   /workspace/dart/test/lib/b.dart
+    uri: package:dart.test/b.dart
     unlinkedGet: []
     unlinkedPut: [k01]
-    uri: package:dart.test/b.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     get: []
@@ -483,22 +532,26 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     current
       id: file_2
-      kind: library
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+        parts: file_3
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00, k00]
-    uri: package:dart.test/a.dart
   /workspace/dart/test/lib/b.dart
+    uri: package:dart.test/b.dart
     current
       id: file_3
-      kind: partOfUriKnown
-        library: file_2
+      kind: partOfUriKnown_4
+        library: library_3
+      referencingFiles: [file_2]
       unlinkedKey: k01
     unlinkedGet: []
     unlinkedPut: [k01, k01]
-    uri: package:dart.test/b.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     current
@@ -535,30 +588,38 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+        parts: file_1
+      referencingFiles: [file_2, file_2]
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
   /workspace/dart/test/lib/b.dart
+    uri: package:dart.test/b.dart
     current
       id: file_1
-      kind: partOfUriKnown
-        library: file_0
+      kind: partOfUriKnown_2
+        library: library_0
+      referencingFiles: [file_0]
       unlinkedKey: k01
     unlinkedGet: []
     unlinkedPut: [k01]
-    uri: package:dart.test/b.dart
   /workspace/dart/test/lib/c.dart
+    uri: package:dart.test/c.dart
     current
       id: file_2
-      kind: library
+      kind: library_3
+        imports
+          library_0
+          library_1 dart:core synthetic
       unlinkedKey: k02
     unlinkedGet: []
     unlinkedPut: [k02]
-    uri: package:dart.test/c.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     current
@@ -585,17 +646,17 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
   /workspace/dart/test/lib/b.dart
+    uri: package:dart.test/b.dart
     unlinkedGet: []
     unlinkedPut: [k01]
-    uri: package:dart.test/b.dart
   /workspace/dart/test/lib/c.dart
+    uri: package:dart.test/c.dart
     unlinkedGet: []
     unlinkedPut: [k02]
-    uri: package:dart.test/c.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     get: []
@@ -613,30 +674,38 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     current
       id: file_3
-      kind: library
+      kind: library_4
+        imports
+          library_1 dart:core synthetic
+        parts: file_4
+      referencingFiles: [file_5, file_5]
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00, k00]
-    uri: package:dart.test/a.dart
   /workspace/dart/test/lib/b.dart
+    uri: package:dart.test/b.dart
     current
       id: file_4
-      kind: partOfUriKnown
-        library: file_3
+      kind: partOfUriKnown_5
+        library: library_4
+      referencingFiles: [file_3]
       unlinkedKey: k01
     unlinkedGet: []
     unlinkedPut: [k01, k01]
-    uri: package:dart.test/b.dart
   /workspace/dart/test/lib/c.dart
+    uri: package:dart.test/c.dart
     current
       id: file_5
-      kind: library
+      kind: library_6
+        imports
+          library_4
+          library_1 dart:core synthetic
       unlinkedKey: k02
     unlinkedGet: []
     unlinkedPut: [k02, k02]
-    uri: package:dart.test/c.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     current
@@ -780,13 +849,15 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     current
@@ -808,9 +879,9 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     get: []
@@ -1317,13 +1388,15 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     current
@@ -1344,13 +1417,15 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     current
@@ -1375,21 +1450,27 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_1, file_1]
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
   /workspace/dart/test/lib/b.dart
+    uri: package:dart.test/b.dart
     current
       id: file_1
-      kind: library
+      kind: library_2
+        imports
+          library_0
+          library_1 dart:core synthetic
       unlinkedKey: k08
     unlinkedGet: []
     unlinkedPut: [k08]
-    uri: package:dart.test/b.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     current
@@ -1426,21 +1507,27 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/a.dart
+    uri: package:dart.test/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_1, file_1]
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/a.dart
   /workspace/dart/test/lib/b.dart
+    uri: package:dart.test/b.dart
     current
       id: file_1
-      kind: library
+      kind: library_2
+        imports
+          library_0
+          library_1 dart:core synthetic
       unlinkedKey: k08
     unlinkedGet: []
     unlinkedPut: [k08]
-    uri: package:dart.test/b.dart
 libraryCycles
   /workspace/dart/test/lib/a.dart
     current
@@ -1481,13 +1568,15 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/test.dart
+    uri: package:dart.test/test.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/test.dart
 libraryCycles
   /workspace/dart/test/lib/test.dart
     current
@@ -1514,13 +1603,15 @@
     assertStateString(r'''
 files
   /workspace/dart/test/lib/test.dart
+    uri: package:dart.test/test.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.test/test.dart
 libraryCycles
   /workspace/dart/test/lib/test.dart
     current
@@ -1652,29 +1743,38 @@
     assertStateString(r'''
 files
   /workspace/dart/aaa/lib/a.dart
+    uri: package:dart.aaa/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_1, file_1, file_2, file_2]
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.aaa/a.dart
   /workspace/dart/aaa/lib/b.dart
+    uri: package:dart.aaa/b.dart
     current
       id: file_1
-      kind: library
+      kind: library_2
+        imports
+          library_0
+          library_1 dart:core synthetic
       unlinkedKey: k01
     unlinkedGet: []
     unlinkedPut: [k01]
-    uri: package:dart.aaa/b.dart
   /workspace/dart/aaa/lib/c.dart
+    uri: package:dart.aaa/c.dart
     current
       id: file_2
-      kind: library
+      kind: library_3
+        imports
+          library_0
+          library_1 dart:core synthetic
       unlinkedKey: k02
     unlinkedGet: []
     unlinkedPut: [k02]
-    uri: package:dart.aaa/c.dart
 libraryCycles
   /workspace/dart/aaa/lib/a.dart
     current
@@ -1709,25 +1809,31 @@
     assertStateString(r'''
 files
   /workspace/dart/aaa/lib/a.dart
+    uri: package:dart.aaa/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_1, file_1, file_2, file_2]
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.aaa/a.dart
   /workspace/dart/aaa/lib/b.dart
+    uri: package:dart.aaa/b.dart
     unlinkedGet: []
     unlinkedPut: [k01]
-    uri: package:dart.aaa/b.dart
   /workspace/dart/aaa/lib/c.dart
+    uri: package:dart.aaa/c.dart
     current
       id: file_2
-      kind: library
+      kind: library_3
+        imports
+          library_0
+          library_1 dart:core synthetic
       unlinkedKey: k02
     unlinkedGet: []
     unlinkedPut: [k02]
-    uri: package:dart.aaa/c.dart
 libraryCycles
   /workspace/dart/aaa/lib/a.dart
     current
@@ -1785,53 +1891,72 @@
     assertStateString(r'''
 files
   /workspace/dart/aaa/lib/a.dart
+    uri: package:dart.aaa/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_3, file_3, file_4, file_4]
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.aaa/a.dart
   /workspace/dart/aaa/lib/b.dart
+    uri: package:dart.aaa/b.dart
     current
       id: file_1
-      kind: library
+      kind: library_2
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_4, file_4]
       unlinkedKey: k01
     unlinkedGet: []
     unlinkedPut: [k01]
-    uri: package:dart.aaa/b.dart
   /workspace/dart/aaa/lib/c.dart
+    uri: package:dart.aaa/c.dart
     current
       id: file_2
-      kind: library
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_5, file_5]
       unlinkedKey: k02
     unlinkedGet: []
     unlinkedPut: [k02]
-    uri: package:dart.aaa/c.dart
   /workspace/dart/aaa/lib/d.dart
+    uri: package:dart.aaa/d.dart
     current
       id: file_3
-      kind: library
+      kind: library_4
+        imports
+          library_0
+          library_1 dart:core synthetic
       unlinkedKey: k03
     unlinkedGet: []
     unlinkedPut: [k03]
-    uri: package:dart.aaa/d.dart
   /workspace/dart/aaa/lib/e.dart
+    uri: package:dart.aaa/e.dart
     current
       id: file_4
-      kind: library
+      kind: library_5
+        imports
+          library_0
+          library_2
+          library_1 dart:core synthetic
       unlinkedKey: k04
     unlinkedGet: []
     unlinkedPut: [k04]
-    uri: package:dart.aaa/e.dart
   /workspace/dart/aaa/lib/f.dart
+    uri: package:dart.aaa/f.dart
     current
       id: file_5
-      kind: library
+      kind: library_6
+        imports
+          library_3
+          library_1 dart:core synthetic
       unlinkedKey: k05
     unlinkedGet: []
     unlinkedPut: [k05]
-    uri: package:dart.aaa/f.dart
 libraryCycles
   /workspace/dart/aaa/lib/a.dart
     current
@@ -1886,45 +2011,57 @@
     assertStateString(r'''
 files
   /workspace/dart/aaa/lib/a.dart
+    uri: package:dart.aaa/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_3, file_3, file_4, file_4]
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.aaa/a.dart
   /workspace/dart/aaa/lib/b.dart
+    uri: package:dart.aaa/b.dart
     unlinkedGet: []
     unlinkedPut: [k01]
-    uri: package:dart.aaa/b.dart
   /workspace/dart/aaa/lib/c.dart
+    uri: package:dart.aaa/c.dart
     current
       id: file_2
-      kind: library
+      kind: library_3
+        imports
+          library_1 dart:core synthetic
+      referencingFiles: [file_5, file_5]
       unlinkedKey: k02
     unlinkedGet: []
     unlinkedPut: [k02]
-    uri: package:dart.aaa/c.dart
   /workspace/dart/aaa/lib/d.dart
+    uri: package:dart.aaa/d.dart
     current
       id: file_3
-      kind: library
+      kind: library_4
+        imports
+          library_0
+          library_1 dart:core synthetic
       unlinkedKey: k03
     unlinkedGet: []
     unlinkedPut: [k03]
-    uri: package:dart.aaa/d.dart
   /workspace/dart/aaa/lib/e.dart
+    uri: package:dart.aaa/e.dart
     unlinkedGet: []
     unlinkedPut: [k04]
-    uri: package:dart.aaa/e.dart
   /workspace/dart/aaa/lib/f.dart
+    uri: package:dart.aaa/f.dart
     current
       id: file_5
-      kind: library
+      kind: library_6
+        imports
+          library_3
+          library_1 dart:core synthetic
       unlinkedKey: k05
     unlinkedGet: []
     unlinkedPut: [k05]
-    uri: package:dart.aaa/f.dart
 libraryCycles
   /workspace/dart/aaa/lib/a.dart
     current
@@ -1981,13 +2118,15 @@
     assertStateString(r'''
 files
   /workspace/dart/aaa/lib/a.dart
+    uri: package:dart.aaa/a.dart
     current
       id: file_0
-      kind: library
+      kind: library_0
+        imports
+          library_1 dart:core synthetic
       unlinkedKey: k00
     unlinkedGet: []
     unlinkedPut: [k00]
-    uri: package:dart.aaa/a.dart
 libraryCycles
   /workspace/dart/aaa/lib/a.dart
     current
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index a32ceaf..dbd3c0e 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -32,6 +32,7 @@
 import '../../summary/macros_environment.dart';
 import '../analysis/analyzer_state_printer.dart';
 import 'context_collection_resolution_caching.dart';
+import 'node_text_expectations.dart';
 import 'resolution.dart';
 
 export 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
@@ -138,6 +139,8 @@
   /// Optional summaries to provide for the collection.
   List<File>? librarySummaryFiles;
 
+  final FileStateKindIdProvider _fileStateKindIdProvider =
+      FileStateKindIdProvider();
   final FileStateIdProvider _fileStateIdProvider = FileStateIdProvider();
   final KeyShorter _keyShorter = KeyShorter();
 
@@ -177,17 +180,20 @@
     final buffer = StringBuffer();
     AnalyzerStatePrinter(
       byteStore: _byteStore,
+      fileStateKindIdProvider: _fileStateKindIdProvider,
       fileStateIdProvider: _fileStateIdProvider,
       keyShorter: _keyShorter,
       libraryContext: analysisDriver.libraryContext,
       omitSdkFiles: omitSdkFiles,
       resourceProvider: resourceProvider,
       sink: buffer,
+      withKeysGetPut: false,
     ).writeAnalysisDriver(analysisDriver.testView!);
     final actual = buffer.toString();
 
     if (actual != expected) {
       print(actual);
+      NodeTextExpectationsCollector.add(actual);
     }
     expect(actual, expected);
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart b/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
index d528bce..8891963 100644
--- a/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
+++ b/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
@@ -12,6 +12,7 @@
   static const updatingIsEnabled = false;
 
   static const assertMethods = {
+    'ContextResolutionTest.assertDriverStateString',
     'FileResolutionTest.assertStateString',
     'ResolutionTest.assertResolvedNodeText',
   };
diff --git a/tools/VERSION b/tools/VERSION
index f2b2239..7fe1fe7 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 229
+PRERELEASE 230
 PRERELEASE_PATCH 0
\ No newline at end of file