diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index 299fa4e..4f05563 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -26552,8 +26552,16 @@
     }
     final notebookSelectorJson = json['notebookSelector'];
     final notebookSelector = (notebookSelectorJson as List<Object?>)
-        .map((item) => NotebookDocumentSyncOptionsNotebookSelector.fromJson(
-            item as Map<String, Object?>))
+        .map((item) => NotebookDocumentSyncOptionsNotebookSelector.canParse(
+                item, nullLspJsonReporter)
+            ? Either2<NotebookDocumentSyncOptionsNotebookSelector, NotebookDocumentSyncOptionsNotebookSelector2>.t1(
+                NotebookDocumentSyncOptionsNotebookSelector.fromJson(
+                    item as Map<String, Object?>))
+            : (NotebookDocumentSyncOptionsNotebookSelector2.canParse(item, nullLspJsonReporter)
+                ? Either2<NotebookDocumentSyncOptionsNotebookSelector,
+                        NotebookDocumentSyncOptionsNotebookSelector2>.t2(
+                    NotebookDocumentSyncOptionsNotebookSelector2.fromJson(item as Map<String, Object?>))
+                : (throw '''$item was not one of (NotebookDocumentSyncOptionsNotebookSelector, NotebookDocumentSyncOptionsNotebookSelector2)''')))
         .toList();
     final saveJson = json['save'];
     final save = saveJson as bool?;
@@ -26564,7 +26572,9 @@
   }
 
   /// The notebooks to be synced
-  final List<NotebookDocumentSyncOptionsNotebookSelector> notebookSelector;
+  final List<
+      Either2<NotebookDocumentSyncOptionsNotebookSelector,
+          NotebookDocumentSyncOptionsNotebookSelector2>> notebookSelector;
 
   /// Whether save notification should be forwarded to the server. Will only be
   /// honored if mode === `notebook`.
@@ -26572,8 +26582,7 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['notebookSelector'] =
-        notebookSelector.map((item) => item.toJson()).toList();
+    __result['notebookSelector'] = notebookSelector;
     if (save != null) {
       __result['save'] = save;
     }
@@ -26595,10 +26604,12 @@
         }
         if (!((notebookSelector is List<Object?> &&
             (notebookSelector.every((item) =>
-                NotebookDocumentSyncOptionsNotebookSelector.canParse(
-                    item, reporter)))))) {
+                (NotebookDocumentSyncOptionsNotebookSelector.canParse(
+                        item, reporter) ||
+                    NotebookDocumentSyncOptionsNotebookSelector2.canParse(
+                        item, reporter))))))) {
           reporter.reportError(
-              'must be of type List<NotebookDocumentSyncOptionsNotebookSelector>');
+              'must be of type List<Either2<NotebookDocumentSyncOptionsNotebookSelector, NotebookDocumentSyncOptionsNotebookSelector2>>');
           return false;
         }
       } finally {
@@ -26628,8 +26639,12 @@
       return listEqual(
               notebookSelector,
               other.notebookSelector,
-              (NotebookDocumentSyncOptionsNotebookSelector a,
-                      NotebookDocumentSyncOptionsNotebookSelector b) =>
+              (Either2<NotebookDocumentSyncOptionsNotebookSelector,
+                              NotebookDocumentSyncOptionsNotebookSelector2>
+                          a,
+                      Either2<NotebookDocumentSyncOptionsNotebookSelector,
+                              NotebookDocumentSyncOptionsNotebookSelector2>
+                          b) =>
                   a == b) &&
           save == other.save &&
           true;
@@ -26715,6 +26730,74 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class NotebookDocumentSyncOptionsCells2 implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentSyncOptionsCells2.canParse,
+    NotebookDocumentSyncOptionsCells2.fromJson,
+  );
+
+  NotebookDocumentSyncOptionsCells2({
+    required this.language,
+  });
+  static NotebookDocumentSyncOptionsCells2 fromJson(Map<String, Object?> json) {
+    final languageJson = json['language'];
+    final language = languageJson as String;
+    return NotebookDocumentSyncOptionsCells2(
+      language: language,
+    );
+  }
+
+  final String language;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['language'] = language;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('language');
+      try {
+        if (!obj.containsKey('language')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final language = obj['language'];
+        if (language == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(language is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type NotebookDocumentSyncOptionsCells2');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentSyncOptionsCells2 &&
+        other.runtimeType == NotebookDocumentSyncOptionsCells2) {
+      return language == other.language && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => language.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class NotebookDocumentSyncOptionsNotebookSelector implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     NotebookDocumentSyncOptionsNotebookSelector.canParse,
@@ -26722,34 +26805,33 @@
   );
 
   NotebookDocumentSyncOptionsNotebookSelector({
-    required this.cells,
-    this.notebookDocument,
+    this.cells,
+    required this.notebookDocument,
   });
   static NotebookDocumentSyncOptionsNotebookSelector fromJson(
       Map<String, Object?> json) {
     final cellsJson = json['cells'];
-    final cells = (cellsJson as List<Object?>)
-        .map((item) => NotebookDocumentSyncOptionsCells.fromJson(
+    final cells = (cellsJson as List<Object?>?)
+        ?.map((item) => NotebookDocumentSyncOptionsCells.fromJson(
             item as Map<String, Object?>))
         .toList();
     final notebookDocumentJson = json['notebookDocument'];
-    final notebookDocument = notebookDocumentJson == null
-        ? null
-        : ((NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter) ||
-                NotebookDocumentFilter2.canParse(
-                    notebookDocumentJson, nullLspJsonReporter) ||
-                NotebookDocumentFilter3.canParse(
-                    notebookDocumentJson, nullLspJsonReporter))
-            ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t1(
-                NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter)
-                    ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t1(
-                        NotebookDocumentFilter1.fromJson(
-                            notebookDocumentJson as Map<String, Object?>))
-                    : (NotebookDocumentFilter2.canParse(notebookDocumentJson, nullLspJsonReporter)
-                        ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t2(
-                            NotebookDocumentFilter2.fromJson(notebookDocumentJson as Map<String, Object?>))
-                        : (NotebookDocumentFilter3.canParse(notebookDocumentJson, nullLspJsonReporter) ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t3(NotebookDocumentFilter3.fromJson(notebookDocumentJson as Map<String, Object?>)) : (throw '''$notebookDocumentJson was not one of (NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3)'''))))
-            : (notebookDocumentJson is String ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t2(notebookDocumentJson) : (throw '''$notebookDocumentJson was not one of (Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String)''')));
+    final notebookDocument = (NotebookDocumentFilter1.canParse(
+                notebookDocumentJson, nullLspJsonReporter) ||
+            NotebookDocumentFilter2.canParse(
+                notebookDocumentJson, nullLspJsonReporter) ||
+            NotebookDocumentFilter3.canParse(
+                notebookDocumentJson, nullLspJsonReporter))
+        ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t1(
+            NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter)
+                ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t1(
+                    NotebookDocumentFilter1.fromJson(
+                        notebookDocumentJson as Map<String, Object?>))
+                : (NotebookDocumentFilter2.canParse(notebookDocumentJson, nullLspJsonReporter)
+                    ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t2(
+                        NotebookDocumentFilter2.fromJson(notebookDocumentJson as Map<String, Object?>))
+                    : (NotebookDocumentFilter3.canParse(notebookDocumentJson, nullLspJsonReporter) ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t3(NotebookDocumentFilter3.fromJson(notebookDocumentJson as Map<String, Object?>)) : (throw '''$notebookDocumentJson was not one of (NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3)'''))))
+        : (notebookDocumentJson is String ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t2(notebookDocumentJson) : (throw '''$notebookDocumentJson was not one of (Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String)'''));
     return NotebookDocumentSyncOptionsNotebookSelector(
       cells: cells,
       notebookDocument: notebookDocument,
@@ -26757,21 +26839,21 @@
   }
 
   /// The cells of the matching notebook to be synced.
-  final List<NotebookDocumentSyncOptionsCells> cells;
+  final List<NotebookDocumentSyncOptionsCells>? cells;
 
   /// The notebook to be synced If a string value is provided it matches against
   /// the notebook type. '*' matches every notebook.
   final Either2<
       Either3<NotebookDocumentFilter1, NotebookDocumentFilter2,
           NotebookDocumentFilter3>,
-      String>? notebookDocument;
+      String> notebookDocument;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['cells'] = cells.map((item) => item.toJson()).toList();
-    if (notebookDocument != null) {
-      __result['notebookDocument'] = notebookDocument;
+    if (cells != null) {
+      __result['cells'] = cells?.map((item) => item.toJson()).toList();
     }
+    __result['notebookDocument'] = notebookDocument;
     return __result;
   }
 
@@ -26779,18 +26861,12 @@
     if (obj is Map<String, Object?>) {
       reporter.push('cells');
       try {
-        if (!obj.containsKey('cells')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
         final cells = obj['cells'];
-        if (cells == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!((cells is List<Object?> &&
-            (cells.every((item) =>
-                NotebookDocumentSyncOptionsCells.canParse(item, reporter)))))) {
+        if (cells != null &&
+            !((cells is List<Object?> &&
+                (cells.every((item) =>
+                    NotebookDocumentSyncOptionsCells.canParse(
+                        item, reporter)))))) {
           reporter.reportError(
               'must be of type List<NotebookDocumentSyncOptionsCells>');
           return false;
@@ -26800,14 +26876,19 @@
       }
       reporter.push('notebookDocument');
       try {
+        if (!obj.containsKey('notebookDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
         final notebookDocument = obj['notebookDocument'];
-        if (notebookDocument != null &&
-            !(((NotebookDocumentFilter1.canParse(notebookDocument, reporter) ||
-                    NotebookDocumentFilter2.canParse(
-                        notebookDocument, reporter) ||
-                    NotebookDocumentFilter3.canParse(
-                        notebookDocument, reporter)) ||
-                notebookDocument is String))) {
+        if (notebookDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(((NotebookDocumentFilter1.canParse(notebookDocument, reporter) ||
+                NotebookDocumentFilter2.canParse(notebookDocument, reporter) ||
+                NotebookDocumentFilter3.canParse(notebookDocument, reporter)) ||
+            notebookDocument is String))) {
           reporter.reportError(
               'must be of type Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>');
           return false;
@@ -26849,6 +26930,140 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class NotebookDocumentSyncOptionsNotebookSelector2 implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentSyncOptionsNotebookSelector2.canParse,
+    NotebookDocumentSyncOptionsNotebookSelector2.fromJson,
+  );
+
+  NotebookDocumentSyncOptionsNotebookSelector2({
+    required this.cells,
+    this.notebookDocument,
+  });
+  static NotebookDocumentSyncOptionsNotebookSelector2 fromJson(
+      Map<String, Object?> json) {
+    final cellsJson = json['cells'];
+    final cells = (cellsJson as List<Object?>)
+        .map((item) => NotebookDocumentSyncOptionsCells2.fromJson(
+            item as Map<String, Object?>))
+        .toList();
+    final notebookDocumentJson = json['notebookDocument'];
+    final notebookDocument = notebookDocumentJson == null
+        ? null
+        : ((NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter) ||
+                NotebookDocumentFilter2.canParse(
+                    notebookDocumentJson, nullLspJsonReporter) ||
+                NotebookDocumentFilter3.canParse(
+                    notebookDocumentJson, nullLspJsonReporter))
+            ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t1(
+                NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter)
+                    ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t1(
+                        NotebookDocumentFilter1.fromJson(
+                            notebookDocumentJson as Map<String, Object?>))
+                    : (NotebookDocumentFilter2.canParse(notebookDocumentJson, nullLspJsonReporter)
+                        ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t2(
+                            NotebookDocumentFilter2.fromJson(notebookDocumentJson as Map<String, Object?>))
+                        : (NotebookDocumentFilter3.canParse(notebookDocumentJson, nullLspJsonReporter) ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t3(NotebookDocumentFilter3.fromJson(notebookDocumentJson as Map<String, Object?>)) : (throw '''$notebookDocumentJson was not one of (NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3)'''))))
+            : (notebookDocumentJson is String ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t2(notebookDocumentJson) : (throw '''$notebookDocumentJson was not one of (Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String)''')));
+    return NotebookDocumentSyncOptionsNotebookSelector2(
+      cells: cells,
+      notebookDocument: notebookDocument,
+    );
+  }
+
+  /// The cells of the matching notebook to be synced.
+  final List<NotebookDocumentSyncOptionsCells2> cells;
+
+  /// The notebook to be synced If a string value is provided it matches against
+  /// the notebook type. '*' matches every notebook.
+  final Either2<
+      Either3<NotebookDocumentFilter1, NotebookDocumentFilter2,
+          NotebookDocumentFilter3>,
+      String>? notebookDocument;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['cells'] = cells.map((item) => item.toJson()).toList();
+    if (notebookDocument != null) {
+      __result['notebookDocument'] = notebookDocument;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('cells');
+      try {
+        if (!obj.containsKey('cells')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final cells = obj['cells'];
+        if (cells == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((cells is List<Object?> &&
+            (cells.every((item) => NotebookDocumentSyncOptionsCells2.canParse(
+                item, reporter)))))) {
+          reporter.reportError(
+              'must be of type List<NotebookDocumentSyncOptionsCells2>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('notebookDocument');
+      try {
+        final notebookDocument = obj['notebookDocument'];
+        if (notebookDocument != null &&
+            !(((NotebookDocumentFilter1.canParse(notebookDocument, reporter) ||
+                    NotebookDocumentFilter2.canParse(
+                        notebookDocument, reporter) ||
+                    NotebookDocumentFilter3.canParse(
+                        notebookDocument, reporter)) ||
+                notebookDocument is String))) {
+          reporter.reportError(
+              'must be of type Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type NotebookDocumentSyncOptionsNotebookSelector2');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentSyncOptionsNotebookSelector2 &&
+        other.runtimeType == NotebookDocumentSyncOptionsNotebookSelector2) {
+      return listEqual(
+              cells,
+              other.cells,
+              (NotebookDocumentSyncOptionsCells2 a,
+                      NotebookDocumentSyncOptionsCells2 b) =>
+                  a == b) &&
+          notebookDocument == other.notebookDocument &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        lspHashCode(cells),
+        notebookDocument,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Registration options specific to a notebook.
 ///  @since 3.17.0
 class NotebookDocumentSyncRegistrationOptions
@@ -26872,8 +27087,16 @@
     final id = idJson as String?;
     final notebookSelectorJson = json['notebookSelector'];
     final notebookSelector = (notebookSelectorJson as List<Object?>)
-        .map((item) => NotebookDocumentSyncOptionsNotebookSelector.fromJson(
-            item as Map<String, Object?>))
+        .map((item) => NotebookDocumentSyncOptionsNotebookSelector.canParse(
+                item, nullLspJsonReporter)
+            ? Either2<NotebookDocumentSyncOptionsNotebookSelector, NotebookDocumentSyncOptionsNotebookSelector2>.t1(
+                NotebookDocumentSyncOptionsNotebookSelector.fromJson(
+                    item as Map<String, Object?>))
+            : (NotebookDocumentSyncOptionsNotebookSelector2.canParse(item, nullLspJsonReporter)
+                ? Either2<NotebookDocumentSyncOptionsNotebookSelector,
+                        NotebookDocumentSyncOptionsNotebookSelector2>.t2(
+                    NotebookDocumentSyncOptionsNotebookSelector2.fromJson(item as Map<String, Object?>))
+                : (throw '''$item was not one of (NotebookDocumentSyncOptionsNotebookSelector, NotebookDocumentSyncOptionsNotebookSelector2)''')))
         .toList();
     final saveJson = json['save'];
     final save = saveJson as bool?;
@@ -26889,7 +27112,9 @@
   final String? id;
 
   /// The notebooks to be synced
-  final List<NotebookDocumentSyncOptionsNotebookSelector> notebookSelector;
+  final List<
+      Either2<NotebookDocumentSyncOptionsNotebookSelector,
+          NotebookDocumentSyncOptionsNotebookSelector2>> notebookSelector;
 
   /// Whether save notification should be forwarded to the server. Will only be
   /// honored if mode === `notebook`.
@@ -26900,8 +27125,7 @@
     if (id != null) {
       __result['id'] = id;
     }
-    __result['notebookSelector'] =
-        notebookSelector.map((item) => item.toJson()).toList();
+    __result['notebookSelector'] = notebookSelector;
     if (save != null) {
       __result['save'] = save;
     }
@@ -26933,10 +27157,12 @@
         }
         if (!((notebookSelector is List<Object?> &&
             (notebookSelector.every((item) =>
-                NotebookDocumentSyncOptionsNotebookSelector.canParse(
-                    item, reporter)))))) {
+                (NotebookDocumentSyncOptionsNotebookSelector.canParse(
+                        item, reporter) ||
+                    NotebookDocumentSyncOptionsNotebookSelector2.canParse(
+                        item, reporter))))))) {
           reporter.reportError(
-              'must be of type List<NotebookDocumentSyncOptionsNotebookSelector>');
+              'must be of type List<Either2<NotebookDocumentSyncOptionsNotebookSelector, NotebookDocumentSyncOptionsNotebookSelector2>>');
           return false;
         }
       } finally {
@@ -26968,8 +27194,12 @@
           listEqual(
               notebookSelector,
               other.notebookSelector,
-              (NotebookDocumentSyncOptionsNotebookSelector a,
-                      NotebookDocumentSyncOptionsNotebookSelector b) =>
+              (Either2<NotebookDocumentSyncOptionsNotebookSelector,
+                              NotebookDocumentSyncOptionsNotebookSelector2>
+                          a,
+                      Either2<NotebookDocumentSyncOptionsNotebookSelector,
+                              NotebookDocumentSyncOptionsNotebookSelector2>
+                          b) =>
                   a == b) &&
           save == other.save &&
           true;
diff --git a/pkg/analysis_server/test/analysis/notification_outline_test.dart b/pkg/analysis_server/test/analysis/notification_outline_test.dart
index 262673b..4347bad 100644
--- a/pkg/analysis_server/test/analysis/notification_outline_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_outline_test.dart
@@ -96,6 +96,12 @@
   }
 
   Future<void> test_libraryName_hasPartOfDirective() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+library lib;
+
+part 'test.dart';
+''');
+
     addTestFile('''
 part of my.lib;
 ''');
diff --git a/pkg/analysis_server/test/search/element_references_test.dart b/pkg/analysis_server/test/search/element_references_test.dart
index de8f23e..8e86727 100644
--- a/pkg/analysis_server/test/search/element_references_test.dart
+++ b/pkg/analysis_server/test/search/element_references_test.dart
@@ -742,8 +742,8 @@
 }
 ''');
     await findElementReferences('fff(p) {}', false);
-    expect(results, hasLength(1));
-    assertHasResult(SearchResultKind.INVOCATION, 'fff(10);');
+    // A part without library, no results.
+    expect(results, isEmpty);
   }
 
   Future<void> test_parameter() async {
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index 0d839ec..f6e0668 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -2272,6 +2272,7 @@
     assertSuggestKeywords([]);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49046')
   Future<void> test_part_of() async {
     addTestSource('part of foo;^');
     await computeSuggestions();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
index 74236cce..7c1d58c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
@@ -105,6 +105,7 @@
 ''');
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49046')
   Future<void> test_function_hasZero_partOfName_noLibrary() async {
     await resolveTestCode('''
 part of my_lib;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
index 31ee456..196a197 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
@@ -79,6 +79,7 @@
 ''', target: a);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49046')
   Future<void> test_inPart_partOfName_noLibrary() async {
     await resolveTestCode('''
 part of my_lib;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
index af26bc4..0cc45cd 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
@@ -383,6 +383,7 @@
     });
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49046')
   Future<void> test_inPart_self() async {
     await resolveTestCode('''
 part of lib;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
index 7566168..f7f443f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
@@ -326,6 +326,7 @@
     });
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49046')
   Future<void> test_qualified_instance_inPart_self() async {
     await resolveTestCode('''
 part of lib;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
index fea7674..db18da2 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
@@ -320,6 +320,7 @@
     });
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/49046')
   Future<void> test_qualified_instance_inPart_self() async {
     await resolveTestCode('''
 part of lib;
diff --git a/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
index 6cf66db..d2b2eab 100644
--- a/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
+++ b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
@@ -253,6 +253,10 @@
   final List<Token> _tokens;
   int _current = 0;
   final List<AstNode> _nodes = [];
+
+  /// A set of names already used (or reserved) by nodes.
+  final Set<String> _nodeNames = {};
+
   Parser(this._tokens);
 
   bool get _isAtEnd => _peek().type == TokenType.EOF;
@@ -260,7 +264,7 @@
   List<AstNode> parse() {
     if (_nodes.isEmpty) {
       while (!_isAtEnd) {
-        _nodes.add(_topLevel());
+        _addNode(_topLevel());
         // Consume any trailing semicolons.
         _match([TokenType.SEMI_COLON]);
       }
@@ -268,6 +272,13 @@
     return _nodes;
   }
 
+  /// Adds [node] to the current list and prevents its name from being used
+  /// by generated interfaces.
+  void _addNode(AstNode node) {
+    _nodeNames.add(node.name);
+    _nodes.add(node);
+  }
+
   /// Returns the current token and moves to the next.
   Token _advance() => _tokenAt(_current++);
 
@@ -425,6 +436,28 @@
         allowsNull: canBeNull, allowsUndefined: canBeUndefined);
   }
 
+  /// Gets an available name for a node.
+  ///
+  /// If the computed name is already used, a number will be appended to the
+  /// end.
+  String _getAvailableName(String containerName, String? fieldName) {
+    final name = _joinNames(containerName, fieldName ?? '');
+    final requiresSuffix = fieldName == null;
+    // If the name has already been taken, try appending a number and try
+    // again.
+    String generatedName;
+    var suffixIndex = 1;
+    do {
+      if (suffixIndex > 20) {
+        throw 'Failed to generate an available name for $name';
+      }
+      generatedName =
+          requiresSuffix || suffixIndex > 1 ? '$name$suffixIndex' : name;
+      suffixIndex++;
+    } while (_nodeNames.contains(generatedName));
+    return generatedName;
+  }
+
   Indexer _indexer(String containerName, Comment? leadingComment) {
     final indexer = _field(containerName, leadingComment);
     _consume(TokenType.RIGHT_BRACKET, 'Expected ]');
@@ -592,9 +625,7 @@
     if (includeUndefined) {
       types.add(Type.Undefined);
     }
-    var typeIndex = 0;
     while (true) {
-      typeIndex++;
       TypeBase type;
       if (_match([TokenType.LEFT_BRACE])) {
         // Inline interfaces.
@@ -613,13 +644,8 @@
           type = MapType(indexer.indexType, indexer.valueType);
         } else {
           // Add a synthetic interface to the parsers list of nodes to represent this type.
-          // If we have no fieldName to base the synthetic name from, we should use
-          // the index of this type, for example in:
-          //    type Foo = { [..] } | { [...] }
-          // we will generate Foo1 and Foo2 for the types.
-          final nameSuffix = fieldName ?? '$typeIndex';
-          final generatedName = _joinNames(containerName, nameSuffix);
-          _nodes.add(InlineInterface(generatedName, members));
+          final generatedName = _getAvailableName(containerName, fieldName);
+          _addNode(InlineInterface(generatedName, members));
           // Record the type as a simple type that references this interface.
           type = Type.identifier(generatedName);
         }
@@ -705,6 +731,10 @@
   TypeAlias _typeAlias(Comment? leadingComment) {
     final name = _consume(TokenType.IDENTIFIER, 'Expected identifier');
     _consume(TokenType.EQUAL, 'Expected =');
+    // Reserve the name for this alias before we start reading its type so that
+    // inline/literal types will not try to compute the same name if they do
+    // not have field names.
+    _nodeNames.add(name.lexeme);
     final type = _type(name.lexeme, null);
     if (!_isAtEnd) {
       _consume(TokenType.SEMI_COLON, 'Expected ;');
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index 97198d9..200ebaf 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -195,6 +195,22 @@
   CompilationUnit get unit;
 }
 
+/// The type of [InvalidResult] returned when the file is a part, and its
+/// containing library is not known.
+///
+/// Clients may not extend, implement or mix-in this class.
+///
+/// TODO(scheglov) Add an error that points at the `part of` location.
+abstract class PartWithoutLibraryResult
+    implements
+        InvalidResult,
+        SomeErrorsResult,
+        SomeResolvedUnitResult,
+        SomeUnitElementResult {
+  /// The absolute and normalized path of the file.
+  String get path;
+}
+
 /// The result of building resolved AST(s) for the whole library.
 ///
 /// Clients may not extend, implement or mix-in this class.
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index c3aaba2..1160d53 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -84,7 +84,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 219;
+  static const int DATA_VERSION = 220;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
@@ -159,7 +159,7 @@
 
   /// The mapping from the files for which analysis was requested using
   /// [getResult] to the [Completer]s to report the result.
-  final _requestedFiles = <String, List<Completer<ResolvedUnitResult>>>{};
+  final _requestedFiles = <String, List<Completer<SomeResolvedUnitResult>>>{};
 
   /// The mapping from the files for which analysis was requested using
   /// [getResolvedLibrary] to the [Completer]s to report the result.
@@ -182,35 +182,17 @@
 
   /// The mapping from the files for which errors were requested using
   /// [getErrors] to the [Completer]s to report the result.
-  final _errorsRequestedFiles = <String, List<Completer<ErrorsResult>>>{};
-
-  /// The requests from [_errorsRequestedFiles] for files which were found to
-  /// be parts without known libraries, so delayed.
-  final _errorsRequestedParts = <String, List<Completer<ErrorsResult>>>{};
+  final _errorsRequestedFiles = <String, List<Completer<SomeErrorsResult>>>{};
 
   /// The mapping from the files for which the index was requested using
   /// [getIndex] to the [Completer]s to report the result.
   final _indexRequestedFiles =
-      <String, List<Completer<AnalysisDriverUnitIndex>>>{};
+      <String, List<Completer<AnalysisDriverUnitIndex?>>>{};
 
   /// The mapping from the files for which the unit element was requested using
   /// [getUnitElement] to the [Completer]s to report the result.
   final _unitElementRequestedFiles =
-      <String, List<Completer<UnitElementResult>>>{};
-
-  /// The mapping from the files for which the unit element was requested using
-  /// [getUnitElement], and which were found to be parts without known
-  /// libraries, to the [Completer]s to report the result.
-  final _unitElementRequestedParts =
-      <String, List<Completer<UnitElementResult>>>{};
-
-  /// The mapping from the files for which analysis was requested using
-  /// [getResult], and which were found to be parts without known libraries,
-  /// to the [Completer]s to report the result.
-  final _requestedParts = <String, List<Completer<ResolvedUnitResult>>>{};
-
-  /// The set of part files that are currently scheduled for analysis.
-  final _partsToAnalyze = <String>{};
+      <String, List<Completer<SomeUnitElementResult>>>{};
 
   /// The controller for the [results] stream.
   final _resultController = StreamController<Object>();
@@ -249,6 +231,11 @@
   /// Whether `dart:core` has been transitively discovered.
   bool _hasDartCoreDiscovered = false;
 
+  /// This flag is reset to `false` when a new file is added, because it
+  /// might be a library, so that some files that were disconnected parts
+  /// could be analyzed now.
+  bool _hasLibrariesDiscovered = false;
+
   /// If testing data is being retained, a pointer to the object that is
   /// retaining the testing data.  Otherwise `null`.
   final TestingData? testingData;
@@ -311,9 +298,7 @@
     return hasPendingFileChanges ||
         _fileTracker.hasChangedFiles ||
         _requestedFiles.isNotEmpty ||
-        _requestedParts.isNotEmpty ||
-        _fileTracker.hasPendingFiles ||
-        _partsToAnalyze.isNotEmpty;
+        _fileTracker.hasPendingFiles;
   }
 
   bool get hasPendingFileChanges => _pendingFileChanges.isNotEmpty;
@@ -455,11 +440,7 @@
     if (_fileTracker.hasPendingFiles) {
       return AnalysisDriverPriority.general;
     }
-    if (_errorsRequestedParts.isNotEmpty ||
-        _requestedParts.isNotEmpty ||
-        _partsToAnalyze.isNotEmpty ||
-        _unitElementRequestedParts.isNotEmpty ||
-        _pendingFileChangesCompleters.isNotEmpty) {
+    if (_pendingFileChangesCompleters.isNotEmpty) {
       return AnalysisDriverPriority.general;
     }
     return AnalysisDriverPriority.nothing;
@@ -627,9 +608,9 @@
       );
     }
 
-    var completer = Completer<ErrorsResult>();
+    var completer = Completer<SomeErrorsResult>();
     _errorsRequestedFiles
-        .putIfAbsent(path, () => <Completer<ErrorsResult>>[])
+        .putIfAbsent(path, () => <Completer<SomeErrorsResult>>[])
         .add(completer);
     _scheduler.notify(this);
     return completer.future;
@@ -699,9 +680,9 @@
     if (!_fsState.hasUri(path)) {
       return Future.value();
     }
-    var completer = Completer<AnalysisDriverUnitIndex>();
+    var completer = Completer<AnalysisDriverUnitIndex?>();
     _indexRequestedFiles
-        .putIfAbsent(path, () => <Completer<AnalysisDriverUnitIndex>>[])
+        .putIfAbsent(path, () => <Completer<AnalysisDriverUnitIndex?>>[])
         .add(completer);
     _scheduler.notify(this);
     return completer.future;
@@ -918,9 +899,9 @@
     }
 
     // Schedule analysis.
-    var completer = Completer<ResolvedUnitResult>();
+    var completer = Completer<SomeResolvedUnitResult>();
     _requestedFiles
-        .putIfAbsent(path, () => <Completer<ResolvedUnitResult>>[])
+        .putIfAbsent(path, () => <Completer<SomeResolvedUnitResult>>[])
         .add(completer);
     _scheduler.notify(this);
     return completer.future;
@@ -964,9 +945,9 @@
       );
     }
 
-    var completer = Completer<UnitElementResult>();
+    var completer = Completer<SomeUnitElementResult>();
     _unitElementRequestedFiles
-        .putIfAbsent(path, () => <Completer<UnitElementResult>>[])
+        .putIfAbsent(path, () => <Completer<SomeUnitElementResult>>[])
         .add(completer);
     _scheduler.notify(this);
     return completer.future;
@@ -1041,10 +1022,8 @@
 
   @override
   Future<void> performWork() async {
-    if (!_hasDartCoreDiscovered) {
-      _hasDartCoreDiscovered = true;
-      _discoverDartCore();
-    }
+    _discoverDartCore();
+    _discoverLibraries();
 
     if (_resolveForCompletionRequests.isNotEmpty) {
       final request = _resolveForCompletionRequests.removeLast();
@@ -1061,27 +1040,26 @@
 
     // Analyze a requested file.
     if (_requestedFiles.isNotEmpty) {
-      String path = _requestedFiles.keys.first;
+      final path = _requestedFiles.keys.first;
+      final completers = _requestedFiles.remove(path)!;
+      _fileTracker.fileWasAnalyzed(path);
       try {
-        var result = await _computeAnalysisResult(path, withUnit: true);
-        // If a part without a library, delay its analysis.
-        if (result == null) {
-          _requestedParts
-              .putIfAbsent(path, () => [])
-              .addAll(_requestedFiles.remove(path)!);
-          return;
+        final result = await _computeAnalysisResult(path, withUnit: true);
+        final SomeResolvedUnitResult unitResult;
+        if (result != null) {
+          unitResult = result.unitResult!;
+        } else {
+          unitResult = PartWithoutLibraryResultImpl(
+            path: path,
+          );
         }
-        // Notify the completers.
-        for (var completer in _requestedFiles.remove(path)!) {
-          completer.complete(result.unitResult!);
+        for (final completer in completers) {
+          completer.complete(unitResult);
         }
-        // Remove from to be analyzed and produce it now.
-        _fileTracker.fileWasAnalyzed(path);
-        _resultController.add(result.unitResult!);
+        _resultController.add(unitResult);
       } catch (exception, stackTrace) {
         _reportException(path, exception, stackTrace);
-        _fileTracker.fileWasAnalyzed(path);
-        for (var completer in _requestedFiles.remove(path)!) {
+        for (final completer in completers) {
           completer.completeError(exception, stackTrace);
         }
         _clearLibraryContextAfterException();
@@ -1112,14 +1090,10 @@
       var completers = _errorsRequestedFiles.remove(path)!;
       var result = await _computeErrors(
         path: path,
-        asIsIfPartWithoutLibrary: false,
       );
-      if (result != null) {
-        for (var completer in completers) {
-          completer.complete(result);
-        }
-      } else {
-        _errorsRequestedParts.putIfAbsent(path, () => []).addAll(completers);
+      result ??= PartWithoutLibraryResultImpl(path: path);
+      for (var completer in completers) {
+        completer.complete(result);
       }
       return;
     }
@@ -1127,7 +1101,7 @@
     // Process an index request.
     if (_indexRequestedFiles.isNotEmpty) {
       String path = _indexRequestedFiles.keys.first;
-      AnalysisDriverUnitIndex index = await _computeIndex(path);
+      final index = await _computeIndex(path);
       for (var completer in _indexRequestedFiles.remove(path)!) {
         completer.complete(index);
       }
@@ -1137,16 +1111,11 @@
     // Process a unit element request.
     if (_unitElementRequestedFiles.isNotEmpty) {
       String path = _unitElementRequestedFiles.keys.first;
-      UnitElementResult? result = await _computeUnitElement(path);
       var completers = _unitElementRequestedFiles.remove(path)!;
-      if (result != null) {
-        for (var completer in completers) {
-          completer.complete(result);
-        }
-      } else {
-        _unitElementRequestedParts
-            .putIfAbsent(path, () => [])
-            .addAll(completers);
+      SomeUnitElementResult? result = await _computeUnitElement(path);
+      result ??= PartWithoutLibraryResultImpl(path: path);
+      for (var completer in completers) {
+        completer.complete(result);
       }
       return;
     }
@@ -1186,7 +1155,14 @@
           try {
             var result = await _computeAnalysisResult(path, withUnit: true);
             if (result == null) {
-              _partsToAnalyze.add(path);
+              // We report an invalid result (instead of silently ignoring
+              // this disconnected part) so that the listener of the stream
+              // knows, and for example removes all errors.
+              _resultController.add(
+                PartWithoutLibraryResultImpl(
+                  path: path,
+                ),
+              );
             } else {
               _resultController.add(result.unitResult!);
             }
@@ -1208,7 +1184,11 @@
         var result = await _computeAnalysisResult(path,
             withUnit: false, skipIfSameSignature: true);
         if (result == null) {
-          _partsToAnalyze.add(path);
+          _resultController.add(
+            PartWithoutLibraryResultImpl(
+              path: path,
+            ),
+          );
         } else if (result.isUnchangedErrors) {
           // We found that the set of errors is the same as we produced the
           // last time, so we don't need to produce it again now.
@@ -1224,79 +1204,6 @@
       }
       return;
     }
-
-    // Analyze a requested part file.
-    if (_requestedParts.isNotEmpty) {
-      String path = _requestedParts.keys.first;
-      try {
-        var result = await _computeAnalysisResult(path,
-            withUnit: true, asIsIfPartWithoutLibrary: true);
-        result!;
-        // Notify the completers.
-        for (var completer in _requestedParts.remove(path)!) {
-          completer.complete(result.unitResult!);
-        }
-        // Remove from to be analyzed and produce it now.
-        _partsToAnalyze.remove(path);
-        _resultController.add(result.unitResult!);
-      } catch (exception, stackTrace) {
-        _reportException(path, exception, stackTrace);
-        _partsToAnalyze.remove(path);
-        for (var completer in _requestedParts.remove(path)!) {
-          completer.completeError(exception, stackTrace);
-        }
-        _clearLibraryContextAfterException();
-      }
-      return;
-    }
-
-    // Analyze a general part.
-    if (_partsToAnalyze.isNotEmpty) {
-      String path = _partsToAnalyze.first;
-      _partsToAnalyze.remove(path);
-      try {
-        var withUnit = _priorityFiles.contains(path);
-        if (withUnit) {
-          var result = await _computeAnalysisResult(path,
-              withUnit: true, asIsIfPartWithoutLibrary: true);
-          _resultController.add(result!.unitResult!);
-        } else {
-          var result = await _computeAnalysisResult(path,
-              withUnit: false, asIsIfPartWithoutLibrary: true);
-          _resultController.add(result!.errorsResult!);
-        }
-      } catch (exception, stackTrace) {
-        _reportException(path, exception, stackTrace);
-        _clearLibraryContextAfterException();
-      }
-      return;
-    }
-
-    // Process a unit element request for a part.
-    if (_unitElementRequestedParts.isNotEmpty) {
-      String path = _unitElementRequestedParts.keys.first;
-      var result =
-          await _computeUnitElement(path, asIsIfPartWithoutLibrary: true);
-      result!;
-      for (var completer in _unitElementRequestedParts.remove(path)!) {
-        completer.complete(result);
-      }
-      return;
-    }
-
-    // Compute errors in a part.
-    if (_errorsRequestedParts.isNotEmpty) {
-      var path = _errorsRequestedParts.keys.first;
-      var completers = _errorsRequestedParts.remove(path)!;
-      var result = await _computeErrors(
-        path: path,
-        asIsIfPartWithoutLibrary: true,
-      );
-      for (var completer in completers) {
-        completer.complete(result);
-      }
-      return;
-    }
   }
 
   /// Remove the file with the given [path] from the list of files to analyze.
@@ -1496,24 +1403,16 @@
     });
   }
 
-  Future<ErrorsResult?> _computeErrors({
+  Future<SomeErrorsResult?> _computeErrors({
     required String path,
-    required bool asIsIfPartWithoutLibrary,
   }) async {
-    var analysisResult = await _computeAnalysisResult(path,
-        withUnit: false, asIsIfPartWithoutLibrary: asIsIfPartWithoutLibrary);
-
-    if (analysisResult == null) {
-      return null;
-    }
-
-    return analysisResult.errorsResult;
+    var analysisResult = await _computeAnalysisResult(path, withUnit: false);
+    return analysisResult?.errorsResult;
   }
 
-  Future<AnalysisDriverUnitIndex> _computeIndex(String path) async {
-    var analysisResult = await _computeAnalysisResult(path,
-        withUnit: false, asIsIfPartWithoutLibrary: true);
-    return analysisResult!._index!;
+  Future<AnalysisDriverUnitIndex?> _computeIndex(String path) async {
+    var analysisResult = await _computeAnalysisResult(path, withUnit: false);
+    return analysisResult?._index;
   }
 
   /// Return the newly computed resolution result of the library with the
@@ -1646,6 +1545,11 @@
   /// The current workaround for this is to discover `dart:core` before any
   /// analysis.
   void _discoverDartCore() {
+    if (_hasDartCoreDiscovered) {
+      return;
+    }
+    _hasDartCoreDiscovered = true;
+
     _fsState.getFileForUri(Uri.parse('dart:core')).map(
       (file) {
         file?.transitiveFiles;
@@ -1654,6 +1558,17 @@
     );
   }
 
+  void _discoverLibraries() {
+    if (_hasLibrariesDiscovered) {
+      return;
+    }
+    _hasLibrariesDiscovered = true;
+
+    for (final path in _fileTracker.addedFiles) {
+      _fsState.getFileForPath(path);
+    }
+  }
+
   void _fillSalt() {
     _fillSaltForUnlinked();
     _fillSaltForElements();
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 4fc7f27..1bd5c9c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -235,7 +235,11 @@
   /// Return `true` if the file does not have a `library` directive, and has a
   /// `part of` directive, so is probably a part.
   bool get isPart {
-    return !_unlinked2!.hasLibraryDirective && _unlinked2!.hasPartOfDirective;
+    if (_unlinked2!.libraryDirective != null) {
+      return false;
+    }
+    return _unlinked2!.partOfNameDirective != null ||
+        _unlinked2!.partOfUriDirective != null;
   }
 
   /// If the file [isPart], return a currently know library the file is a part
@@ -578,13 +582,15 @@
   }
 
   static UnlinkedUnit serializeAstUnlinked2(CompilationUnit unit) {
+    UnlinkedLibraryDirective? libraryDirective;
+    UnlinkedLibraryAugmentationDirective? libraryAugmentationDirective;
+    UnlinkedPartOfNameDirective? partOfNameDirective;
+    UnlinkedPartOfUriDirective? partOfUriDirective;
     var exports = <UnlinkedNamespaceDirective>[];
     var imports = <UnlinkedNamespaceDirective>[];
     var parts = <String>[];
     var macroClasses = <MacroClass>[];
     var hasDartCoreImport = false;
-    var hasLibraryDirective = false;
-    var hasPartOfDirective = false;
     for (var directive in unit.directives) {
       if (directive is ExportDirective) {
         var builder = _serializeNamespaceDirective(directive);
@@ -595,13 +601,48 @@
         if (builder.uri == 'dart:core') {
           hasDartCoreImport = true;
         }
+      } else if (directive is LibraryAugmentationDirective) {
+        final uri = directive.uri;
+        final uriStr = uri.stringValue;
+        if (uriStr != null) {
+          libraryAugmentationDirective = UnlinkedLibraryAugmentationDirective(
+            uri: uriStr,
+            uriRange: UnlinkedSourceRange(
+              offset: uri.offset,
+              length: uri.length,
+            ),
+          );
+        }
       } else if (directive is LibraryDirective) {
-        hasLibraryDirective = true;
+        libraryDirective = UnlinkedLibraryDirective(
+          name: directive.name.name,
+        );
       } else if (directive is PartDirective) {
         var uriStr = directive.uri.stringValue;
         parts.add(uriStr ?? '');
       } else if (directive is PartOfDirective) {
-        hasPartOfDirective = true;
+        final libraryName = directive.libraryName;
+        final uri = directive.uri;
+        if (libraryName != null) {
+          partOfNameDirective = UnlinkedPartOfNameDirective(
+            name: libraryName.name,
+            nameRange: UnlinkedSourceRange(
+              offset: libraryName.offset,
+              length: libraryName.length,
+            ),
+          );
+        } else if (uri != null) {
+          final uriStr = uri.stringValue;
+          if (uriStr != null) {
+            partOfUriDirective = UnlinkedPartOfUriDirective(
+              uri: uriStr,
+              uriRange: UnlinkedSourceRange(
+                offset: uri.offset,
+                length: uri.length,
+              ),
+            );
+          }
+        }
       }
     }
     for (var declaration in unit.declarations) {
@@ -634,15 +675,15 @@
     return UnlinkedUnit(
       apiSignature: Uint8List.fromList(computeUnlinkedApiSignature(unit)),
       exports: exports,
-      hasLibraryDirective: hasLibraryDirective,
-      hasPartOfDirective: hasPartOfDirective,
       imports: imports,
       informativeBytes: writeUnitInformative(unit),
+      libraryAugmentationDirective: libraryAugmentationDirective,
+      libraryDirective: libraryDirective,
       lineStarts: Uint32List.fromList(unit.lineInfo.lineStarts),
       macroClasses: macroClasses,
-      partOfName: null,
-      partOfUri: null,
       parts: parts,
+      partOfNameDirective: partOfNameDirective,
+      partOfUriDirective: partOfUriDirective,
     );
   }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index 0c957ae..cef3e18 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -139,6 +139,15 @@
   LineInfo get lineInfo => unit.lineInfo;
 }
 
+class PartWithoutLibraryResultImpl implements PartWithoutLibraryResult {
+  @override
+  final String path;
+
+  PartWithoutLibraryResultImpl({
+    required this.path,
+  });
+}
+
 class ResolvedForCompletionResultImpl {
   final AnalysisSession analysisSession;
   final String path;
diff --git a/pkg/analyzer/lib/src/dart/analysis/unlinked_data.dart b/pkg/analyzer/lib/src/dart/analysis/unlinked_data.dart
index 88cfdb8..e4b4773 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_data.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_data.dart
@@ -90,6 +90,50 @@
   }
 }
 
+class UnlinkedLibraryAugmentationDirective {
+  final String uri;
+  final UnlinkedSourceRange uriRange;
+
+  UnlinkedLibraryAugmentationDirective({
+    required this.uri,
+    required this.uriRange,
+  });
+
+  factory UnlinkedLibraryAugmentationDirective.read(
+    SummaryDataReader reader,
+  ) {
+    return UnlinkedLibraryAugmentationDirective(
+      uri: reader.readStringUtf8(),
+      uriRange: UnlinkedSourceRange.read(reader),
+    );
+  }
+
+  void write(BufferedSink sink) {
+    sink.writeStringUtf8(uri);
+    uriRange.write(sink);
+  }
+}
+
+class UnlinkedLibraryDirective {
+  final String name;
+
+  UnlinkedLibraryDirective({
+    required this.name,
+  });
+
+  factory UnlinkedLibraryDirective.read(
+    SummaryDataReader reader,
+  ) {
+    return UnlinkedLibraryDirective(
+      name: reader.readStringUtf8(),
+    );
+  }
+
+  void write(BufferedSink sink) {
+    sink.writeStringUtf8(name);
+  }
+}
+
 /// Unlinked information about a namespace directive.
 class UnlinkedNamespaceDirective {
   /// The configurations that control which library will actually be used.
@@ -159,6 +203,81 @@
   }
 }
 
+class UnlinkedPartOfNameDirective {
+  final String name;
+  final UnlinkedSourceRange nameRange;
+
+  UnlinkedPartOfNameDirective({
+    required this.name,
+    required this.nameRange,
+  });
+
+  factory UnlinkedPartOfNameDirective.read(
+    SummaryDataReader reader,
+  ) {
+    return UnlinkedPartOfNameDirective(
+      name: reader.readStringUtf8(),
+      nameRange: UnlinkedSourceRange.read(reader),
+    );
+  }
+
+  void write(BufferedSink sink) {
+    sink.writeStringUtf8(name);
+    nameRange.write(sink);
+  }
+}
+
+class UnlinkedPartOfUriDirective {
+  final String uri;
+  final UnlinkedSourceRange uriRange;
+
+  UnlinkedPartOfUriDirective({
+    required this.uri,
+    required this.uriRange,
+  });
+
+  factory UnlinkedPartOfUriDirective.read(
+    SummaryDataReader reader,
+  ) {
+    return UnlinkedPartOfUriDirective(
+      uri: reader.readStringUtf8(),
+      uriRange: UnlinkedSourceRange.read(reader),
+    );
+  }
+
+  void write(BufferedSink sink) {
+    sink.writeStringUtf8(uri);
+    uriRange.write(sink);
+  }
+}
+
+class UnlinkedSourceRange {
+  final int offset;
+  final int length;
+
+  UnlinkedSourceRange({
+    required this.offset,
+    required this.length,
+  }) {
+    RangeError.checkNotNegative(offset);
+    RangeError.checkNotNegative(length);
+  }
+
+  factory UnlinkedSourceRange.read(
+    SummaryDataReader reader,
+  ) {
+    return UnlinkedSourceRange(
+      offset: reader.readUInt30(),
+      length: reader.readUInt30(),
+    );
+  }
+
+  void write(BufferedSink sink) {
+    sink.writeUInt30(offset);
+    sink.writeUInt30(length);
+  }
+}
+
 /// Unlinked information about a compilation unit.
 class UnlinkedUnit {
   /// The MD5 hash signature of the API portion of this unit. It depends on all
@@ -169,45 +288,45 @@
   /// URIs of `export` directives.
   final List<UnlinkedNamespaceDirective> exports;
 
-  /// Is `true` if the unit contains a `library` directive.
-  final bool hasLibraryDirective;
-
-  /// Is `true` if the unit contains a `part of` directive.
-  final bool hasPartOfDirective;
-
   /// URIs of `import` directives.
   final List<UnlinkedNamespaceDirective> imports;
 
   /// Encoded informative data.
   final Uint8List informativeBytes;
 
+  /// The `library augment 'uri';` directive.
+  final UnlinkedLibraryAugmentationDirective? libraryAugmentationDirective;
+
+  /// The `library name;` directive.
+  final UnlinkedLibraryDirective? libraryDirective;
+
   /// Offsets of the first character of each line in the source code.
   final Uint32List lineStarts;
 
   /// The list of `macro` classes.
   final List<MacroClass> macroClasses;
 
-  /// The library name of the `part of my.name;` directive.
-  final String? partOfName;
-
-  /// URI of the `part of 'uri';` directive.
-  final String? partOfUri;
-
   /// URIs of `part` directives.
   final List<String> parts;
 
+  /// The `part of my.name';` directive.
+  final UnlinkedPartOfNameDirective? partOfNameDirective;
+
+  /// The `part of 'uri';` directive.
+  final UnlinkedPartOfUriDirective? partOfUriDirective;
+
   UnlinkedUnit({
     required this.apiSignature,
     required this.exports,
-    required this.hasLibraryDirective,
-    required this.hasPartOfDirective,
     required this.imports,
     required this.informativeBytes,
+    required this.libraryAugmentationDirective,
+    required this.libraryDirective,
     required this.lineStarts,
     required this.macroClasses,
-    required this.partOfName,
-    required this.partOfUri,
     required this.parts,
+    required this.partOfNameDirective,
+    required this.partOfUriDirective,
   });
 
   factory UnlinkedUnit.read(SummaryDataReader reader) {
@@ -216,19 +335,27 @@
       exports: reader.readTypedList(
         () => UnlinkedNamespaceDirective.read(reader),
       ),
-      hasLibraryDirective: reader.readBool(),
-      hasPartOfDirective: reader.readBool(),
       imports: reader.readTypedList(
         () => UnlinkedNamespaceDirective.read(reader),
       ),
       informativeBytes: reader.readUint8List(),
+      libraryAugmentationDirective: reader.readOptionalObject(
+        UnlinkedLibraryAugmentationDirective.read,
+      ),
+      libraryDirective: reader.readOptionalObject(
+        UnlinkedLibraryDirective.read,
+      ),
       lineStarts: reader.readUInt30List(),
       macroClasses: reader.readTypedList(
         () => MacroClass.read(reader),
       ),
-      partOfName: reader.readOptionalStringUtf8(),
-      partOfUri: reader.readOptionalStringUtf8(),
       parts: reader.readStringUtf8List(),
+      partOfNameDirective: reader.readOptionalObject(
+        UnlinkedPartOfNameDirective.read,
+      ),
+      partOfUriDirective: reader.readOptionalObject(
+        UnlinkedPartOfUriDirective.read,
+      ),
     );
   }
 
@@ -237,18 +364,30 @@
     sink.writeList<UnlinkedNamespaceDirective>(exports, (x) {
       x.write(sink);
     });
-    sink.writeBool(hasLibraryDirective);
-    sink.writeBool(hasPartOfDirective);
     sink.writeList<UnlinkedNamespaceDirective>(imports, (x) {
       x.write(sink);
     });
     sink.writeUint8List(informativeBytes);
+    sink.writeOptionalObject<UnlinkedLibraryAugmentationDirective>(
+      libraryAugmentationDirective,
+      (x) => x.write(sink),
+    );
+    sink.writeOptionalObject<UnlinkedLibraryDirective>(
+      libraryDirective,
+      (x) => x.write(sink),
+    );
     sink.writeUint30List(lineStarts);
     sink.writeList<MacroClass>(macroClasses, (x) {
       x.write(sink);
     });
-    sink.writeOptionalStringUtf8(partOfName);
-    sink.writeOptionalStringUtf8(partOfUri);
     sink.writeStringUtf8Iterable(parts);
+    sink.writeOptionalObject<UnlinkedPartOfNameDirective>(
+      partOfNameDirective,
+      (x) => x.write(sink),
+    );
+    sink.writeOptionalObject<UnlinkedPartOfUriDirective>(
+      partOfUriDirective,
+      (x) => x.write(sink),
+    );
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/micro/library_graph.dart b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
index b36a098..0f722d7 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
@@ -99,6 +99,16 @@
 
   bool get exists => _unlinked.exists;
 
+  /// Return `true` if the file does not have a `library` directive, and has a
+  /// `part of` directive, so is probably a part.
+  bool get isPart {
+    if (unlinkedUnit.libraryDirective != null) {
+      return false;
+    }
+    return unlinkedUnit.partOfNameDirective != null ||
+        unlinkedUnit.partOfUriDirective != null;
+  }
+
   /// Return the [LibraryCycle] this file belongs to, even if it consists of
   /// just this file.  If the library cycle is not known yet, compute it.
   LibraryCycle get libraryCycle {
@@ -799,7 +809,7 @@
 
     var performance = OperationPerformanceImpl('<root>');
 
-    var libraryName = unlinked.unit.partOfName;
+    var libraryName = unlinked.unit.partOfNameDirective?.name;
     if (libraryName != null) {
       location._fsState.testView.partsDiscoveredLibraries.add(location.path);
       return _partOfLibrary = location._findPartOfNameLibrary(
@@ -807,15 +817,16 @@
       );
     }
 
-    var libraryUri = unlinked.unit.partOfUri;
-    if (libraryUri == null) {
-      return null;
+    var libraryUri = unlinked.unit.partOfUriDirective?.uri;
+    if (libraryUri != null) {
+      location._fsState.testView.partsDiscoveredLibraries.add(location.path);
+      return _partOfLibrary = location._fileForRelativeUri(
+        relativeUri: libraryUri,
+        performance: performance,
+      );
     }
-    location._fsState.testView.partsDiscoveredLibraries.add(location.path);
-    return _partOfLibrary = location._fileForRelativeUri(
-      relativeUri: libraryUri,
-      performance: performance,
-    );
+
+    return null;
   }
 
   void _prefetchDirectReferences() {
@@ -889,14 +900,14 @@
   }
 
   static CiderUnlinkedUnit serializeAstCiderUnlinked(CompilationUnit unit) {
+    UnlinkedLibraryDirective? libraryDirective;
+    UnlinkedLibraryAugmentationDirective? libraryAugmentationDirective;
+    UnlinkedPartOfNameDirective? partOfNameDirective;
+    UnlinkedPartOfUriDirective? partOfUriDirective;
     var exports = <UnlinkedNamespaceDirective>[];
     var imports = <UnlinkedNamespaceDirective>[];
     var parts = <String>[];
     var hasDartCoreImport = false;
-    var hasLibraryDirective = false;
-    var hasPartOfDirective = false;
-    String? partOfName;
-    String? partOfUriStr;
     for (var directive in unit.directives) {
       if (directive is ExportDirective) {
         var builder = _serializeNamespaceDirective(directive);
@@ -907,19 +918,47 @@
         if (builder.uri == 'dart:core') {
           hasDartCoreImport = true;
         }
+      } else if (directive is LibraryAugmentationDirective) {
+        final uri = directive.uri;
+        final uriStr = uri.stringValue;
+        if (uriStr != null) {
+          libraryAugmentationDirective = UnlinkedLibraryAugmentationDirective(
+            uri: uriStr,
+            uriRange: UnlinkedSourceRange(
+              offset: uri.offset,
+              length: uri.length,
+            ),
+          );
+        }
       } else if (directive is LibraryDirective) {
-        hasLibraryDirective = true;
+        libraryDirective = UnlinkedLibraryDirective(
+          name: directive.name.components.map((e) => e.name).join('.'),
+        );
       } else if (directive is PartDirective) {
         var uriStr = directive.uri.stringValue;
         parts.add(uriStr ?? '');
       } else if (directive is PartOfDirective) {
-        hasPartOfDirective = true;
-        var libraryName = directive.libraryName;
-        var uriStr = directive.uri?.stringValue;
+        final libraryName = directive.libraryName;
+        final uri = directive.uri;
         if (libraryName != null) {
-          partOfName = libraryName.components.map((e) => e.name).join('.');
-        } else if (uriStr != null) {
-          partOfUriStr = uriStr;
+          partOfNameDirective = UnlinkedPartOfNameDirective(
+            name: libraryName.name,
+            nameRange: UnlinkedSourceRange(
+              offset: libraryName.offset,
+              length: libraryName.length,
+            ),
+          );
+        } else if (uri != null) {
+          final uriStr = uri.stringValue;
+          if (uriStr != null) {
+            partOfUriDirective = UnlinkedPartOfUriDirective(
+              uri: uriStr,
+              uriRange: UnlinkedSourceRange(
+                offset: uri.offset,
+                length: uri.length,
+              ),
+            );
+          }
         }
       }
     }
@@ -957,15 +996,15 @@
     var unlinkedUnit = UnlinkedUnit(
       apiSignature: computeUnlinkedApiSignature(unit),
       exports: exports,
-      hasLibraryDirective: hasLibraryDirective,
-      hasPartOfDirective: hasPartOfDirective,
       imports: imports,
       informativeBytes: writeUnitInformative(unit),
+      libraryAugmentationDirective: libraryAugmentationDirective,
+      libraryDirective: libraryDirective,
       lineStarts: Uint32List.fromList(unit.lineInfo.lineStarts),
       macroClasses: [],
-      partOfName: partOfName,
-      partOfUri: partOfUriStr,
       parts: parts,
+      partOfNameDirective: partOfNameDirective,
+      partOfUriDirective: partOfUriDirective,
     );
 
     return CiderUnlinkedUnit(
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index efb1059..592bb38 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -579,7 +579,7 @@
           file.exists,
           file.getContent(),
           file.lineInfo,
-          file.unlinkedUnit.hasPartOfDirective,
+          file.isPart,
           fileResult.unit,
           fileResult.errors,
         );
diff --git a/pkg/analyzer/lib/src/summary2/data_reader.dart b/pkg/analyzer/lib/src/summary2/data_reader.dart
index 9c1988d..c5798ee 100644
--- a/pkg/analyzer/lib/src/summary2/data_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/data_reader.dart
@@ -54,6 +54,14 @@
     return _doubleBuffer[0];
   }
 
+  T? readOptionalObject<T>(T Function(SummaryDataReader reader) read) {
+    if (readBool()) {
+      return read(this);
+    } else {
+      return null;
+    }
+  }
+
   String? readOptionalStringReference() {
     if (readBool()) {
       return readStringReference();
diff --git a/pkg/analyzer/lib/src/summary2/data_writer.dart b/pkg/analyzer/lib/src/summary2/data_writer.dart
index 3f560a8..ede7d8b 100644
--- a/pkg/analyzer/lib/src/summary2/data_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/data_writer.dart
@@ -137,6 +137,15 @@
     }
   }
 
+  void writeOptionalObject<T>(T? object, void Function(T x) write) {
+    if (object != null) {
+      writeBool(true);
+      write(object);
+    } else {
+      writeBool(false);
+    }
+  }
+
   void writeOptionalStringUtf8(String? value) {
     if (value != null) {
       writeBool(true);
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index 4d58c07..5f260ff 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -6019,6 +6019,7 @@
       implicitly uses the same version as the defining compilation unit:
 
       ```dart
+      %uri="lib/part.dart"
       part of 'test.dart';
       ```
 
@@ -10939,6 +10940,7 @@
       by URI:
 
       ```dart
+      %uri="lib/part_file.dart"
       part of 'test.dart';
       ```
   POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT:
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 870d899..82158be 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -270,15 +270,20 @@
   }
 
   test_annotation_onDirective_partOf() async {
-    newFile('$testPackageLibPath/a.dart', r'''
+    final a = newFile('$testPackageLibPath/a.dart', r'''
 part 'test.dart';
 ''');
+
     addTestFile(r'''
 @a
 part of 'a.dart';
 
 const a = 1;
 ''');
+
+    // Make sure that the part knows its library.
+    contextFor(a.path).currentSession.getParsedUnit(a.path);
+
     await resolveTestFile();
 
     var directive = findNode.partOf('a.dart');
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 60fd9f7..5a963a6 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -2734,21 +2734,15 @@
   }
 
   test_part_getResult_noLibrary() async {
-    var c = convertPath('/test/lib/c.dart');
-    newFile(c, r'''
+    final c = newFile('/test/lib/c.dart', r'''
 part of a;
 class C {}
-var a = new A();
-var b = new B();
 ''');
 
-    driver.addFile(c);
-
-    // There is no library which c.dart is a part of, so it has unresolved
-    // A and B references.
-    ResolvedUnitResult result = await driver.getResultValid(c);
-    expect(result.errors, isNotEmpty);
-    expect(result.unit, isNotNull);
+    // There is no library which c.dart is a part of, so invalid result.
+    final result = await driver.getResult(c.path);
+    result as PartWithoutLibraryResult;
+    expect(result.path, c.path);
   }
 
   test_part_getUnitElement_afterLibrary() async {
@@ -2829,28 +2823,14 @@
   }
 
   test_part_getUnitElement_noLibrary() async {
-    var c = convertPath('/test/lib/c.dart');
-    newFile(c, r'''
+    final c = newFile('/test/lib/c.dart', r'''
 part of a;
-var a = new A();
-var b = new B();
 ''');
 
-    driver.addFile(c);
-
-    // We don't know the library of c.dart, but we should get a result.
-    // The types "A" and "B" are unresolved.
-    {
-      var result = await driver.getUnitElement(c);
-      result as UnitElementResult;
-      var partUnit = result.element;
-
-      expect(partUnit.topLevelVariables[0].name, 'a');
-      assertType(partUnit.topLevelVariables[0].type, 'dynamic');
-
-      expect(partUnit.topLevelVariables[1].name, 'b');
-      assertType(partUnit.topLevelVariables[1].type, 'dynamic');
-    }
+    // We don't know the library of c.dart, so invalid result.
+    var result = await driver.getUnitElement(c.path);
+    result as PartWithoutLibraryResult;
+    expect(result.path, c.path);
   }
 
   test_part_results_afterLibrary() async {
@@ -2889,15 +2869,16 @@
 
     // Update a.dart so that c.dart is not a part.
     {
+      allResults.clear();
+
       modifyFile(a, '// does not use c.dart anymore');
       driver.changeFile(a);
       await waitForIdleWithoutExceptions();
 
-      // Now c.dart does not have a library context, so A and B cannot be
-      // resolved, so there are errors.
-      var result =
-          allResults.whereType<ErrorsResult>().lastWhere((r) => r.path == c);
-      expect(result.errors, isNotEmpty);
+      // Now c.dart does not know the library, so invalid result.
+      allResults
+          .whereType<PartWithoutLibraryResult>()
+          .lastWhere((r) => r.path == c);
     }
   }
 
@@ -2949,11 +2930,29 @@
 
     await waitForIdleWithoutExceptions();
 
-    // There is no library which c.dart is a part of, so it has unresolved
-    // A and B references.
-    var result =
-        allResults.whereType<ErrorsResult>().lastWhere((r) => r.path == c);
-    expect(result.errors, isNotEmpty);
+    // We don't know the library for `c.dart`, so report an invalid result.
+    allResults
+        .whereType<PartWithoutLibraryResult>()
+        .lastWhere((result) => result.path == c);
+  }
+
+  test_part_results_noLibrary_priority() async {
+    var c = newFile('/test/lib/c.dart', r'''
+part of a;
+class C {}
+var a = new A();
+var b = new B();
+''');
+
+    driver.addFile(c.path);
+    driver.priorityFiles = [c.path];
+
+    await waitForIdleWithoutExceptions();
+
+    // We don't know the library for `c.dart`, so report an invalid result.
+    allResults
+        .whereType<PartWithoutLibraryResult>()
+        .lastWhere((result) => result.path == c.path);
   }
 
   test_part_results_priority_beforeLibrary() async {
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index ba431f2..490c069 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -2526,24 +2526,6 @@
     expect(c.id, endsWith('c.dart;C'));
   }
 
-  test_subtypes_class_partWithoutLibrary() async {
-    await resolveTestCode('''
-part of lib;
-
-class A {}
-class B extends A {}
-''');
-    var a = findElement.class_('A');
-
-    List<SubtypeResult> subtypes =
-        await driver.search.subtypes(SearchedFiles(), type: a);
-    expect(subtypes, hasLength(1));
-
-    SubtypeResult b = subtypes.singleWhere((r) => r.name == 'B');
-    expect(b.libraryUri, testUriStr);
-    expect(b.id, '$testUriStr;$testUriStr;B');
-  }
-
   test_subtypes_enum() async {
     await resolveTestCode('''
 class A {}
diff --git a/pkg/analyzer/test/src/diagnostics/sdk_version_async_exported_from_core_test.dart b/pkg/analyzer/test/src/diagnostics/sdk_version_async_exported_from_core_test.dart
index 90054d2..479a695 100644
--- a/pkg/analyzer/test/src/diagnostics/sdk_version_async_exported_from_core_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/sdk_version_async_exported_from_core_test.dart
@@ -2,9 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../dart/resolution/context_collection_resolution.dart';
 import 'sdk_constraint_verifier_support.dart';
 
 main() {
@@ -49,14 +52,31 @@
   }
 
   test_equals_implicitImportOfCore_inPart() async {
-    newFile('/lib.dart', '''
+    writeTestPackagePubspecYamlFile(
+      PubspecYamlFileConfig(
+        sdkVersion: '>=2.1.0',
+      ),
+    );
+
+    final lib = newFile('$testPackageLibPath/lib.dart', '''
 library lib;
+
+part 'a.dart';
 ''');
-    await verifyVersion('2.1.0', '''
+
+    final a = newFile('$testPackageLibPath/a.dart', r'''
 part of lib;
 
 Future<int> zero() async => 0;
 ''');
+
+    final analysisSession = contextFor(lib.path).currentSession;
+    final resolvedLibrary = await analysisSession.getResolvedLibrary(lib.path);
+    resolvedLibrary as ResolvedLibraryResult;
+
+    final resolvedPart = resolvedLibrary.units.last;
+    expect(resolvedPart.path, a.path);
+    assertErrorsInList(resolvedPart.errors, []);
   }
 
   test_lessThan_explicitImportOfAsync() async {
@@ -97,14 +117,31 @@
   }
 
   test_lessThan_implicitImportOfCore_inPart() async {
-    newFile('/lib.dart', '''
+    writeTestPackagePubspecYamlFile(
+      PubspecYamlFileConfig(
+        sdkVersion: '>=2.0.0',
+      ),
+    );
+
+    final lib = newFile('$testPackageLibPath/lib.dart', '''
 library lib;
+
+part 'a.dart';
 ''');
-    await verifyVersion('2.0.0', '''
+
+    final a = newFile('$testPackageLibPath/a.dart', r'''
 part of lib;
 
 Future<int> zero() async => 0;
-''', expectedErrors: [
+''');
+
+    final analysisSession = contextFor(lib.path).currentSession;
+    final resolvedLibrary = await analysisSession.getResolvedLibrary(lib.path);
+    resolvedLibrary as ResolvedLibraryResult;
+
+    final resolvedPart = resolvedLibrary.units.last;
+    expect(resolvedPart.path, a.path);
+    assertErrorsInList(resolvedPart.errors, [
       error(HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE, 14, 6),
     ]);
   }
diff --git a/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart b/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
index 3c42768..f4b9318 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
@@ -3068,16 +3068,17 @@
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    final a = newFile('/home/test/lib/a.dart', '''
         library libA;
         import 'b.dart';
-        part "$testFile";
+        part 'test.dart';
         class A { }
         var m;''');
     addTestSource('''
         part of libA;
         class B { B.bar(int x); }
         main() {new ^}''');
+    await resolveFile(a.path);
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index b12d2da..07fc1d5 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -86,6 +86,7 @@
 
   List<ConstantValue> getDependencies();
 
+  // TODO(48820): Add type parameters.
   accept(ConstantValueVisitor visitor, arg);
 
   /// The value of this constant in Dart syntax, if possible.
diff --git a/pkg/compiler/lib/src/js/rewrite_async.dart b/pkg/compiler/lib/src/js/rewrite_async.dart
index 7cc6ec9..82d1662 100644
--- a/pkg/compiler/lib/src/js/rewrite_async.dart
+++ b/pkg/compiler/lib/src/js/rewrite_async.dart
@@ -9,7 +9,7 @@
 import 'dart:collection';
 import 'dart:math' show max;
 
-import 'package:js_runtime/shared/async_await_error_codes.dart' as error_codes;
+import 'package:js_runtime/synced/async_await_error_codes.dart' as error_codes;
 
 import '../common.dart';
 import '../io/source_information.dart' show SourceInformation;
diff --git a/pkg/compiler/lib/src/js_backend/backend_usage.dart b/pkg/compiler/lib/src/js_backend/backend_usage.dart
index 7e08bd6..37ef534 100644
--- a/pkg/compiler/lib/src/js_backend/backend_usage.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_usage.dart
@@ -161,7 +161,8 @@
     if (_isValidEntity(element)) return true;
     SourceSpan span = _frontendStrategy.spanFromSpannable(element, element);
     if (library.canonicalUri.isScheme('dart') &&
-        span.uri.path.contains('_internal/js_runtime/lib/')) {
+        (span.uri.path.contains('_internal/js_runtime/lib') ||
+            span.uri.path.contains('_internal/js_shared/lib'))) {
       // TODO(johnniwinther): We should be more precise about these.
       return true;
     } else {
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 3f90fc2..392e4e5 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -9,7 +9,7 @@
 import 'package:front_end/src/api_unstable/dart2js.dart'
     show $0, $9, $A, $Z, $_, $a, $g, $s, $z;
 
-import 'package:js_runtime/shared/embedded_names.dart' show JsGetName;
+import 'package:js_runtime/synced/embedded_names.dart' show JsGetName;
 
 import '../closure.dart';
 import '../common.dart';
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types_new.dart b/pkg/compiler/lib/src/js_backend/runtime_types_new.dart
index 2f8816e..a0f4161 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types_new.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types_new.dart
@@ -6,7 +6,7 @@
 
 library js_backend.runtime_types_new;
 
-import 'package:js_runtime/shared/recipe_syntax.dart';
+import 'package:js_shared/synced/recipe_syntax.dart';
 
 import '../common/elements.dart' show CommonElements, JCommonElements;
 import '../elements/entities.dart';
diff --git a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
index 78a6912..0e14253 100644
--- a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
@@ -6,7 +6,7 @@
 
 library dart2js.js_emitter.class_stub_generator;
 
-import 'package:js_runtime/shared/embedded_names.dart'
+import 'package:js_runtime/synced/embedded_names.dart'
     show TearOffParametersPropertyNames;
 
 import '../common/elements.dart' show CommonElements;
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index 1cbf7e1..5932c85 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -68,7 +68,7 @@
     return _nativeEmitter;
   }
 
-  Emitter get emitter {
+  Emitter /*!*/ get emitter {
     assert(_emitter != null,
         failedAt(NO_LOCATION_SPANNABLE, "Emitter has not been created yet."));
     return _emitter;
diff --git a/pkg/compiler/lib/src/js_emitter/constant_ordering.dart b/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
index ed04b1c..3103cb2 100644
--- a/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
+++ b/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.10
-
 library dart2js.js_emitter.constant_ordering;
 
 import '../constants/values.dart';
@@ -22,7 +20,7 @@
 class _ConstantOrdering
     implements ConstantOrdering, ConstantValueVisitor<int, ConstantValue> {
   final Sorter _sorter;
-  _DartTypeOrdering _dartTypeOrdering;
+  late _DartTypeOrdering _dartTypeOrdering;
   _ConstantOrdering(this._sorter) {
     _dartTypeOrdering = _DartTypeOrdering(this);
   }
@@ -37,7 +35,7 @@
     return a.accept(this, b);
   }
 
-  static int compareLists<S, T>(int compare(S a, T b), List<S> a, List<T> b) {
+  static int compareLists<T>(int compare(T a, T b), List<T> a, List<T> b) {
     int r = a.length.compareTo(b.length);
     if (r != 0) return r;
     for (int i = 0; i < a.length; i++) {
@@ -54,7 +52,7 @@
   }
 
   int compareMembers(MemberEntity a, MemberEntity b) {
-    int r = a.name.compareTo(b.name);
+    int r = a.name!.compareTo(b.name!);
     if (r != 0) return r;
     return _sorter.compareMembersByLocation(a, b);
   }
@@ -139,8 +137,8 @@
 
     return compareLists(
         compareValues,
-        aFields.map((field) => a.fields[field]).toList(),
-        aFields.map((field) => b.fields[field]).toList());
+        aFields.map((field) => a.fields[field]!).toList(),
+        aFields.map((field) => b.fields[field]!).toList());
   }
 
   @override
@@ -184,7 +182,8 @@
       DeferredGlobalConstantValue a, DeferredGlobalConstantValue b) {
     int r = compareValues(a.referenced, b.referenced);
     if (r != 0) return r;
-    return a.unit.compareTo(b.unit);
+    // TODO(48820): Should unit be non-nullable?
+    return a.unit!.compareTo(b.unit!);
   }
 
   @override
@@ -234,7 +233,7 @@
 
 class _DartTypeOrdering extends DartTypeVisitor<int, DartType> {
   final _ConstantOrdering _constantOrdering;
-  DartType _root;
+  DartType? _root;
   final List<FunctionTypeVariable> _leftFunctionTypeVariables = [];
   final List<FunctionTypeVariable> _rightFunctionTypeVariables = [];
   _DartTypeOrdering(this._constantOrdering);
diff --git a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
index 4d5beaf..5251365 100644
--- a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
@@ -6,7 +6,7 @@
 
 library dart2js.js_emitter.interceptor_stub_generator;
 
-import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames;
+import 'package:js_runtime/synced/embedded_names.dart' as embeddedNames;
 
 import '../common/elements.dart';
 import '../constants/values.dart';
@@ -420,7 +420,7 @@
     CustomElementsCodegenAnalysis analysis = _customElementsCodegenAnalysis;
     if (!analysis.needsTable) return null;
 
-    List<jsAst.Expression> elements = [];
+    List<jsAst.Expression /*!*/ > elements = [];
     Iterable<ConstantValue> constants =
         _codegenWorld.getConstantsForEmission(_emitter.compareConstants);
     for (ConstantValue constant in constants) {
diff --git a/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart
index 6098493..c6af592 100644
--- a/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart
@@ -7,7 +7,7 @@
 library dart2js.js_emitter.main_call_stub_generator;
 
 import 'package:compiler/src/options.dart';
-import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames;
+import 'package:js_runtime/synced/embedded_names.dart' as embeddedNames;
 
 import '../common/elements.dart';
 import '../elements/entities.dart';
diff --git a/pkg/compiler/lib/src/js_emitter/native_generator.dart b/pkg/compiler/lib/src/js_emitter/native_generator.dart
index 71e6414..a47b6be 100644
--- a/pkg/compiler/lib/src/js_emitter/native_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/native_generator.dart
@@ -6,7 +6,7 @@
 
 library dart2js.js_emitter.native_generator;
 
-import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames;
+import 'package:js_runtime/synced/embedded_names.dart' as embeddedNames;
 
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show js;
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index f0ca9812..9ff95c5 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -8,7 +8,7 @@
 
 import 'dart:convert' show JsonEncoder;
 
-import 'package:js_runtime/shared/embedded_names.dart'
+import 'package:js_runtime/synced/embedded_names.dart'
     show
         ARRAY_RTI_PROPERTY,
         DEFERRED_INITIALIZED,
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 476b906..f28ab293 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -6,7 +6,7 @@
 
 import 'package:front_end/src/api_prototype/constant_evaluator.dart' as ir;
 import 'package:front_end/src/api_unstable/dart2js.dart' as ir;
-import 'package:js_runtime/shared/embedded_names.dart';
+import 'package:js_runtime/synced/embedded_names.dart';
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/core_types.dart' as ir;
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 8721f91..cc26197 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.10
 
-import 'package:js_runtime/shared/embedded_names.dart';
+import 'package:js_runtime/synced/embedded_names.dart';
 import 'package:kernel/ast.dart' as ir;
 
 import '../closure.dart';
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index 710e2c4..73a25f6 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -81,10 +81,10 @@
   void forEachStaticField(void Function(FieldEntity) f);
 
   /// Returns the types that are live as constant type literals.
-  Iterable<DartType> get constTypeLiterals;
+  Iterable<DartType /*!*/ > get constTypeLiterals;
 
   /// Returns the types that are live as constant type arguments.
-  Iterable<DartType> get liveTypeArguments;
+  Iterable<DartType /*!*/ > get liveTypeArguments;
 
   /// Returns a list of constants topologically sorted so that dependencies
   /// appear before the dependent constant.
diff --git a/pkg/compiler/lib/src/universe/use.dart b/pkg/compiler/lib/src/universe/use.dart
index 9ddd60d..2adead4 100644
--- a/pkg/compiler/lib/src/universe/use.dart
+++ b/pkg/compiler/lib/src/universe/use.dart
@@ -899,7 +899,7 @@
 class ConstantUse {
   static const String tag = 'constant-use';
 
-  final ConstantValue value;
+  final ConstantValue /*!*/ value;
 
   ConstantUse._(this.value);
 
@@ -922,7 +922,7 @@
   }
 
   /// Constant used as the initial value of a field.
-  ConstantUse.init(ConstantValue value) : this._(value);
+  ConstantUse.init(ConstantValue /*!*/ value) : this._(value);
 
   /// Type constant used for registration of custom elements.
   ConstantUse.customElements(TypeConstantValue value) : this._(value);
diff --git a/pkg/compiler/pubspec.yaml b/pkg/compiler/pubspec.yaml
index 22f0ac4..f3dfd26 100644
--- a/pkg/compiler/pubspec.yaml
+++ b/pkg/compiler/pubspec.yaml
@@ -17,6 +17,7 @@
   front_end: any
   js_ast: any
   js_runtime: any
+  js_shared: any
   kernel: any
 
 dev_dependencies:
diff --git a/pkg/js_runtime/README.md b/pkg/js_runtime/README.md
index 5f60952..02f263b 100644
--- a/pkg/js_runtime/README.md
+++ b/pkg/js_runtime/README.md
@@ -3,7 +3,7 @@
 This package contains code that is shared between the dart2js compiler and the
 dart2js runtime libraries.
 
-*Important*: all code under the `lib/shared/` must be kept in sync with the
-runtime at all times (in `sdk/lib/_internal/js_runtime/lib/shared`). The
+*Important*: all code under the `lib/synced/` must be kept in sync with the
+runtime at all times (in `sdk/lib/_internal/js_runtime/lib/synced`). The
 `test/in_sync_test.dart` test verifies this.
 
diff --git a/pkg/js_runtime/lib/shared/async_await_error_codes.dart b/pkg/js_runtime/lib/synced/async_await_error_codes.dart
similarity index 100%
rename from pkg/js_runtime/lib/shared/async_await_error_codes.dart
rename to pkg/js_runtime/lib/synced/async_await_error_codes.dart
diff --git a/pkg/js_runtime/lib/shared/embedded_names.dart b/pkg/js_runtime/lib/synced/embedded_names.dart
similarity index 100%
rename from pkg/js_runtime/lib/shared/embedded_names.dart
rename to pkg/js_runtime/lib/synced/embedded_names.dart
diff --git a/pkg/js_runtime/test/in_sync_test.dart b/pkg/js_runtime/test/in_sync_test.dart
index 4dbef635..5dab586 100644
--- a/pkg/js_runtime/test/in_sync_test.dart
+++ b/pkg/js_runtime/test/in_sync_test.dart
@@ -11,9 +11,9 @@
 import 'package:expect/expect.dart';
 
 void main(List<String> argv) {
-  var packageDir = Platform.script.resolve('../lib/shared/');
+  var packageDir = Platform.script.resolve('../lib/synced/');
   var sdkDir = Platform.script
-      .resolve('../../../sdk/lib/_internal/js_runtime/lib/shared/');
+      .resolve('../../../sdk/lib/_internal/js_runtime/lib/synced/');
   var rPackageDir =
       relativizeUri(Directory.current.uri, packageDir, Platform.isWindows);
   var rSdkDir =
diff --git a/pkg/js_shared/OWNERS b/pkg/js_shared/OWNERS
new file mode 100644
index 0000000..f5bd90c
--- /dev/null
+++ b/pkg/js_shared/OWNERS
@@ -0,0 +1 @@
+file:/tools/OWNERS_WEB
diff --git a/pkg/js_shared/README.md b/pkg/js_shared/README.md
new file mode 100644
index 0000000..cce9c2e
--- /dev/null
+++ b/pkg/js_shared/README.md
@@ -0,0 +1,13 @@
+# Package `js_shared`:
+
+This code is a compile time dependency of dart2js and DDC. It is imported as
+a `package:` import by both compilers.
+
+There is an exact copy in the SDK of the libraries in the
+`pkg/js_shared/lib/synced` sub-directory.
+Those libraries are imported as `dart:` imports by the dart2js and DDC runtime
+libraries.
+
+*Important*: all code under `pkg/js_shared/lib/synced` must be kept in sync with
+the runtime (in `sdk/lib/_internal/js_shared/lib/synced`) at all times. The
+`test/in_sync_test.dart` test verifies this.
diff --git a/pkg/js_runtime/lib/shared/recipe_syntax.dart b/pkg/js_shared/lib/synced/recipe_syntax.dart
similarity index 98%
rename from pkg/js_runtime/lib/shared/recipe_syntax.dart
rename to pkg/js_shared/lib/synced/recipe_syntax.dart
index 7305491..3ccec60 100644
--- a/pkg/js_runtime/lib/shared/recipe_syntax.dart
+++ b/pkg/js_shared/lib/synced/recipe_syntax.dart
@@ -6,8 +6,8 @@
 
 /// Constants and predicates used for encoding and decoding type recipes.
 ///
-/// This library is shared between the compiler and the runtime system.
-library dart2js._recipe_syntax;
+/// This library is synchronized between the compiler and the runtime system.
+library js_shared._recipe_syntax;
 
 abstract class Recipe {
   Recipe._();
diff --git a/pkg/js_shared/pubspec.yaml b/pkg/js_shared/pubspec.yaml
new file mode 100644
index 0000000..6424aac
--- /dev/null
+++ b/pkg/js_shared/pubspec.yaml
@@ -0,0 +1,10 @@
+name: js_shared
+# This package is not intended for consumption on pub.dev. DO NOT publish.
+publish_to: none
+
+environment:
+  sdk: '>=2.12.0 <3.0.0'
+
+dev_dependencies:
+  expect: any
+  _fe_analyzer_shared: any
diff --git a/pkg/js_shared/test/in_sync_test.dart b/pkg/js_shared/test/in_sync_test.dart
new file mode 100644
index 0000000..e10c4d6
--- /dev/null
+++ b/pkg/js_shared/test/in_sync_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Test to verify that this package is in-sync with shared runtime libraries.
+import 'dart:io';
+
+import 'package:_fe_analyzer_shared/src/util/relativize.dart';
+import 'package:expect/expect.dart';
+
+void main(List<String> argv) {
+  var packageDir = Platform.script.resolve('../lib/synced/');
+  var sdkDir = Platform.script
+      .resolve('../../../sdk/lib/_internal/js_shared/lib/synced/');
+  var rPackageDir =
+      relativizeUri(Directory.current.uri, packageDir, Platform.isWindows);
+  var rSdkDir =
+      relativizeUri(Directory.current.uri, sdkDir, Platform.isWindows);
+
+  for (var file in Directory.fromUri(sdkDir).listSync()) {
+    if (file is File) {
+      var filename = file.uri.pathSegments.last;
+      var packageFile = File.fromUri(packageDir.resolve(filename));
+      Expect.isTrue(
+          packageFile.existsSync(),
+          "$filename not in sync. Please update it by running:\n"
+          "  cp $rSdkDir$filename $rPackageDir$filename");
+      var original = file.readAsBytesSync();
+      var copy = packageFile.readAsBytesSync();
+      Expect.listEquals(
+          original,
+          copy,
+          "$filename not in sync. Please update it by running:\n"
+          "  cp $rSdkDir$filename $rPackageDir$filename");
+    }
+  }
+}
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index 8609209..e1df28b 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -5730,10 +5730,9 @@
   Future<void> test_part_metadata() async {
     var pathContext = resourceProvider.pathContext;
     addSource(pathContext.join(pathContext.dirname(testFile), 'part.dart'), '''
-part of test;
+part of 'test.dart';
 ''');
     await analyze('''
-library test;
 @deprecated
 part 'part.dart';
 ''');
@@ -5744,10 +5743,13 @@
   Future<void> test_part_of_identifier() async {
     var pathContext = resourceProvider.pathContext;
     var testFileName = pathContext.basename(testFile);
-    addSource(pathContext.join(pathContext.dirname(testFile), 'lib.dart'), '''
+    var libPath = pathContext.join(pathContext.dirname(testFile), 'lib.dart');
+    addSource(libPath, '''
 library test;
 part '$testFileName';
 ''');
+    // Discover the library for the part.
+    session.getParsedUnit(libPath);
     await analyze('''
 part of test;
 ''');
@@ -5758,13 +5760,16 @@
   Future<void> test_part_of_metadata() async {
     var pathContext = resourceProvider.pathContext;
     var testFileName = pathContext.basename(testFile);
-    addSource(pathContext.join(pathContext.dirname(testFile), 'lib.dart'), '''
-library test;
+    var libPath = pathContext.join(pathContext.dirname(testFile), 'lib.dart');
+    addSource(libPath, '''
 part '$testFileName';
 ''');
+    // TODO(scheglov) This should not be necessary, we use URI, so can find it.
+    // Discover the library for the part.
+    session.getParsedUnit(libPath);
     await analyze('''
 @deprecated
-part of test;
+part of 'lib.dart';
 ''');
     // No assertions needed; the AnnotationTracker mixin verifies that the
     // metadata was visited.
@@ -5773,9 +5778,13 @@
   Future<void> test_part_of_path() async {
     var pathContext = resourceProvider.pathContext;
     var testFileName = pathContext.basename(testFile);
-    addSource(pathContext.join(pathContext.dirname(testFile), 'lib.dart'), '''
+    var libPath = pathContext.join(pathContext.dirname(testFile), 'lib.dart');
+    addSource(libPath, '''
 part '$testFileName';
 ''');
+    // TODO(scheglov) This should not be necessary, we use URI, so can find it.
+    // Discover the library for the part.
+    session.getParsedUnit(libPath);
     await analyze('''
 part of 'lib.dart';
 ''');
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 2aef55f..b7d1949 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -140,6 +140,7 @@
 front_end/test/hot_reload_e2e_test: Skip
 frontend_server/test/*: SkipByDesign # Only meant to run on vm
 js_runtime/test/*: SkipByDesign # Only meant to run on vm
+js_shared/test/*: SkipByDesign # Only meant to run on vm
 vm/test/*: SkipByDesign # Only meant to run on vm
 vm_service/test/*: SkipByDesign # Uses dart:io
 vm_snapshot_analysis/test/*: SkipByDesign # Only meant to run on vm
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index a6b8720..823e4a8 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -2389,21 +2389,21 @@
         return left()->definition();
       } else if (rhs == 0) {
         return right()->definition();
-      } else if (rhs == 2) {
-        const int64_t shift_1 = 1;
-        ConstantInstr* constant_1 =
-            flow_graph->GetConstant(Smi::Handle(Smi::New(shift_1)));
+      } else if ((rhs > 0) && Utils::IsPowerOfTwo(rhs)) {
+        const int64_t shift_amount = Utils::ShiftForPowerOfTwo(rhs);
+        ConstantInstr* constant_shift_amount = flow_graph->GetConstant(
+            Smi::Handle(Smi::New(shift_amount)), representation());
         BinaryIntegerOpInstr* shift = BinaryIntegerOpInstr::Make(
             representation(), Token::kSHL, left()->CopyWithType(),
-            new Value(constant_1), GetDeoptId(), can_overflow(),
+            new Value(constant_shift_amount), GetDeoptId(), can_overflow(),
             is_truncating(), range(), SpeculativeModeOfInputs());
         if (shift != nullptr) {
           // Assign a range to the shift factor, just in case range
           // analysis no longer runs after this rewriting.
           if (auto shift_with_range = shift->AsShiftIntegerOp()) {
             shift_with_range->set_shift_range(
-                new Range(RangeBoundary::FromConstant(shift_1),
-                          RangeBoundary::FromConstant(shift_1)));
+                new Range(RangeBoundary::FromConstant(shift_amount),
+                          RangeBoundary::FromConstant(shift_amount)));
           }
           flow_graph->InsertBefore(this, shift, env(), FlowGraph::kValue);
           return shift;
diff --git a/sdk/lib/_internal/js_runtime/lib/shared/recipe_syntax.dart b/sdk/lib/_internal/js_runtime/lib/shared/recipe_syntax.dart
deleted file mode 100644
index 7305491..0000000
--- a/sdk/lib/_internal/js_runtime/lib/shared/recipe_syntax.dart
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart=2.12
-
-/// Constants and predicates used for encoding and decoding type recipes.
-///
-/// This library is shared between the compiler and the runtime system.
-library dart2js._recipe_syntax;
-
-abstract class Recipe {
-  Recipe._();
-
-  // Operators.
-
-  static const int separator = _comma;
-  static const String separatorString = _commaString;
-
-  static const int toType = _semicolon;
-  static const String toTypeString = _semicolonString;
-
-  static const int pushErased = _hash;
-  static const String pushErasedString = _hashString;
-  static const int pushDynamic = _at;
-  static const String pushDynamicString = _atString;
-  static const int pushVoid = _tilde;
-  static const String pushVoidString = _tildeString;
-
-  static const int wrapStar = _asterisk;
-  static const String wrapStarString = _asteriskString;
-  static const int wrapQuestion = _question;
-  static const String wrapQuestionString = _questionString;
-  static const int wrapFutureOr = _slash;
-  static const String wrapFutureOrString = _slashString;
-
-  static const int startTypeArguments = _lessThan;
-  static const String startTypeArgumentsString = _lessThanString;
-  static const int endTypeArguments = _greaterThan;
-  static const String endTypeArgumentsString = _greaterThanString;
-
-  static const int startFunctionArguments = _leftParen;
-  static const String startFunctionArgumentsString = _leftParenString;
-  static const int endFunctionArguments = _rightParen;
-  static const String endFunctionArgumentsString = _rightParenString;
-  static const int startOptionalGroup = _leftBracket;
-  static const String startOptionalGroupString = _leftBracketString;
-  static const int endOptionalGroup = _rightBracket;
-  static const String endOptionalGroupString = _rightBracketString;
-  static const int startNamedGroup = _leftBrace;
-  static const String startNamedGroupString = _leftBraceString;
-  static const int endNamedGroup = _rightBrace;
-  static const String endNamedGroupString = _rightBraceString;
-  static const int nameSeparator = _colon;
-  static const String nameSeparatorString = _colonString;
-  static const int requiredNameSeparator = _exclamation;
-  static const String requiredNameSeparatorString = _exclamationString;
-
-  static const int genericFunctionTypeParameterIndex = _circumflex;
-  static const String genericFunctionTypeParameterIndexString =
-      _circumflexString;
-
-  static const int extensionOp = _ampersand;
-  static const String extensionOpString = _ampersandString;
-  static const int pushNeverExtension = 0;
-  static const String pushNeverExtensionString = '$pushNeverExtension';
-  static const int pushAnyExtension = 1;
-  static const String pushAnyExtensionString = '$pushAnyExtension';
-
-  // Number and name components.
-
-  static bool isDigit(int code) => code >= _digit0 && code <= _digit9;
-  static int digitValue(int code) => code - _digit0;
-
-  static bool isIdentifierStart(int ch) =>
-      (((ch | 32) - _lowercaseA) & 0xffff) < 26 ||
-      (ch == _underscore) ||
-      (ch == _dollar);
-
-  static const int period = _period;
-
-  // Private names.
-
-  static const int _formfeed = 0x0C;
-  static const String _formfeedString = '\f';
-
-  static const int _space = 0x20;
-  static const String _spaceString = ' ';
-  static const int _exclamation = 0x21;
-  static const String _exclamationString = '!';
-  static const int _hash = 0x23;
-  static const String _hashString = '#';
-  static const int _dollar = 0x24;
-  static const String _dollarString = r'$';
-  static const int _percent = 0x25;
-  static const String _percentString = '%';
-  static const int _ampersand = 0x26;
-  static const String _ampersandString = '&';
-  static const int _apostrophe = 0x27;
-  static const String _apostropheString = "'";
-  static const int _leftParen = 0x28;
-  static const String _leftParenString = '(';
-  static const int _rightParen = 0x29;
-  static const String _rightParenString = ')';
-  static const int _asterisk = 0x2A;
-  static const String _asteriskString = '*';
-  static const int _plus = 0x2B;
-  static const String _plusString = '+';
-  static const int _comma = 0x2C;
-  static const String _commaString = ',';
-  static const int _minus = 0x2D;
-  static const String _minusString = '-';
-  static const int _period = 0x2E;
-  static const String _periodString = '.';
-  static const int _slash = 0x2F;
-  static const String _slashString = '/';
-
-  static const int _digit0 = 0x30;
-  static const int _digit9 = 0x39;
-
-  static const int _colon = 0x3A;
-  static const String _colonString = ':';
-  static const int _semicolon = 0x3B;
-  static const String _semicolonString = ';';
-  static const int _lessThan = 0x3C;
-  static const String _lessThanString = '<';
-  static const int _equals = 0x3D;
-  static const String _equalsString = '=';
-  static const int _greaterThan = 0x3E;
-  static const String _greaterThanString = '>';
-  static const int _question = 0x3F;
-  static const String _questionString = '?';
-  static const int _at = 0x40;
-  static const String _atString = '@';
-
-  static const int _uppercaseA = 0x41;
-  static const int _uppercaseZ = 0x5A;
-
-  static const int _leftBracket = 0x5B;
-  static const String _leftBracketString = '[';
-  static const int _backslash = 0x5C;
-  static const String _backslashString = r'\';
-  static const int _rightBracket = 0x5D;
-  static const String _rightBracketString = ']';
-  static const int _circumflex = 0x5E;
-  static const String _circumflexString = '^';
-  static const int _underscore = 0x5F;
-  static const String _underscoreString = '_';
-  static const int _backtick = 0x60;
-  static const String _backtickString = '`';
-
-  static const int _lowercaseA = 0x61;
-  static const int _lowercaseZ = 0x7A;
-
-  static const int _leftBrace = 0x7B;
-  static const String _leftBraceString = '{';
-  static const int _vertical = 0x7C;
-  static const String _verticalString = '|';
-  static const int _rightBrace = 0x7D;
-  static const String _rightBraceString = '}';
-  static const int _tilde = 0x7E;
-  static const String _tildeString = '~';
-
-  static void testEquivalence() {
-    void test(String label, int charCode, String str) {
-      if (String.fromCharCode(charCode) != str) {
-        throw StateError("$label: String.fromCharCode($charCode) != $str");
-      }
-    }
-
-    void testExtension(String label, int op, String str) {
-      if ('$op' != str) {
-        throw StateError("$label: $op.toString() != $str");
-      }
-    }
-
-    test("separator", separator, separatorString);
-    test("toType", toType, toTypeString);
-    test("pushErased", pushErased, pushErasedString);
-    test("pushDynamic", pushDynamic, pushDynamicString);
-    test("pushVoid", pushVoid, pushVoidString);
-    test("wrapStar", wrapStar, wrapStarString);
-    test("wrapQuestion", wrapQuestion, wrapQuestionString);
-    test("wrapFutureOr", wrapFutureOr, wrapFutureOrString);
-    test("startTypeArguments", startTypeArguments, startTypeArgumentsString);
-    test("endTypeArguments", endTypeArguments, endTypeArgumentsString);
-    test("startFunctionArguments", startFunctionArguments,
-        startFunctionArgumentsString);
-    test("endFunctionArguments", endFunctionArguments,
-        endFunctionArgumentsString);
-    test("startOptionalGroup", startOptionalGroup, startOptionalGroupString);
-    test("endOptionalGroup", endOptionalGroup, endOptionalGroupString);
-    test("startNamedGroup", startNamedGroup, startNamedGroupString);
-    test("endNamedGroup", endNamedGroup, endNamedGroupString);
-    test("nameSeparator", nameSeparator, nameSeparatorString);
-    test("requiredNameSeparator", requiredNameSeparator,
-        requiredNameSeparatorString);
-    test("genericFunctionTypeParameterIndex", genericFunctionTypeParameterIndex,
-        genericFunctionTypeParameterIndexString);
-    test("extensionOp", extensionOp, extensionOpString);
-    testExtension(
-        "pushNeverExtension", pushNeverExtension, pushNeverExtensionString);
-    testExtension("pushAnyExtension", pushAnyExtension, pushAnyExtensionString);
-
-    test("_formfeed", _formfeed, _formfeedString);
-    test("_space", _space, _spaceString);
-    test("_exclamation", _exclamation, _exclamationString);
-    test("_hash", _hash, _hashString);
-    test("_dollar", _dollar, _dollarString);
-    test("_percent", _percent, _percentString);
-    test("_ampersand", _ampersand, _ampersandString);
-    test("_apostrophe", _apostrophe, _apostropheString);
-    test("_leftParen", _leftParen, _leftParenString);
-    test("_rightParen", _rightParen, _rightParenString);
-    test("_asterisk", _asterisk, _asteriskString);
-    test("_plus", _plus, _plusString);
-    test("_comma", _comma, _commaString);
-    test("_minus", _minus, _minusString);
-    test("_period", _period, _periodString);
-    test("_slash", _slash, _slashString);
-    test("_colon", _colon, _colonString);
-    test("_semicolon", _semicolon, _semicolonString);
-    test("_lessThan", _lessThan, _lessThanString);
-    test("_equals", _equals, _equalsString);
-    test("_greaterThan", _greaterThan, _greaterThanString);
-    test("_question", _question, _questionString);
-    test("_at", _at, _atString);
-    test("_leftBracket", _leftBracket, _leftBracketString);
-    test("_backslash", _backslash, _backslashString);
-    test("_rightBracket", _rightBracket, _rightBracketString);
-    test("_circumflex", _circumflex, _circumflexString);
-    test("_underscore", _underscore, _underscoreString);
-    test("_backtick", _backtick, _backtickString);
-    test("_leftBrace", _leftBrace, _leftBraceString);
-    test("_vertical", _vertical, _verticalString);
-    test("_rightBrace", _rightBrace, _rightBraceString);
-    test("_tilde", _tilde, _tildeString);
-  }
-}
diff --git a/sdk/lib/_internal/js_runtime/lib/shared/async_await_error_codes.dart b/sdk/lib/_internal/js_runtime/lib/synced/async_await_error_codes.dart
similarity index 100%
rename from sdk/lib/_internal/js_runtime/lib/shared/async_await_error_codes.dart
rename to sdk/lib/_internal/js_runtime/lib/synced/async_await_error_codes.dart
diff --git a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart b/sdk/lib/_internal/js_runtime/lib/synced/embedded_names.dart
similarity index 100%
rename from sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
rename to sdk/lib/_internal/js_runtime/lib/synced/embedded_names.dart
diff --git a/sdk/lib/_internal/js_runtime/lib/rti.dart b/sdk/lib/_internal/js_shared/lib/rti.dart
similarity index 100%
rename from sdk/lib/_internal/js_runtime/lib/rti.dart
rename to sdk/lib/_internal/js_shared/lib/rti.dart
diff --git a/pkg/js_runtime/lib/shared/recipe_syntax.dart b/sdk/lib/_internal/js_shared/lib/synced/recipe_syntax.dart
similarity index 98%
copy from pkg/js_runtime/lib/shared/recipe_syntax.dart
copy to sdk/lib/_internal/js_shared/lib/synced/recipe_syntax.dart
index 7305491..3ccec60 100644
--- a/pkg/js_runtime/lib/shared/recipe_syntax.dart
+++ b/sdk/lib/_internal/js_shared/lib/synced/recipe_syntax.dart
@@ -6,8 +6,8 @@
 
 /// Constants and predicates used for encoding and decoding type recipes.
 ///
-/// This library is shared between the compiler and the runtime system.
-library dart2js._recipe_syntax;
+/// This library is synchronized between the compiler and the runtime system.
+library js_shared._recipe_syntax;
 
 abstract class Recipe {
   Recipe._();
diff --git a/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart b/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart
index 49845a2..5a357e5 100644
--- a/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart
+++ b/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart
@@ -147,7 +147,7 @@
       categories: "", documented: false, platforms: DART2JS_PLATFORM),
   "_late_helper": const LibraryInfo("_internal/js_runtime/lib/late_helper.dart",
       categories: "", documented: false, platforms: DART2JS_PLATFORM),
-  "_rti": const LibraryInfo("_internal/js_runtime/lib/rti.dart",
+  "_rti": const LibraryInfo("_internal/js_shared/lib/rti.dart",
       categories: "", documented: false, platforms: DART2JS_PLATFORM),
   "_dart2js_runtime_metrics": const LibraryInfo(
       "_internal/js_runtime/lib/dart2js_runtime_metrics.dart",
@@ -172,17 +172,17 @@
       documented: false,
       platforms: DART2JS_PLATFORM),
   "_js_embedded_names": const LibraryInfo(
-      "_internal/js_runtime/lib/shared/embedded_names.dart",
+      "_internal/js_runtime/lib/synced/embedded_names.dart",
       categories: "",
       documented: false,
       platforms: DART2JS_PLATFORM),
   "_async_await_error_codes": const LibraryInfo(
-      "_internal/js_runtime/lib/shared/async_await_error_codes.dart",
+      "_internal/js_runtime/lib/synced/async_await_error_codes.dart",
       categories: "",
       documented: false,
       platforms: DART2JS_PLATFORM),
   "_recipe_syntax": const LibraryInfo(
-      "_internal/js_runtime/lib/shared/recipe_syntax.dart",
+      "_internal/js_shared/lib/synced/recipe_syntax.dart",
       categories: "",
       documented: false,
       platforms: DART2JS_PLATFORM),
diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json
index b72ab82..6f33d88 100644
--- a/sdk/lib/libraries.json
+++ b/sdk/lib/libraries.json
@@ -369,7 +369,7 @@
         "uri": "_internal/js_runtime/lib/late_helper.dart"
       },
       "_rti": {
-        "uri": "_internal/js_runtime/lib/rti.dart"
+        "uri": "_internal/js_shared/lib/rti.dart"
       },
       "_interceptors": {
         "uri": "_internal/js_runtime/lib/interceptors.dart"
@@ -384,13 +384,13 @@
         "uri": "_internal/js_runtime/lib/js_primitives.dart"
       },
       "_js_embedded_names": {
-        "uri": "_internal/js_runtime/lib/shared/embedded_names.dart"
+        "uri": "_internal/js_runtime/lib/synced/embedded_names.dart"
       },
       "_async_await_error_codes": {
-        "uri": "_internal/js_runtime/lib/shared/async_await_error_codes.dart"
+        "uri": "_internal/js_runtime/lib/synced/async_await_error_codes.dart"
       },
       "_recipe_syntax": {
-        "uri": "_internal/js_runtime/lib/shared/recipe_syntax.dart"
+        "uri": "_internal/js_shared/lib/synced/recipe_syntax.dart"
       }
     }
   },
diff --git a/sdk/lib/libraries.yaml b/sdk/lib/libraries.yaml
index 92231cb..ed11fa5 100644
--- a/sdk/lib/libraries.yaml
+++ b/sdk/lib/libraries.yaml
@@ -337,7 +337,7 @@
       uri: "_internal/js_runtime/lib/late_helper.dart"
 
     _rti:
-      uri: "_internal/js_runtime/lib/rti.dart"
+      uri: "_internal/js_shared/lib/rti.dart"
 
     _interceptors:
       uri: "_internal/js_runtime/lib/interceptors.dart"
@@ -352,13 +352,13 @@
       uri: "_internal/js_runtime/lib/js_primitives.dart"
 
     _js_embedded_names:
-      uri: "_internal/js_runtime/lib/shared/embedded_names.dart"
+      uri: "_internal/js_runtime/lib/synced/embedded_names.dart"
 
     _async_await_error_codes:
-      uri: "_internal/js_runtime/lib/shared/async_await_error_codes.dart"
+      uri: "_internal/js_runtime/lib/synced/async_await_error_codes.dart"
 
     _recipe_syntax:
-      uri: "_internal/js_runtime/lib/shared/recipe_syntax.dart"
+      uri: "_internal/js_shared/lib/synced/recipe_syntax.dart"
 
 dartdevc:
     libraries:
diff --git a/tools/VERSION b/tools/VERSION
index c7f1750..557f70e 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 130
+PRERELEASE 131
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 53e919c..c2fc5a0 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -183,6 +183,11 @@
     "dart2wasm_hostasserts": [
       ".dart_tool/package_config.json",
       "out/ReleaseX64/dart",
+      "out/ReleaseX64/dart_precompiled_runtime",
+      "out/ReleaseX64/dart2wasm.snapshot",
+      "out/ReleaseX64/dart2wasm_asserts.snapshot",
+      "out/ReleaseX64/dart2wasm_outline.dill",
+      "out/ReleaseX64/dart2wasm_platform.dill",
       "pkg/",
       "runtime/tests/",
       "samples-dev/",
@@ -1473,8 +1478,10 @@
         "vm-kernel-precomp-linux-release-simarm64",
         "vm-kernel-precomp-linux-release-simriscv32",
         "vm-kernel-precomp-linux-release-simriscv64",
+        "vm-kernel-precomp-mac-product-x64",
         "vm-kernel-precomp-mac-release-simarm64",
         "vm-kernel-precomp-mac-release-simarm64c",
+        "vm-kernel-precomp-win-product-x64",
         "vm-kernel-precomp-win-release-x64",
         "vm-kernel-precomp-win-release-x64c"
       ],
@@ -3029,7 +3036,7 @@
             "corelib",
             "web/wasm"
           ],
-          "shards": 30,
+          "shards": 3,
           "fileset": "dart2wasm_hostasserts"
         }
       ]
