Version 2.18.0-271.0.dev

Merge commit 'c481790c506960fa57d5b2fd9cc3660143659f89' into 'dev'
diff --git a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
index 5033928..6393fdb 100644
--- a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
@@ -17,10 +17,10 @@
 
 @reflectiveTest
 class OptionsIntegrationTest extends AbstractAnalysisServerIntegrationTest {
-  void optionsAnalysisSetup() {
+  Future<void> optionsAnalysisSetup() async {
     // Add an empty Dart file; required to trigger analysis (#35383).
     writeFile(sourcePath('test.dart'), '');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
   }
 
   Future<void> test_option_warning_optionFile() async {
@@ -31,7 +31,7 @@
     - camel_case_typo # :)
 ''');
 
-    optionsAnalysisSetup();
+    await optionsAnalysisSetup();
 
     await analysisFinished;
 
diff --git a/pkg/analysis_server/test/integration/analysis/error_test.dart b/pkg/analysis_server/test/integration/analysis/error_test.dart
index d209eee..445560e 100644
--- a/pkg/analysis_server/test/integration/analysis/error_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/error_test.dart
@@ -36,19 +36,19 @@
     expect(errors[0].location.file, equals(filePath));
   }
 
-  Future<void> test_detect_simple_error() {
+  Future<void> test_detect_simple_error() async {
     var pathname = sourcePath('test.dart');
     writeFile(pathname, '''
 void f() {
   print(null) // parse error: missing ';'
 }''');
-    standardAnalysisSetup();
-    return analysisFinished.then((_) {
-      expect(currentAnalysisErrors[pathname], isList);
-      var errors = existingErrorsForFile(pathname);
-      expect(errors, hasLength(1));
-      expect(errors[0].location.file, equals(pathname));
-    });
+    await standardAnalysisSetup();
+
+    await analysisFinished;
+    expect(currentAnalysisErrors[pathname], isList);
+    var errors = existingErrorsForFile(pathname);
+    expect(errors, hasLength(1));
+    expect(errors[0].location.file, equals(pathname));
   }
 
   @failingTest
@@ -77,7 +77,7 @@
     // ignore: deprecated_member_use_from_same_package
     await sendAnalysisUpdateOptions(
         AnalysisOptions()..enableSuperMixins = true);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
     expect(currentAnalysisErrors[pathname], isList);
     var errors = currentAnalysisErrors[pathname];
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_non_standard_sdk_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_non_standard_sdk_test.dart
index 455d2c5..2ba0d35 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_non_standard_sdk_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_non_standard_sdk_test.dart
@@ -126,7 +126,7 @@
 import 'dart:fake';
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
     var errors = existingErrorsForFile(pathname);
     expect(errors, hasLength(1));
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
index d47f008..6cd60fe 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
@@ -22,7 +22,7 @@
   var x // parse error: missing ';'
 }''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
     var result = await sendAnalysisGetErrors(pathname);
     expect(result.errors, equals(currentAnalysisErrors[pathname]));
diff --git a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
index ba5f9d6..793f921 100644
--- a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
@@ -133,7 +133,7 @@
 
   Future<void> test_getHover() async {
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     // Note: analysis.getHover doesn't wait for analysis to complete--it simply
     // returns the latest results that are available at the time that the
diff --git a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
index c53a0f4..9fa33a8 100644
--- a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
@@ -95,7 +95,7 @@
 void f() {}
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     await checkNoElements('f() {}');
@@ -112,7 +112,7 @@
 }
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     if (disableManageImportsOnPaste) {
diff --git a/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart b/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart
index caf757e..0cea1d5 100644
--- a/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart
@@ -28,7 +28,7 @@
 }
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var result = await sendAnalysisGetLibraryDependencies();
diff --git a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
index 1288adb..c9e1e5f 100644
--- a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
@@ -26,7 +26,7 @@
 }
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
 
@@ -53,7 +53,7 @@
 }
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
 
diff --git a/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart b/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
index 0073bde..e6230d7 100644
--- a/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
@@ -30,7 +30,7 @@
 }
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var result =
diff --git a/pkg/analysis_server/test/integration/analysis/highlights_test.dart b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
index 2f1fbd3..a7f7589 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
@@ -26,7 +26,7 @@
 
   Future<void> computeHighlights(String pathname, String text) async {
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
     sendAnalysisSetSubscriptions({
       AnalysisService.HIGHLIGHTS: [pathname]
diff --git a/pkg/analysis_server/test/integration/analysis/hint_sdk_version_async_exported_from_core_test.dart b/pkg/analysis_server/test/integration/analysis/hint_sdk_version_async_exported_from_core_test.dart
index f07d1ac..61cebef 100644
--- a/pkg/analysis_server/test/integration/analysis/hint_sdk_version_async_exported_from_core_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/hint_sdk_version_async_exported_from_core_test.dart
@@ -29,7 +29,7 @@
     writeFile(testPath, '''
 Future<int> zero() async => 0;
 ''');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     // There is a hint with this SDK version constraint.
     await analysisFinished;
diff --git a/pkg/analysis_server/test/integration/analysis/lint_test.dart b/pkg/analysis_server/test/integration/analysis/lint_test.dart
index a41d0f5..ada666d 100644
--- a/pkg/analysis_server/test/integration/analysis/lint_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/lint_test.dart
@@ -22,7 +22,7 @@
     writeFile(source, '''
 class abc { // lint: not CamelCase (should get ignored though)
 }''');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
     expect(currentAnalysisErrors[source], isList);
@@ -43,7 +43,7 @@
 class a { // lint: not CamelCase
 }''');
 
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
 
diff --git a/pkg/analysis_server/test/integration/analysis/navigation_test.dart b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
index 91a6e69..69d039e 100644
--- a/pkg/analysis_server/test/integration/analysis/navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
@@ -54,7 +54,7 @@
 part of foo;
 ''';
     writeFile(pathname2, text2);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     sendAnalysisSetSubscriptions({
       AnalysisService.NAVIGATION: [pathname1]
     });
diff --git a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
index ee237c4..e0006e8 100644
--- a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
@@ -30,7 +30,7 @@
 }
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     sendAnalysisSetSubscriptions({
       AnalysisService.OCCURRENCES: [pathname]
     });
diff --git a/pkg/analysis_server/test/integration/analysis/outline_test.dart b/pkg/analysis_server/test/integration/analysis/outline_test.dart
index df5a0ea..217013e 100644
--- a/pkg/analysis_server/test/integration/analysis/outline_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/outline_test.dart
@@ -41,7 +41,7 @@
 }
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     sendAnalysisSetSubscriptions({
       AnalysisService.OUTLINE: [pathname]
     });
diff --git a/pkg/analysis_server/test/integration/analysis/overrides_test.dart b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
index 0358bb4..7099c52 100644
--- a/pkg/analysis_server/test/integration/analysis/overrides_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
@@ -52,7 +52,7 @@
 }
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     sendAnalysisSetSubscriptions({
       AnalysisService.OVERRIDES: [pathname]
     });
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
index d28f9e0..339862a 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
@@ -20,7 +20,7 @@
 @reflectiveTest
 class ReanalyzeTest extends AbstractAnalysisServerIntegrationTest {
   @TestTimeout(Timeout.factor(2))
-  Future<void> test_reanalyze_concurrent() {
+  Future<void> test_reanalyze_concurrent() async {
     var pathname = sourcePath('test.dart');
     var text = '''
 // Do a bunch of imports so that analysis has some work to do.
@@ -30,18 +30,19 @@
 
 void f() {}''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
-    return analysisFinished.then((_) {
-      sendAnalysisReanalyze();
-      // Wait for reanalysis to start.
-      return onServerStatus.first.then((_) {
-        sendAnalysisReanalyze();
-        return analysisFinished.then((_) {
-          // Now that reanalysis has finished, give the server an extra second
-          // to make sure it doesn't crash.
-          return Future.delayed(Duration(seconds: 1));
-        });
-      });
-    });
+    await standardAnalysisSetup();
+
+    await analysisFinished;
+    await sendAnalysisReanalyze();
+
+    // Wait for reanalysis to start.
+    await onServerStatus.first;
+
+    await sendAnalysisReanalyze();
+    await analysisFinished;
+
+    // Now that reanalysis has finished, give the server an extra second
+    // to make sure it doesn't crash.
+    await Future.delayed(Duration(seconds: 1));
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
index 49e4bf5..cc15622 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
@@ -16,24 +16,24 @@
 
 @reflectiveTest
 class ReanalyzeTest extends AbstractAnalysisServerIntegrationTest {
-  Future<void> test_reanalyze() {
+  Future<void> test_reanalyze() async {
     var pathname = sourcePath('test.dart');
     var text = 'void f() {}';
     writeFile(pathname, text);
-    standardAnalysisSetup();
-    return analysisFinished.then((_) {
-      // Make sure that reanalyze causes analysis to restart.
-      var analysisRestarted = false;
-      onServerStatus.listen((ServerStatusParams data) {
-        var analysisStatus = data.analysis;
-        if (analysisStatus != null && analysisStatus.isAnalyzing) {
-          analysisRestarted = true;
-        }
-      });
-      sendAnalysisReanalyze();
-      return analysisFinished.then((_) {
-        expect(analysisRestarted, isTrue);
-      });
+    await standardAnalysisSetup();
+    await analysisFinished;
+
+    // Make sure that reanalyze causes analysis to restart.
+    var analysisRestarted = false;
+    onServerStatus.listen((ServerStatusParams data) {
+      var analysisStatus = data.analysis;
+      if (analysisStatus != null && analysisStatus.isAnalyzing) {
+        analysisRestarted = true;
+      }
     });
+
+    await sendAnalysisReanalyze();
+    await analysisFinished;
+    expect(analysisRestarted, isTrue);
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
index c8b991d..1b7257a 100644
--- a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
@@ -24,7 +24,7 @@
 ''');
 
     // Calling this will call analysis.setAnalysisRoots.
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
     expect(currentAnalysisErrors[pathname], isEmpty);
diff --git a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
index 18cc929..3467e8b 100644
--- a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
@@ -26,7 +26,7 @@
 }
 ''');
 
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await sendAnalysisSetGeneralSubscriptions(
         [GeneralAnalysisService.ANALYZED_FILES]);
diff --git a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
index bc7b3e4..bf030cd 100644
--- a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
@@ -20,7 +20,7 @@
     writeFile(pathname, 'class Foo { void baz() {} }');
     writeFile(sourcePath('bar.dart'), 'class Bar { void baz() {} }');
 
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await sendAnalysisSetPriorityFiles([pathname]);
 
     var status = await analysisFinished;
diff --git a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
index d9d22d0..7ed22d0 100644
--- a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
@@ -24,7 +24,7 @@
 ''');
 
     // Calling this will subscribe to ServerService.STATUS.
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
     expect(currentAnalysisErrors[pathname], isEmpty);
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
index 344c4c0..b41a1df 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
@@ -16,7 +16,7 @@
 
 @reflectiveTest
 class UpdateContentTest extends AbstractAnalysisServerIntegrationTest {
-  Future<void> test_updateContent_list() {
+  Future<void> test_updateContent_list() async {
     var pathname = sourcePath('test.dart');
     var goodText = r'''
 void f() {
@@ -26,27 +26,24 @@
     var badText = goodText.replaceAll('"', '');
     // Create a dummy file
     writeFile(pathname, '// dummy text');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     // Override file contents with badText.
-    sendAnalysisUpdateContent({pathname: AddContentOverlay(badText)});
-    return analysisFinished.then((_) {
-      // The overridden contents (badText) are missing quotation marks.
-      expect(currentAnalysisErrors[pathname], isNotEmpty);
-    }).then((_) {
-      // Prepare a set of edits which add the missing quotation marks, in the
-      // order in which they appear in the file.  If these edits are applied in
-      // the wrong order, some of the quotation marks will be in the wrong
-      // places, and there will still be errors.
-      var edits = '"'
-          .allMatches(goodText)
-          .map((Match match) => SourceEdit(match.start, 0, '"'))
-          .toList();
-      sendAnalysisUpdateContent({pathname: ChangeContentOverlay(edits)});
-      return analysisFinished;
-    }).then((_) {
-      // There should be no errors now, assuming that quotation marks have been
-      // inserted in all the correct places.
-      expect(currentAnalysisErrors[pathname], isEmpty);
-    });
+    await sendAnalysisUpdateContent({pathname: AddContentOverlay(badText)});
+    await analysisFinished;
+    // The overridden contents (badText) are missing quotation marks.
+    expect(currentAnalysisErrors[pathname], isNotEmpty);
+    // Prepare a set of edits which add the missing quotation marks, in the
+    // order in which they appear in the file.  If these edits are applied in
+    // the wrong order, some of the quotation marks will be in the wrong
+    // places, and there will still be errors.
+    var edits = '"'
+        .allMatches(goodText)
+        .map((Match match) => SourceEdit(match.start, 0, '"'))
+        .toList();
+    await sendAnalysisUpdateContent({pathname: ChangeContentOverlay(edits)});
+    await analysisFinished;
+    // There should be no errors now, assuming that quotation marks have been
+    // inserted in all the correct places.
+    expect(currentAnalysisErrors[pathname], isEmpty);
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
index 414ea26..7fcbcca 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -25,7 +25,7 @@
 
     var badText = goodText.replaceAll(';', '');
     writeFile(path, badText);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     // The contents on disk (badText) are missing a semicolon.
     await analysisFinished;
@@ -73,7 +73,7 @@
   print(p);
 }
 ''');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
     expect(currentAnalysisErrors[pathname], isList);
     var errors1 = existingErrorsForFile(pathname);
diff --git a/pkg/analysis_server/test/integration/analysis/update_options_test.dart b/pkg/analysis_server/test/integration/analysis/update_options_test.dart
index 4864f2c..1821232 100644
--- a/pkg/analysis_server/test/integration/analysis/update_options_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_options_test.dart
@@ -28,7 +28,7 @@
   void bar() {}
 }
 ''');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     // ignore: deprecated_member_use_from_same_package
     await sendAnalysisUpdateOptions(AnalysisOptions()..generateHints = false);
diff --git a/pkg/analysis_server/test/integration/analytics/enable_test.dart b/pkg/analysis_server/test/integration/analytics/enable_test.dart
index 780810e..52a17cd 100644
--- a/pkg/analysis_server/test/integration/analytics/enable_test.dart
+++ b/pkg/analysis_server/test/integration/analytics/enable_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class EnableTest extends AbstractAnalysisServerIntegrationTest {
   Future<void> test_call_enable() async {
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     // Toggle the value twice; do light verification of the changes, as the
     // analysis server - when running on our CI bots - deliberately does not
diff --git a/pkg/analysis_server/test/integration/analytics/is_enabled_test.dart b/pkg/analysis_server/test/integration/analytics/is_enabled_test.dart
index 0f86bfe..222a52b 100644
--- a/pkg/analysis_server/test/integration/analytics/is_enabled_test.dart
+++ b/pkg/analysis_server/test/integration/analytics/is_enabled_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class IsEnabledTest extends AbstractAnalysisServerIntegrationTest {
   Future<void> test_isEnabled() async {
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     var result = await sendAnalyticsIsEnabled();
     // Very lightweight validation of the returned data.
diff --git a/pkg/analysis_server/test/integration/analytics/send_event_test.dart b/pkg/analysis_server/test/integration/analytics/send_event_test.dart
index 5f5aefe..292d7d9 100644
--- a/pkg/analysis_server/test/integration/analytics/send_event_test.dart
+++ b/pkg/analysis_server/test/integration/analytics/send_event_test.dart
@@ -15,7 +15,7 @@
 @reflectiveTest
 class SendEventTest extends AbstractAnalysisServerIntegrationTest {
   Future<void> test_send_event() async {
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     // Disable analytics.
     var result1 = await sendAnalyticsIsEnabled();
diff --git a/pkg/analysis_server/test/integration/analytics/send_timing_test.dart b/pkg/analysis_server/test/integration/analytics/send_timing_test.dart
index 8e74028..7ff18f8 100644
--- a/pkg/analysis_server/test/integration/analytics/send_timing_test.dart
+++ b/pkg/analysis_server/test/integration/analytics/send_timing_test.dart
@@ -15,7 +15,7 @@
 @reflectiveTest
 class SendTimingTest extends AbstractAnalysisServerIntegrationTest {
   Future<void> test_send_timing() async {
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     // Disable analytics.
     var result1 = await sendAnalyticsIsEnabled();
diff --git a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
index 8e1ac58..c606f27 100644
--- a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
+++ b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
@@ -90,7 +90,7 @@
   test.^
 }
 ''');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
     // Create an overlay but do not write the file to "disk"
     //   writeFile(pathname, text);
@@ -110,7 +110,7 @@
     // Do not write the file to "disk"
     //   writeFile(pathname, text);
     // Don't wait for any results except the completion notifications
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
     // Missing file and no overlay
     //sendAnalysisUpdateContent({path: new AddContentOverlay(content)});
diff --git a/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart b/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart
index 0081707..79cf5e9 100644
--- a/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart
+++ b/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class GetDiagnosticsTest extends AbstractAnalysisServerIntegrationTest {
   Future<void> test_getDiagnostics() async {
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var result = await sendDiagnosticGetDiagnostics();
diff --git a/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart b/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart
index 42541e2..cb65c5a 100644
--- a/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart
+++ b/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart
@@ -19,7 +19,7 @@
 @reflectiveTest
 class GetServerPortTest extends AbstractAnalysisServerIntegrationTest {
   Future<void> test_connect() async {
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     var result = await sendDiagnosticGetServerPort();
     expect(result.port, isNotNull);
diff --git a/pkg/analysis_server/test/integration/edit/bulk_fixes_test.dart b/pkg/analysis_server/test/integration/edit/bulk_fixes_test.dart
index 5cdb5ea..2bb0462 100644
--- a/pkg/analysis_server/test/integration/edit/bulk_fixes_test.dart
+++ b/pkg/analysis_server/test/integration/edit/bulk_fixes_test.dart
@@ -16,7 +16,7 @@
 
 @reflectiveTest
 class BulkFixesTest extends AbstractAnalysisServerIntegrationTest {
-  void setupTarget() {
+  Future<void> setupTarget() async {
     writeFile(sourcePath('test.dart'), '''
 class A {
   void f() {}
@@ -25,7 +25,7 @@
   void f() { }
 }
 ''');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
   }
 
   Future<void> test_bulk_fix_override() async {
@@ -42,7 +42,7 @@
   void f() { }
 }
 ''');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var result = await sendEditBulkFixes([sourceDirectory.path]);
diff --git a/pkg/analysis_server/test/integration/edit/format_test.dart b/pkg/analysis_server/test/integration/edit/format_test.dart
index 081d9fc..64075ce 100644
--- a/pkg/analysis_server/test/integration/edit/format_test.dart
+++ b/pkg/analysis_server/test/integration/edit/format_test.dart
@@ -15,7 +15,7 @@
 
 @reflectiveTest
 class FormatTest extends AbstractAnalysisServerIntegrationTest {
-  String formatTestSetup({bool withErrors = false}) {
+  Future<String> formatTestSetup({bool withErrors = false}) async {
     var pathname = sourcePath('test.dart');
 
     if (withErrors) {
@@ -41,12 +41,12 @@
 ''';
       writeFile(pathname, text);
     }
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     return pathname;
   }
 
   Future<void> test_format() async {
-    var pathname = formatTestSetup();
+    var pathname = await formatTestSetup();
 
     var result = await sendEditFormat(pathname, 0, 0);
     expect(result.edits, isNotEmpty);
@@ -55,7 +55,7 @@
   }
 
   Future<void> test_format_preserve_selection() async {
-    var pathname = formatTestSetup();
+    var pathname = await formatTestSetup();
 
     // format with 'bar' selected
     var initialPosition = readFile(pathname).indexOf('bar()');
@@ -66,7 +66,7 @@
   }
 
   Future<void> test_format_with_errors() async {
-    var pathname = formatTestSetup(withErrors: true);
+    var pathname = await formatTestSetup(withErrors: true);
 
     try {
       await sendEditFormat(pathname, 0, 0);
diff --git a/pkg/analysis_server/test/integration/edit/get_assists_test.dart b/pkg/analysis_server/test/integration/edit/get_assists_test.dart
index 015a385..bf3dc7a 100644
--- a/pkg/analysis_server/test/integration/edit/get_assists_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_assists_test.dart
@@ -24,7 +24,7 @@
 var c = Completer();
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
     expect(currentAnalysisErrors[pathname], isEmpty);
diff --git a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
index 79b7389..7706cef 100644
--- a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
@@ -22,7 +22,7 @@
 void foo() { }
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
     expect(currentAnalysisErrors[pathname], isEmpty);
diff --git a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
index 1c7c608..f12763b 100644
--- a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
@@ -22,7 +22,7 @@
 FutureOr f;
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
     expect(currentAnalysisErrors[pathname], isNotEmpty);
@@ -50,7 +50,7 @@
 FutureOr f;
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var result = await sendEditGetFixes(pathname, text.indexOf('FutureOr f'));
diff --git a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
index db032ec..74e6664 100644
--- a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
@@ -28,7 +28,7 @@
     var loc = text.indexOf('.tryon');
     text = text.replaceAll('.tryon', '');
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
     expect(currentAnalysisErrors[pathname], isEmpty);
diff --git a/pkg/analysis_server/test/integration/edit/get_refactoring_test.dart b/pkg/analysis_server/test/integration/edit/get_refactoring_test.dart
index 6896e4b..9ffd893 100644
--- a/pkg/analysis_server/test/integration/edit/get_refactoring_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_refactoring_test.dart
@@ -28,7 +28,7 @@
 }
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
     expect(currentAnalysisErrors[pathname], isEmpty);
diff --git a/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart b/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart
index 5c3ce3e..f535fbe 100644
--- a/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart
@@ -23,7 +23,7 @@
 void bar() { foo() } // missing semi-colon
 void foo() { }''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
     expect(currentAnalysisErrors[pathname], isNotEmpty);
diff --git a/pkg/analysis_server/test/integration/edit/import_elements_test.dart b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
index e54e426..e6f612a 100644
--- a/pkg/analysis_server/test/integration/edit/import_elements_test.dart
+++ b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
@@ -79,7 +79,7 @@
 
   Future<void> test_importElements_definingUnit() async {
     writeFile(pathname, 'void f() {}');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
     var provider = PhysicalResourceProvider.INSTANCE;
     var sdkPath = getSdkPath();
@@ -95,7 +95,7 @@
 
   Future<void> test_importElements_noEdits() async {
     writeFile(pathname, '');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     await checkNoEdits(<ImportedElements>[]);
@@ -112,7 +112,7 @@
 
 class C {}
 ''');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
     var provider = PhysicalResourceProvider.INSTANCE;
     var sdkPath = getSdkPath();
diff --git a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
index af423d1..3bb3ba9 100644
--- a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
+++ b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
@@ -27,7 +27,7 @@
     var loc = text.indexOf('.tryon');
     text = text.replaceAll('.tryon', '');
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
     expect(currentAnalysisErrors[pathname], isEmpty);
diff --git a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
index 21f950d..e92bc41 100644
--- a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
+++ b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
@@ -27,7 +27,7 @@
 ''';
     text = text.replaceAll('.tryon', '');
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
 
diff --git a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
index deeeb37..552e7a3 100644
--- a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
@@ -25,7 +25,7 @@
 int minified(int x, int y) => min(x, y);
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var result = await sendEditOrganizeDirectives(pathname);
@@ -45,7 +45,7 @@
 int minified(int x, int y) => min(x, y);
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var result = await sendEditOrganizeDirectives(pathname);
@@ -63,7 +63,7 @@
 int minified(int x, int y) => min(x, y);
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     try {
diff --git a/pkg/analysis_server/test/integration/edit/sort_members_test.dart b/pkg/analysis_server/test/integration/edit/sort_members_test.dart
index 25ba753..5e411f3 100644
--- a/pkg/analysis_server/test/integration/edit/sort_members_test.dart
+++ b/pkg/analysis_server/test/integration/edit/sort_members_test.dart
@@ -22,7 +22,7 @@
 int bar;
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var result = await sendEditSortMembers(pathname);
@@ -38,7 +38,7 @@
 int foo;
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var result = await sendEditSortMembers(pathname);
@@ -53,7 +53,7 @@
 int bar;
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     try {
diff --git a/pkg/analysis_server/test/integration/execution/create_context_test.dart b/pkg/analysis_server/test/integration/execution/create_context_test.dart
index 563e405..66c3215 100644
--- a/pkg/analysis_server/test/integration/execution/create_context_test.dart
+++ b/pkg/analysis_server/test/integration/execution/create_context_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class CreateContextTest extends AbstractAnalysisServerIntegrationTest {
   Future<void> test_create() async {
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     var contextId = (await sendExecutionCreateContext(sourceDirectory.path)).id;
     expect(contextId, isNotNull);
   }
diff --git a/pkg/analysis_server/test/integration/execution/delete_context_test.dart b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
index 609902d..138cdaf 100644
--- a/pkg/analysis_server/test/integration/execution/delete_context_test.dart
+++ b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
@@ -18,7 +18,7 @@
   Future<void> test_delete() async {
     var pathname = sourcePath('lib/main.dart');
     writeFile(pathname, '// dummy');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var contextId = (await sendExecutionCreateContext(sourceDirectory.path)).id;
diff --git a/pkg/analysis_server/test/integration/execution/map_uri_test.dart b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
index 4538798..509089b 100644
--- a/pkg/analysis_server/test/integration/execution/map_uri_test.dart
+++ b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
@@ -18,7 +18,7 @@
   Future<void> test_mapUri() async {
     var pathname = sourcePath('lib/main.dart');
     writeFile(pathname, '// dummy');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var contextId = (await sendExecutionCreateContext(sourceDirectory.path)).id;
diff --git a/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart
index 340ded4..f9a786b 100644
--- a/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class SetSubscriptionsTest extends AbstractAnalysisServerIntegrationTest {
   Future<void> test_subscribe() async {
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     // ignore: deprecated_member_use_from_same_package
     await sendExecutionSetSubscriptions([ExecutionService.LAUNCH_DATA]);
   }
diff --git a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
index 00719b3..23033ee 100644
--- a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
+++ b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
@@ -26,7 +26,7 @@
 }
 ''';
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await analysisFinished;
 
diff --git a/pkg/analysis_server/test/integration/search/find_element_references_test.dart b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
index 2fd85a7..647b99a 100644
--- a/pkg/analysis_server/test/integration/search/find_element_references_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
@@ -29,7 +29,7 @@
 
     pathname = sourcePath('foo.dart');
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var results = await _findElementReferences(text);
@@ -47,7 +47,7 @@
 
     pathname = sourcePath('foo.dart');
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var results = (await _findElementReferences(text))!;
diff --git a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
index f8f65cf..fa78aea 100644
--- a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
@@ -28,7 +28,7 @@
 
     var pathname = sourcePath('foo.dart');
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var declarationsResult = await sendSearchFindMemberDeclarations('bar');
diff --git a/pkg/analysis_server/test/integration/search/find_member_references_test.dart b/pkg/analysis_server/test/integration/search/find_member_references_test.dart
index 176a205..3f91865 100644
--- a/pkg/analysis_server/test/integration/search/find_member_references_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_member_references_test.dart
@@ -28,7 +28,7 @@
 
     var pathname = sourcePath('foo.dart');
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var referencesResult = await sendSearchFindMemberReferences('bar');
diff --git a/pkg/analysis_server/test/integration/search/find_top_level_declarations_test.dart b/pkg/analysis_server/test/integration/search/find_top_level_declarations_test.dart
index 4ea563b..191c730 100644
--- a/pkg/analysis_server/test/integration/search/find_top_level_declarations_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_top_level_declarations_test.dart
@@ -29,7 +29,7 @@
 
     var pathname = sourcePath('foo.dart');
     writeFile(pathname, text);
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
     await analysisFinished;
 
     var declarationsResult = await sendSearchFindTopLevelDeclarations(r'qu.*');
diff --git a/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart b/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
index 92bbda8..5bde20d 100644
--- a/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
+++ b/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
@@ -193,7 +193,7 @@
     // Write a dummy file which will be overridden by tests using
     // [sendAnalysisUpdateContent].
     writeFile(pathname, '// dummy');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     // Run all the getTypeHierarchy tests at once so that the server can take
     // advantage of incremental analysis and the test doesn't time out.
diff --git a/pkg/analysis_server/test/integration/server/bazel_changes_test.dart b/pkg/analysis_server/test/integration/server/bazel_changes_test.dart
index 903297e..9767c8f 100644
--- a/pkg/analysis_server/test/integration/server/bazel_changes_test.dart
+++ b/pkg/analysis_server/test/integration/server/bazel_changes_test.dart
@@ -123,7 +123,7 @@
 import 'generated.dart';
 void f() { my_fun(); }
 ''');
-    standardAnalysisSetup();
+    await standardAnalysisSetup();
 
     await processedNotification.future;
     expect(errors, isNotEmpty);
diff --git a/pkg/analysis_server/test/integration/server/command_line_options_test.dart b/pkg/analysis_server/test/integration/server/command_line_options_test.dart
index ba051a3..a42c6bb 100644
--- a/pkg/analysis_server/test/integration/server/command_line_options_test.dart
+++ b/pkg/analysis_server/test/integration/server/command_line_options_test.dart
@@ -50,7 +50,7 @@
     );
   }
 
-  Future<void> test_it() {
+  Future<void> test_it() async {
     var pathname = sourcePath('test.dart');
     writeFile(pathname, '''
 import 'package:foo/foo.dart';
@@ -58,10 +58,10 @@
   my_foo;
 }
 ''');
-    standardAnalysisSetup();
-    return analysisFinished.then((_) {
-      var errors = existingErrorsForFile(pathname);
-      expect(errors, isEmpty);
-    });
+    await standardAnalysisSetup();
+    await analysisFinished;
+
+    var errors = existingErrorsForFile(pathname);
+    expect(errors, isEmpty);
   }
 }
diff --git a/pkg/analysis_server/test/integration/server/status_test.dart b/pkg/analysis_server/test/integration/server/status_test.dart
index bdae4e3..bdb1df8 100644
--- a/pkg/analysis_server/test/integration/server/status_test.dart
+++ b/pkg/analysis_server/test/integration/server/status_test.dart
@@ -40,7 +40,7 @@
 void f() {
   var x;
 }''');
-    standardAnalysisSetup();
+    unawaited(standardAnalysisSetup());
     expect(analysisBegun.isCompleted, isFalse);
     expect(analysisFinished.isCompleted, isFalse);
     await analysisBegun.future;
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 6f64355..22fae35 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -504,6 +504,47 @@
   InterfaceType get returnType;
 }
 
+/// Meaning of a URI referenced in a directive.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DirectiveUri {}
+
+/// [DirectiveUriWithSource] that references a [LibraryElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DirectiveUriWithLibrary extends DirectiveUriWithSource {
+  LibraryElement get library;
+}
+
+/// [DirectiveUriWithRelativeUriString] that can be parsed into a relative URI.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DirectiveUriWithRelativeUri
+    extends DirectiveUriWithRelativeUriString {
+  Uri get relativeUri;
+}
+
+/// [DirectiveUri] for which we can get its relative URI string.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DirectiveUriWithRelativeUriString extends DirectiveUri {
+  String get relativeUriString;
+}
+
+/// [DirectiveUriWithRelativeUri] that resolves to a [Source].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DirectiveUriWithSource extends DirectiveUriWithRelativeUri {
+  Source get source;
+}
+
+/// [DirectiveUriWithSource] that references a [CompilationUnitElement].
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DirectiveUriWithUnit extends DirectiveUriWithSource {
+  CompilationUnitElement get unit;
+}
+
 /// The base class for all of the elements in the element model. Generally
 /// speaking, the element model is a semantic model of the program that
 /// represents things that are declared with a name and hence can be referenced
@@ -1668,25 +1709,9 @@
 /// A 'part' directive within a library.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class PartElement implements _ExistingElement {}
-
-/// [PartElementWithSource] that represents a valid part of this library.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PartElementWithPart implements PartElementWithSource {
-  /// The part [CompilationUnitElement] referenced by [uriSource].
-  CompilationUnitElement get includedUnit;
-}
-
-/// [PartElement] with a relative URI that resolves to a [Source].
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class PartElementWithSource implements PartElement {
-  /// The string value of the URI.
-  String get relativeUriString;
-
-  /// The source to which [relativeUriString] resolves.
-  Source get uriSource;
+abstract class PartElement implements _ExistingElement {
+  /// The interpretation of the URI specified in the directive.
+  DirectiveUri get uri;
 }
 
 /// A prefix used to import one or more libraries into another library.
diff --git a/pkg/analyzer/lib/dart/element/visitor.dart b/pkg/analyzer/lib/dart/element/visitor.dart
index 3e64e10..86e4839 100644
--- a/pkg/analyzer/lib/dart/element/visitor.dart
+++ b/pkg/analyzer/lib/dart/element/visitor.dart
@@ -431,12 +431,7 @@
   R? visitParameterElement(ParameterElement element) => null;
 
   @override
-  R? visitPartElement(PartElement element) {
-    if (element is PartElementWithPart) {
-      visitCompilationUnitElement(element.includedUnit);
-    }
-    return null;
-  }
+  R? visitPartElement(PartElement element) => null;
 
   @override
   R? visitPrefixElement(PrefixElement element) => null;
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index b692981..a55028c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -85,7 +85,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 = 228;
+  static const int DATA_VERSION = 229;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index f2d1e98..4675824 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -136,7 +136,7 @@
 }
 
 /// [DirectiveUriWithUri] with URI that resolves to a [FileState].
-class DirectiveUriWithFile extends DirectiveUriWithUri {
+class DirectiveUriWithFile extends DirectiveUriWithSource {
   final FileState file;
 
   DirectiveUriWithFile({
@@ -146,14 +146,14 @@
   });
 
   @override
-  Source? get source => file.source;
+  Source get source => file.source;
 
   @override
   String toString() => '$file';
 }
 
-/// [DirectiveUriWithUri] with URI that resolves to a [InSummarySource].
-class DirectiveUriWithInSummarySource extends DirectiveUriWithUri {
+/// [DirectiveUriWithSource] with a [InSummarySource].
+class DirectiveUriWithInSummarySource extends DirectiveUriWithSource {
   @override
   final InSummarySource source;
 
@@ -167,6 +167,20 @@
   String toString() => '$source';
 }
 
+/// [DirectiveUriWithUri] that can be resolved into a [Source].
+abstract class DirectiveUriWithSource extends DirectiveUriWithUri {
+  DirectiveUriWithSource({
+    required super.relativeUriStr,
+    required super.relativeUri,
+  });
+
+  @override
+  Source get source;
+
+  @override
+  String toString() => '$source';
+}
+
 /// [DirectiveUri] for which we can get its relative URI string.
 class DirectiveUriWithString extends DirectiveUri {
   final String relativeUriStr;
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 8d74735..1a47eb1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -794,8 +794,11 @@
   @override
   void visitPartDirective(PartDirective node) {
     final partElement = node.element;
-    if (partElement is PartElementWithPart) {
-      recordUriReference(partElement.includedUnit, node.uri);
+    if (partElement is PartElement) {
+      final partElementUri = partElement.uri;
+      if (partElementUri is DirectiveUriWithUnit) {
+        recordUriReference(partElementUri.unit, node.uri);
+      }
     }
     super.visitPartDirective(node);
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 1e61c76..2fc3001 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/file_state.dart' as file_state;
 import 'package:analyzer/src/dart/analysis/testing_data.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
@@ -772,10 +773,10 @@
   void _resolveNamespaceDirective({
     required NamespaceDirectiveImpl directive,
     required StringLiteralImpl primaryUriNode,
-    required DirectiveUri primaryUriState,
-    required DirectiveUri selectedUriState,
+    required file_state.DirectiveUri primaryUriState,
+    required file_state.DirectiveUri selectedUriState,
     required List<Configuration> configurationNodes,
-    required List<DirectiveUri> configurationUris,
+    required List<file_state.DirectiveUri> configurationUris,
   }) {
     for (var i = 0; i < configurationNodes.length; i++) {
       final configurationNode = configurationNodes[i];
@@ -882,10 +883,10 @@
       return;
     }
 
-    // TODO(scheglov) Unsafe.
     var partUnit = units[includedFile]!;
-    if (partElement is PartElementWithPart) {
-      partUnit.element = partElement.includedUnit;
+    final partElementUri = partElement.uri;
+    if (partElementUri is DirectiveUriWithUnit) {
+      partUnit.element = partElementUri.unit;
     }
 
     final partSource = includedKind.file.source;
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index d56a2cb..60e5845 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -8779,8 +8779,9 @@
   @override
   CompilationUnitElement? get uriElement {
     final partElement = element as PartElement?;
-    if (partElement is PartElementWithPart) {
-      return partElement.includedUnit;
+    final partElementUri = partElement?.uri;
+    if (partElementUri is DirectiveUriWithUnit) {
+      return partElementUri.unit;
     }
     return null;
   }
diff --git a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
index 17553e0..e9ff526 100644
--- a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
@@ -164,10 +164,12 @@
 
   void writePartElement(PartElementImpl element) {
     _write('part ');
-    if (element is PartElementWithPartImpl) {
-      _write('unit ${element.includedUnit.source.uri}');
-    } else if (element is PartElementWithSourceImpl) {
-      _write('uriSource ${element.uriSource}');
+
+    final uri = element.uri;
+    if (uri is DirectiveUriWithUnitImpl) {
+      _write('unit ${uri.unit.source.uri}');
+    } else if (uri is DirectiveUriWithSourceImpl) {
+      _write('source ${uri.source}');
     } else {
       _write('<unknown>');
     }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 41d1897..8d2924b8 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1662,6 +1662,72 @@
   }
 }
 
+class DirectiveUriImpl implements DirectiveUri {}
+
+class DirectiveUriWithLibraryImpl extends DirectiveUriWithRelativeUriImpl
+    implements DirectiveUriWithLibrary {
+  @override
+  final LibraryElementImpl library;
+
+  DirectiveUriWithLibraryImpl({
+    required super.relativeUriString,
+    required super.relativeUri,
+    required this.library,
+  });
+
+  @override
+  Source get source => library.source;
+}
+
+class DirectiveUriWithRelativeUriImpl
+    extends DirectiveUriWithRelativeUriStringImpl
+    implements DirectiveUriWithRelativeUri {
+  @override
+  final Uri relativeUri;
+
+  DirectiveUriWithRelativeUriImpl({
+    required super.relativeUriString,
+    required this.relativeUri,
+  });
+}
+
+class DirectiveUriWithRelativeUriStringImpl
+    implements DirectiveUriWithRelativeUriString {
+  @override
+  final String relativeUriString;
+
+  DirectiveUriWithRelativeUriStringImpl({
+    required this.relativeUriString,
+  });
+}
+
+class DirectiveUriWithSourceImpl extends DirectiveUriWithRelativeUriImpl
+    implements DirectiveUriWithSource {
+  @override
+  final Source source;
+
+  DirectiveUriWithSourceImpl({
+    required super.relativeUriString,
+    required super.relativeUri,
+    required this.source,
+  });
+}
+
+class DirectiveUriWithUnitImpl extends DirectiveUriWithRelativeUriImpl
+    implements DirectiveUriWithUnit {
+  @override
+  final CompilationUnitElementImpl unit;
+
+  DirectiveUriWithUnitImpl({
+    required super.relativeUriString,
+    required super.relativeUri,
+    required this.unit,
+  });
+
+  @override
+  Source get source => unit.source;
+}
+
 /// The synthetic element representing the declaration of the type `dynamic`.
 class DynamicElementImpl extends ElementImpl implements TypeDefiningElement {
   /// Return the unique instance of this class.
@@ -3932,10 +3998,7 @@
   @Deprecated('Use parts2 instead')
   @override
   List<CompilationUnitElement> get parts {
-    return _parts2
-        .whereType<PartElementWithPart>()
-        .map((partElement) => partElement.includedUnit)
-        .toList();
+    return _partUnits;
   }
 
   @override
@@ -3945,8 +4008,9 @@
     for (final part in parts) {
       part as PartElementImpl;
       part.enclosingElement = this;
-      if (part is PartElementWithPartImpl) {
-        part.includedUnit.enclosingElement = this;
+      final uri = part.uri;
+      if (uri is DirectiveUriWithUnitImpl) {
+        uri.unit.enclosingElement = this;
       }
     }
     _parts2 = parts;
@@ -3994,10 +4058,18 @@
   List<CompilationUnitElement> get units {
     return [
       _definingCompilationUnit,
-      ...parts2.whereType<PartElementWithPart>().map((e) => e.includedUnit),
+      ..._partUnits,
     ];
   }
 
+  List<CompilationUnitElement> get _partUnits {
+    return parts2
+        .map((e) => e.uri)
+        .whereType<DirectiveUriWithUnit>()
+        .map((e) => e.unit)
+        .toList();
+  }
+
   @override
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitLibraryElement(this);
 
@@ -4071,9 +4143,10 @@
 
     if (prefix == null && name.startsWith(r'_$')) {
       for (var partElement in parts2) {
-        if (partElement is PartElementWithSource &&
-            partElement is! PartElementWithPart &&
-            file_paths.isGenerated(partElement.relativeUriString)) {
+        final uri = partElement.uri;
+        if (uri is DirectiveUriWithSource &&
+            uri is! DirectiveUriWithUnit &&
+            file_paths.isGenerated(uri.relativeUriString)) {
           return true;
         }
       }
@@ -4114,6 +4187,9 @@
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(parts2, visitor);
+    for (final partUnit in _partUnits) {
+      partUnit.accept(visitor);
+    }
   }
 
   static List<PrefixElement> buildPrefixesFromImports(
@@ -5102,7 +5178,12 @@
 }
 
 class PartElementImpl extends _ExistingElementImpl implements PartElement {
-  PartElementImpl() : super(null, -1);
+  @override
+  final DirectiveUri uri;
+
+  PartElementImpl({
+    required this.uri,
+  }) : super(null, -1);
 
   @override
   CompilationUnitElementImpl get enclosingUnit {
@@ -5125,37 +5206,6 @@
   }
 }
 
-class PartElementWithPartImpl extends PartElementWithSourceImpl
-    implements PartElementWithPart {
-  @override
-  final CompilationUnitElementImpl includedUnit;
-
-  PartElementWithPartImpl({
-    required super.relativeUriString,
-    required super.uriSource,
-    required this.includedUnit,
-  });
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    includedUnit.accept(visitor);
-  }
-}
-
-class PartElementWithSourceImpl extends PartElementImpl
-    implements PartElementWithSource {
-  @override
-  final String relativeUriString;
-
-  @override
-  final Source uriSource;
-
-  PartElementWithSourceImpl({
-    required this.relativeUriString,
-    required this.uriSource,
-  });
-}
-
 /// A concrete implementation of a [PrefixElement].
 class PrefixElementImpl extends _ExistingElementImpl implements PrefixElement {
   /// The scope of this prefix, `null` if it has not been created yet.
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart b/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart
index e81a7dc..83c6aea 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart
@@ -7,9 +7,12 @@
   static const int genericFunctionElement = 1;
 }
 
-enum PartElementKind {
-  withPart,
+enum DirectiveUriKind {
+  withLibrary,
+  withUnit,
   withSource,
+  withRelativeUri,
+  withRelativeUriString,
   withNothing,
 }
 
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index b8a91b6..aa14833f 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -432,7 +432,6 @@
   LibraryElementImpl readElement({required Source librarySource}) {
     var analysisContext = _elementFactory.analysisContext;
     var analysisSession = _elementFactory.analysisSession;
-    var sourceFactory = analysisContext.sourceFactory;
 
     _reader.offset = _offset;
     var resolutionOffset = _baseResolutionOffset + _reader.readUInt30();
@@ -453,7 +452,6 @@
     var unitContainerRef = _reference.getChild('@unit');
 
     libraryElement.definingCompilationUnit = _readUnitElement(
-      sourceFactory: sourceFactory,
       unitContainerRef: unitContainerRef,
       libraryElement: libraryElement,
       librarySource: librarySource,
@@ -582,6 +580,73 @@
     });
   }
 
+  DirectiveUri _readDirectiveUri({
+    required Reference unitContainerRef,
+    required LibraryElementImpl libraryElement,
+  }) {
+    DirectiveUriWithRelativeUriStringImpl readWithRelativeUriString() {
+      final relativeUriString = _reader.readStringReference();
+      return DirectiveUriWithRelativeUriStringImpl(
+        relativeUriString: relativeUriString,
+      );
+    }
+
+    DirectiveUriWithRelativeUriImpl readWithRelativeUri() {
+      final parent = readWithRelativeUriString();
+      final relativeUri = Uri.parse(_reader.readStringReference());
+      return DirectiveUriWithRelativeUriImpl(
+        relativeUriString: parent.relativeUriString,
+        relativeUri: relativeUri,
+      );
+    }
+
+    DirectiveUriWithSourceImpl readWithSource() {
+      final parent = readWithRelativeUri();
+
+      final analysisContext = _elementFactory.analysisContext;
+      final sourceFactory = analysisContext.sourceFactory;
+
+      final sourceUriStr = _reader.readStringReference();
+      final sourceUri = Uri.parse(sourceUriStr);
+      final source = sourceFactory.forUri2(sourceUri)!;
+
+      return DirectiveUriWithSourceImpl(
+        relativeUriString: parent.relativeUriString,
+        relativeUri: parent.relativeUri,
+        source: source,
+      );
+    }
+
+    final kindIndex = _reader.readByte();
+    final kind = DirectiveUriKind.values[kindIndex];
+    switch (kind) {
+      case DirectiveUriKind.withUnit:
+        final parent = readWithSource();
+        final unitElement = _readUnitElement(
+          unitContainerRef: unitContainerRef,
+          libraryElement: libraryElement,
+          librarySource: libraryElement.source,
+          unitSource: parent.source,
+        );
+        return DirectiveUriWithUnitImpl(
+          relativeUriString: parent.relativeUriString,
+          relativeUri: parent.relativeUri,
+          unit: unitElement,
+        );
+      case DirectiveUriKind.withLibrary:
+        // TODO: Handle this case.
+        throw UnimplementedError();
+      case DirectiveUriKind.withSource:
+        return readWithSource();
+      case DirectiveUriKind.withRelativeUri:
+        return readWithRelativeUri();
+      case DirectiveUriKind.withRelativeUriString:
+        return readWithRelativeUriString();
+      case DirectiveUriKind.withNothing:
+        return DirectiveUriImpl();
+    }
+  }
+
   EnumElementImpl _readEnumElement(
     CompilationUnitElementImpl unitElement,
     Reference unitReference,
@@ -982,41 +1047,14 @@
     required Reference unitContainerRef,
     required LibraryElementImpl libraryElement,
   }) {
-    final analysisContext = _elementFactory.analysisContext;
-    final sourceFactory = analysisContext.sourceFactory;
+    final uri = _readDirectiveUri(
+      unitContainerRef: unitContainerRef,
+      libraryElement: libraryElement,
+    );
 
-    final kindIndex = _reader.readByte();
-    final kind = PartElementKind.values[kindIndex];
-    switch (kind) {
-      case PartElementKind.withPart:
-        final relativeUriString = _reader.readStringReference();
-        final uriStr = _reader.readStringReference();
-        final uri = Uri.parse(uriStr);
-        final uriSource = sourceFactory.forUri2(uri)!;
-        final unitElement = _readUnitElement(
-          sourceFactory: sourceFactory,
-          unitContainerRef: unitContainerRef,
-          libraryElement: libraryElement,
-          librarySource: libraryElement.source,
-          unitSource: uriSource,
-        );
-        return PartElementWithPartImpl(
-          relativeUriString: relativeUriString,
-          uriSource: uriSource,
-          includedUnit: unitElement,
-        );
-      case PartElementKind.withSource:
-        final relativeUriString = _reader.readStringReference();
-        final uriStr = _reader.readStringReference();
-        final uri = Uri.parse(uriStr);
-        final uriSource = sourceFactory.forUri2(uri)!;
-        return PartElementWithSourceImpl(
-          relativeUriString: relativeUriString,
-          uriSource: uriSource,
-        );
-      case PartElementKind.withNothing:
-        return PartElementImpl();
-    }
+    return PartElementImpl(
+      uri: uri,
+    );
   }
 
   PropertyAccessorElementImpl _readPropertyAccessorElement(
@@ -1234,7 +1272,6 @@
   }
 
   CompilationUnitElementImpl _readUnitElement({
-    required SourceFactory sourceFactory,
     required Reference unitContainerRef,
     required LibraryElementImpl libraryElement,
     required Source librarySource,
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 1993b8e..1008851 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -174,6 +174,42 @@
     });
   }
 
+  void _writeDirectiveUri(DirectiveUri element) {
+    void writeWithUriString(DirectiveUriWithRelativeUriString element) {
+      _sink._writeStringReference(element.relativeUriString);
+    }
+
+    void writeWithRelativeUri(DirectiveUriWithRelativeUri element) {
+      writeWithUriString(element);
+      _sink._writeStringReference('${element.relativeUri}');
+    }
+
+    void writeWithSource(DirectiveUriWithSource element) {
+      writeWithRelativeUri(element);
+      _sink._writeStringReference('${element.source.uri}');
+    }
+
+    if (element is DirectiveUriWithLibrary) {
+      // TODO(scheglov) implement
+      throw UnimplementedError();
+    } else if (element is DirectiveUriWithUnit) {
+      _sink.writeByte(DirectiveUriKind.withUnit.index);
+      writeWithSource(element);
+      _writeUnitElement(element.unit);
+    } else if (element is DirectiveUriWithSource) {
+      _sink.writeByte(DirectiveUriKind.withSource.index);
+      writeWithSource(element);
+    } else if (element is DirectiveUriWithRelativeUri) {
+      _sink.writeByte(DirectiveUriKind.withRelativeUri.index);
+      writeWithRelativeUri(element);
+    } else if (element is DirectiveUriWithRelativeUriString) {
+      _sink.writeByte(DirectiveUriKind.withRelativeUriString.index);
+      writeWithUriString(element);
+    } else {
+      _sink.writeByte(DirectiveUriKind.withNothing.index);
+    }
+  }
+
   void _writeEnumElement(ClassElement element) {
     element as EnumElementImpl;
     _sink.writeUInt30(_resolutionSink.offset);
@@ -394,18 +430,7 @@
   }
 
   void _writePartElement(PartElement element) {
-    if (element is PartElementWithPart) {
-      _sink.writeByte(PartElementKind.withPart.index);
-      _sink._writeStringReference(element.relativeUriString);
-      _sink._writeStringReference('${element.uriSource.uri}');
-      _writeUnitElement(element.includedUnit);
-    } else if (element is PartElementWithSource) {
-      _sink.writeByte(PartElementKind.withSource.index);
-      _sink._writeStringReference(element.relativeUriString);
-      _sink._writeStringReference('${element.uriSource.uri}');
-    } else {
-      _sink.writeByte(PartElementKind.withNothing.index);
-    }
+    _writeDirectiveUri(element.uri);
   }
 
   void _writePropertyAccessorElement(PropertyAccessorElement element) {
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index e0f47f2..83db6a1 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -7,7 +7,8 @@
 import 'package:analyzer/dart/ast/ast.dart' as ast;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/visitor.dart';
-import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/file_state.dart' hide DirectiveUri;
+import 'package:analyzer/src/dart/analysis/file_state.dart' as file_state;
 import 'package:analyzer/src/dart/ast/ast.dart' as ast;
 import 'package:analyzer/src/dart/ast/mixin_super_invoked_names.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -322,10 +323,12 @@
     _bindReference(unitReference, unitElement);
 
     element.parts2.add(
-      PartElementWithPartImpl(
-        relativeUriString: '_macro_types.dart',
-        uriSource: unitSource,
-        includedUnit: unitElement,
+      PartElementImpl(
+        uri: DirectiveUriWithUnitImpl(
+          relativeUriString: '_macro_types.dart',
+          relativeUri: unitUri,
+          unit: unitElement,
+        ),
       ),
     );
 
@@ -476,6 +479,9 @@
 
     final parts = <PartElementImpl>[];
     for (final partState in inputLibrary.parts) {
+      final uriState = partState.uri;
+
+      final DirectiveUri directiveUri;
       if (partState is PartDirectiveWithFile) {
         final includedPart = partState.includedPart;
         if (includedPart != null) {
@@ -489,13 +495,6 @@
           unitElement.isSynthetic = !partFile.exists;
           unitElement.uri = partFile.uriStr;
           unitElement.setCodeRange(0, partUnitNode.length);
-          parts.add(
-            PartElementWithPartImpl(
-              relativeUriString: partState.uri.relativeUriStr,
-              uriSource: partFile.source,
-              includedUnit: unitElement,
-            ),
-          );
 
           final unitReference = unitContainerRef.getChild(partFile.uriStr);
           _bindReference(unitReference, unitElement);
@@ -508,19 +507,43 @@
               element: unitElement,
             ),
           );
+
+          directiveUri = DirectiveUriWithUnitImpl(
+            relativeUriString: partState.uri.relativeUriStr,
+            relativeUri: partState.uri.relativeUri,
+            unit: unitElement,
+          );
         } else {
-          parts.add(
-            PartElementWithSourceImpl(
-              relativeUriString: partState.uri.relativeUriStr,
-              uriSource: partState.includedFile.source,
-            ),
+          directiveUri = DirectiveUriWithSourceImpl(
+            relativeUriString: partState.uri.relativeUriStr,
+            relativeUri: partState.uri.relativeUri,
+            source: partState.includedFile.source,
           );
         }
-      } else {
-        parts.add(
-          PartElementImpl(),
+      } else if (uriState is file_state.DirectiveUriWithSource) {
+        directiveUri = DirectiveUriWithSourceImpl(
+          relativeUriString: uriState.relativeUriStr,
+          relativeUri: uriState.relativeUri,
+          source: uriState.source,
         );
+      } else if (uriState is file_state.DirectiveUriWithUri) {
+        directiveUri = DirectiveUriWithRelativeUriImpl(
+          relativeUriString: uriState.relativeUriStr,
+          relativeUri: uriState.relativeUri,
+        );
+      } else if (uriState is file_state.DirectiveUriWithString) {
+        directiveUri = DirectiveUriWithRelativeUriStringImpl(
+          relativeUriString: uriState.relativeUriStr,
+        );
+      } else {
+        directiveUri = DirectiveUriImpl();
       }
+
+      parts.add(
+        PartElementImpl(
+          uri: directiveUri,
+        ),
+      );
     }
 
     libraryElement.parts2 = parts;
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index 29ff647..d2923f5 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -218,9 +218,10 @@
   CompilationUnitElement part(String targetUri) {
     CompilationUnitElement? result;
 
-    for (final part in libraryElement.parts2) {
-      if (part is PartElementWithPart) {
-        final unitElement = part.includedUnit;
+    for (final partElement in libraryElement.parts2) {
+      final uri = partElement.uri;
+      if (uri is DirectiveUriWithUnit) {
+        final unitElement = uri.unit;
         if ('${unitElement.source.uri}' == targetUri) {
           if (result != null) {
             throw StateError('Not unique: $targetUri');
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 9714635..c59203e 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -1293,9 +1293,9 @@
 ''');
     LibraryElement element = result.libraryElement;
     CompilationUnitElement unitElementA =
-        (element.parts2[0] as PartElementWithPart).includedUnit;
+        (element.parts2[0].uri as DirectiveUriWithUnit).unit;
     CompilationUnitElement unitElementB =
-        (element.parts2[1] as PartElementWithPart).includedUnit;
+        (element.parts2[1].uri as DirectiveUriWithUnit).unit;
     var expected = [
       ExpectedResult(unitElementA, SearchResultKind.REFERENCE,
           codeA.indexOf('lib; // A'), 'lib'.length),
@@ -1331,9 +1331,9 @@
 ''');
     LibraryElement element = result.libraryElement;
     CompilationUnitElement unitElementA =
-        (element.parts2[0] as PartElementWithPart).includedUnit;
+        (element.parts2[0].uri as DirectiveUriWithUnit).unit;
     CompilationUnitElement unitElementB =
-        (element.parts2[1] as PartElementWithPart).includedUnit;
+        (element.parts2[1].uri as DirectiveUriWithUnit).unit;
     var expected = [
       ExpectedResult(unitElementA, SearchResultKind.REFERENCE,
           codeA.indexOf('lib; // A'), 'lib'.length),
diff --git a/pkg/analyzer/test/src/dart/resolution/part_test.dart b/pkg/analyzer/test/src/dart/resolution/part_test.dart
index 54aad7c..2afd418 100644
--- a/pkg/analyzer/test/src/dart/resolution/part_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/part_test.dart
@@ -39,7 +39,7 @@
     staticType: String
     stringValue: null
   semicolon: ;
-  element: PartElement
+  element: DirectiveUri
   uriContent: null
   uriElement: notUnitElement
   uriSource: <null>
@@ -62,8 +62,8 @@
   uri: SimpleStringLiteral
     literal: 'a.dart'
   semicolon: ;
-  element: PartElementWithPart
-    part: package:test/a.dart
+  element: DirectiveUriWithUnit
+    uri: package:test/a.dart
   uriContent: null
   uriElement: unitElement package:test/a.dart
   uriSource: package:test/a.dart
@@ -85,8 +85,8 @@
   uri: SimpleStringLiteral
     literal: 'a.dart'
   semicolon: ;
-  element: PartElementWithPart
-    part: package:test/a.dart
+  element: DirectiveUriWithUnit
+    uri: package:test/a.dart
   uriContent: null
   uriElement: unitElement package:test/a.dart
   uriSource: package:test/a.dart
@@ -110,7 +110,7 @@
   uri: SimpleStringLiteral
     literal: 'a.dart'
   semicolon: ;
-  element: PartElementWithSource
+  element: DirectiveUriWithSource
     source: package:test/a.dart
   uriContent: null
   uriElement: notUnitElement
@@ -133,7 +133,7 @@
   uri: SimpleStringLiteral
     literal: 'a.dart'
   semicolon: ;
-  element: PartElementWithSource
+  element: DirectiveUriWithSource
     source: package:test/a.dart
   uriContent: null
   uriElement: notUnitElement
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 73308ff..2c955c4 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -425,6 +425,20 @@
     }
   }
 
+  void _writeDirectiveUri(DirectiveUri uri) {
+    if (uri is DirectiveUriWithUnit) {
+      _writelnWithIndent('${uri.unit.source.uri}');
+    } else if (uri is DirectiveUriWithSource) {
+      _writelnWithIndent("source '${uri.source.uri}'");
+    } else if (uri is DirectiveUriWithRelativeUri) {
+      _writelnWithIndent("relativeUri '${uri.relativeUri}'");
+    } else if (uri is DirectiveUriWithRelativeUriString) {
+      _writelnWithIndent("relativeUriString '${uri.relativeUriString}'");
+    } else {
+      _writelnWithIndent('noRelativeUriString');
+    }
+  }
+
   void _writeDisplayName(Element e) {
     if (withDisplayName) {
       _writelnWithIndent('displayName: ${e.displayName}');
@@ -712,25 +726,15 @@
   }
 
   void _writePartElement(PartElement e) {
-    if (e is PartElementWithPart) {
-      _writelnWithIndent('${e.includedUnit.source.uri}');
-      _withIndent(() {
-        _writeMetadata(e);
-        _writeUnitElement(e.includedUnit);
-      });
-    } else if (e is PartElementWithSource) {
-      _writelnWithIndent("source '${e.uriSource.uri}'");
-      _withIndent(() {
-        _writeMetadata(e);
-      });
-    } else if (e is PartElementImpl) {
-      _writelnWithIndent('noSource');
-      _withIndent(() {
-        _writeMetadata(e);
-      });
-    } else {
-      throw UnimplementedError('(${e.runtimeType}) $e');
-    }
+    final uri = e.uri;
+    _writeDirectiveUri(uri);
+
+    _withIndent(() {
+      _writeMetadata(e);
+      if (uri is DirectiveUriWithUnit) {
+        _writeUnitElement(uri.unit);
+      }
+    });
   }
 
   void _writePropertyAccessorElement(PropertyAccessorElement e) {
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index b49c61b..0f4a224 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -25379,9 +25379,9 @@
     <unresolved>
   definingUnit
   parts
-    noSource
+    relativeUriString ':[invaliduri]'
     source 'package:test/a3.dart'
-    noSource
+    relativeUriString ':[invaliduri]'
 ''');
   }
 
@@ -25468,7 +25468,7 @@
 library
   definingUnit
   parts
-    noSource
+    noRelativeUriString
 ''');
   }
 
@@ -25525,6 +25525,19 @@
 ''');
   }
 
+  test_library_parts_withRelativeUri_noSource() async {
+    newFile('$testPackageLibPath/a.dart', '');
+    final library = await buildLibrary(r'''
+part 'foo:bar';
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+  parts
+    relativeUri 'foo:bar'
+''');
+  }
+
   test_library_parts_withRelativeUri_notPart_emptyUriSelf() async {
     final library = await buildLibrary(r'''
 part '';
@@ -25570,7 +25583,7 @@
 library
   definingUnit
   parts
-    noSource
+    relativeUriString ':'
 ''');
   }
 
diff --git a/pkg/analyzer/test/src/summary/macro_test.dart b/pkg/analyzer/test/src/summary/macro_test.dart
index 2a23acf..6e0f286 100644
--- a/pkg/analyzer/test/src/summary/macro_test.dart
+++ b/pkg/analyzer/test/src/summary/macro_test.dart
@@ -1806,8 +1806,8 @@
     }
 
     if (expected != null) {
-      final partElement = library.parts2.single as PartElementWithPart;
-      final x = partElement.includedUnit.topLevelVariables.single;
+      final partUri = library.parts2.single.uri as DirectiveUriWithUnit;
+      final x = partUri.unit.topLevelVariables.single;
       expect(x.name, 'x');
       x as ConstTopLevelVariableElementImpl;
       final actual = (x.constantInitializer as SimpleStringLiteral).value;
@@ -1869,8 +1869,8 @@
       library.definingCompilationUnit.getType('A'),
     );
 
-    final partElement = library.parts2.single as PartElementWithPart;
-    final x = partElement.includedUnit.topLevelVariables.single;
+    final partUri = library.parts2.single.uri as DirectiveUriWithUnit;
+    final x = partUri.unit.topLevelVariables.single;
     expect(x.name, 'x');
     x as ConstTopLevelVariableElementImpl;
     var x_literal = x.constantInitializer as SimpleStringLiteral;
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index 1b9b710..44ad036 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -1352,6 +1352,34 @@
     _indent = indent;
   }
 
+  void _writeDirectiveUri(DirectiveUri uri) {
+    if (uri is DirectiveUriWithUnit) {
+      _writeln('DirectiveUriWithUnit');
+      _withIndent(() {
+        final uriStr = _stringOfSource(uri.unit.source);
+        _writelnWithIndent('uri: $uriStr');
+      });
+    } else if (uri is DirectiveUriWithSource) {
+      _writeln('DirectiveUriWithSource');
+      _withIndent(() {
+        final uriStr = _stringOfSource(uri.source);
+        _writelnWithIndent('source: $uriStr');
+      });
+    } else if (uri is DirectiveUriWithRelativeUri) {
+      _writeln('DirectiveUriWithRelativeUri');
+      _withIndent(() {
+        _writelnWithIndent('relativeUri: ${uri.relativeUri}');
+      });
+    } else if (uri is DirectiveUriWithRelativeUriString) {
+      _writeln('DirectiveUriWithRelativeUriString');
+      _withIndent(() {
+        _writelnWithIndent('relativeUriString: ${uri.relativeUriString}');
+      });
+    } else {
+      _writeln('DirectiveUri');
+    }
+  }
+
   void _writeElement(String name, Element? element) {
     if (_withResolution) {
       _sink.write(_indent);
@@ -1504,21 +1532,7 @@
   }
 
   void _writePartElement(PartElement element) {
-    if (element is PartElementWithPart) {
-      _writeln('PartElementWithPart');
-      _withIndent(() {
-        final uriStr = _stringOfSource(element.includedUnit.source);
-        _writelnWithIndent('part: $uriStr');
-      });
-    } else if (element is PartElementWithSource) {
-      _writeln('PartElementWithSource');
-      _withIndent(() {
-        final uriStr = _stringOfSource(element.uriSource);
-        _writelnWithIndent('source: $uriStr');
-      });
-    } else {
-      _writeln('PartElement');
-    }
+    _writeDirectiveUri(element.uri);
   }
 
   void _writePartUnitElement(String name, Element? element) {
diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
index 29b6891..dada67b 100644
--- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
@@ -384,18 +384,21 @@
   @override
   void visitPartDirective(PartDirective node) {
     final element = node.element;
-    if (element is PartElementWithPart) {
-      computer._addRegionForNode(node.uri, element.includedUnit);
-    } else if (element is PartElementWithSource) {
-      final uriNode = node.uri;
-      final source = element.uriSource;
-      computer.collector.addRegion(
-        uriNode.offset,
-        uriNode.length,
-        protocol.ElementKind.FILE,
-        protocol.Location(source.fullName, 0, 0, 0, 0,
-            endLine: 0, endColumn: 0),
-      );
+    if (element is PartElement) {
+      final uri = element.uri;
+      if (uri is DirectiveUriWithUnit) {
+        computer._addRegionForNode(node.uri, uri.unit);
+      } else if (uri is DirectiveUriWithSource) {
+        final uriNode = node.uri;
+        final source = uri.source;
+        computer.collector.addRegion(
+          uriNode.offset,
+          uriNode.length,
+          protocol.ElementKind.FILE,
+          protocol.Location(source.fullName, 0, 0, 0, 0,
+              endLine: 0, endColumn: 0),
+        );
+      }
     }
 
     super.visitPartDirective(node);
diff --git a/tools/VERSION b/tools/VERSION
index d775846..31ffcb9 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 270
+PRERELEASE 271
 PRERELEASE_PATCH 0
\ No newline at end of file