[DAS] Adds new import with show option

R= srawlins@google.com

Fixes https://github.com/dart-lang/sdk/issues/32234
Fixes https://github.com/dart-lang/sdk/issues/55842

Change-Id: I3acb03cc6d9a5f8bc1ebaf590a45ac5ee10388f8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/396564
Auto-Submit: Felipe Morschel <fmorschel.dev@gmail.com>
Commit-Queue: Phil Quitslund <pquitslund@google.com>
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
index 63fe73c..ede4625 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
@@ -26,11 +26,6 @@
 class ImportLibrary extends MultiCorrectionProducer {
   final _ImportKind _importKind;
 
-  /// Initialize a newly created instance that will add an import of
-  /// `dart:async`.
-  ImportLibrary.dartAsync({required super.context})
-    : _importKind = _ImportKind.dartAsync;
-
   /// Initialize a newly created instance that will add an import for an
   /// extension.
   ImportLibrary.forExtension({required super.context})
@@ -65,10 +60,6 @@
   @override
   Future<List<ResolvedCorrectionProducer>> get producers async {
     return switch (_importKind) {
-      _ImportKind.dartAsync => _importLibrary(
-        DartFixKind.IMPORT_ASYNC,
-        Uri.parse('dart:async'),
-      ),
       _ImportKind.forExtension => await _producersForExtension(),
       _ImportKind.forExtensionMember => await _producersForExtensionMember(),
       _ImportKind.forExtensionType => await _producersForExtensionType(),
@@ -154,29 +145,66 @@
   /// Otherwise, both are returned in the order: absolute, relative.
   List<ResolvedCorrectionProducer> _importLibrary(
     FixKind fixKind,
-    Uri library, {
+    FixKind fixKindShow,
+    Uri library,
+    String name, {
     String? prefix,
     bool includeRelativeFix = false,
   }) {
     if (!includeRelativeFix) {
       return [
         _ImportAbsoluteLibrary(fixKind, library, prefix, context: context),
+        _ImportAbsoluteLibrary(
+          fixKindShow,
+          library,
+          prefix,
+          show: name,
+          context: context,
+        ),
       ];
     }
     var codeStyleOptions = getCodeStyleOptions(unitResult.file);
     if (codeStyleOptions.usePackageUris) {
       return [
         _ImportAbsoluteLibrary(fixKind, library, prefix, context: context),
+        _ImportAbsoluteLibrary(
+          fixKindShow,
+          library,
+          prefix,
+          show: name,
+          context: context,
+        ),
       ];
     }
     if (codeStyleOptions.useRelativeUris) {
       return [
         _ImportRelativeLibrary(fixKind, library, prefix, context: context),
+        _ImportRelativeLibrary(
+          fixKindShow,
+          library,
+          prefix,
+          show: name,
+          context: context,
+        ),
       ];
     }
     return [
       _ImportAbsoluteLibrary(fixKind, library, prefix, context: context),
+      _ImportAbsoluteLibrary(
+        fixKindShow,
+        library,
+        prefix,
+        show: name,
+        context: context,
+      ),
       _ImportRelativeLibrary(fixKind, library, prefix, context: context),
+      _ImportRelativeLibrary(
+        fixKindShow,
+        library,
+        prefix,
+        show: name,
+        context: context,
+      ),
     ];
   }
 
@@ -282,29 +310,46 @@
       }
       // Compute the fix kind.
       FixKind fixKind;
+      FixKind fixKindShow;
       if (libraryElement.isInSdk) {
         fixKind =
             prefix.isEmptyOrNull
                 ? DartFixKind.IMPORT_LIBRARY_SDK
                 : DartFixKind.IMPORT_LIBRARY_SDK_PREFIXED;
+        fixKindShow =
+            prefix.isEmptyOrNull
+                ? DartFixKind.IMPORT_LIBRARY_SDK_SHOW
+                : DartFixKind.IMPORT_LIBRARY_SDK_PREFIXED_SHOW;
       } else if (_isLibSrcPath(librarySource.fullName)) {
         // Bad: non-API.
         fixKind =
             prefix.isEmptyOrNull
                 ? DartFixKind.IMPORT_LIBRARY_PROJECT3
                 : DartFixKind.IMPORT_LIBRARY_PROJECT3_PREFIXED;
+        fixKindShow =
+            prefix.isEmptyOrNull
+                ? DartFixKind.IMPORT_LIBRARY_PROJECT3_SHOW
+                : DartFixKind.IMPORT_LIBRARY_PROJECT3_PREFIXED_SHOW;
       } else if (declaration.library != libraryElement) {
         // Ugly: exports.
         fixKind =
             prefix.isEmptyOrNull
                 ? DartFixKind.IMPORT_LIBRARY_PROJECT2
                 : DartFixKind.IMPORT_LIBRARY_PROJECT2_PREFIXED;
+        fixKindShow =
+            prefix.isEmptyOrNull
+                ? DartFixKind.IMPORT_LIBRARY_PROJECT2_SHOW
+                : DartFixKind.IMPORT_LIBRARY_PROJECT2_PREFIXED_SHOW;
       } else {
         // Good: direct declaration.
         fixKind =
             prefix.isEmptyOrNull
                 ? DartFixKind.IMPORT_LIBRARY_PROJECT1
                 : DartFixKind.IMPORT_LIBRARY_PROJECT1_PREFIXED;
+        fixKindShow =
+            prefix.isEmptyOrNull
+                ? DartFixKind.IMPORT_LIBRARY_PROJECT1_SHOW
+                : DartFixKind.IMPORT_LIBRARY_PROJECT1_PREFIXED_SHOW;
       }
       // If both files are in the same package's 'lib' folder, also include a
       // relative import.
@@ -316,7 +361,9 @@
       producers.addAll(
         _importLibrary(
           fixKind,
+          fixKindShow,
           librarySource.uri,
+          name,
           prefix: prefix,
           includeRelativeFix: includeRelativeUri,
         ),
@@ -543,6 +590,7 @@
   final FixKind _fixKind;
   final String? _prefix;
   final Uri _library;
+  final String? _show;
 
   String _uriText = '';
 
@@ -550,8 +598,9 @@
     this._fixKind,
     this._library,
     this._prefix, {
+    String? show,
     required super.context,
-  });
+  }) : _show = show;
 
   @override
   CorrectionApplicability get applicability =>
@@ -572,14 +621,18 @@
   Future<void> compute(ChangeBuilder builder) async {
     await builder.addDartFileEdit(file, (builder) {
       if (builder is DartFileEditBuilderImpl) {
-        _uriText = builder.importLibraryWithAbsoluteUri(_library, _prefix);
+        _uriText = builder.importLibraryWithAbsoluteUri(
+          _library,
+          prefix: _prefix,
+          shownName: _show,
+          useShow: _show != null,
+        );
       }
     });
   }
 }
 
 enum _ImportKind {
-  dartAsync,
   forExtension,
   forExtensionMember,
   forExtensionType,
@@ -783,6 +836,7 @@
   final FixKind _fixKind;
   final String? _prefix;
   final Uri _library;
+  final String? _show;
 
   String _uriText = '';
 
@@ -790,8 +844,9 @@
     this._fixKind,
     this._library,
     this._prefix, {
+    String? show,
     required super.context,
-  });
+  }) : _show = show;
 
   @override
   CorrectionApplicability get applicability =>
@@ -812,7 +867,12 @@
   Future<void> compute(ChangeBuilder builder) async {
     await builder.addDartFileEdit(file, (builder) {
       if (builder is DartFileEditBuilderImpl) {
-        _uriText = builder.importLibraryWithRelativeUri(_library, _prefix);
+        _uriText = builder.importLibraryWithRelativeUri(
+          _library,
+          prefix: _prefix,
+          shownName: _show,
+          useShow: _show != null,
+        );
       }
     });
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 845b93b..7d09043 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -844,6 +844,16 @@
     DartFixKindPriority.standard + 3,
     "Import library '{0}' with prefix '{1}'",
   );
+  static const IMPORT_LIBRARY_PROJECT1_PREFIXED_SHOW = FixKind(
+    'dart.fix.import.libraryProject1PrefixedShow',
+    DartFixKindPriority.standard + 3,
+    "Import library '{0}' with prefix '{1}' and 'show'",
+  );
+  static const IMPORT_LIBRARY_PROJECT1_SHOW = FixKind(
+    'dart.fix.import.libraryProject1Show',
+    DartFixKindPriority.standard + 3,
+    "Import library '{0}' with 'show'",
+  );
   static const IMPORT_LIBRARY_PROJECT2 = FixKind(
     'dart.fix.import.libraryProject2',
     DartFixKindPriority.standard + 2,
@@ -854,6 +864,16 @@
     DartFixKindPriority.standard + 2,
     "Import library '{0}' with prefix '{1}'",
   );
+  static const IMPORT_LIBRARY_PROJECT2_PREFIXED_SHOW = FixKind(
+    'dart.fix.import.libraryProject2PrefixedShow',
+    DartFixKindPriority.standard + 2,
+    "Import library '{0}' with prefix '{1}' and 'show'",
+  );
+  static const IMPORT_LIBRARY_PROJECT2_SHOW = FixKind(
+    'dart.fix.import.libraryProject2Show',
+    DartFixKindPriority.standard + 2,
+    "Import library '{0}' with 'show'",
+  );
   static const IMPORT_LIBRARY_PROJECT3 = FixKind(
     'dart.fix.import.libraryProject3',
     DartFixKindPriority.standard + 1,
@@ -864,16 +884,36 @@
     DartFixKindPriority.standard + 1,
     "Import library '{0}' with prefix '{1}'",
   );
+  static const IMPORT_LIBRARY_PROJECT3_PREFIXED_SHOW = FixKind(
+    'dart.fix.import.libraryProject3PrefixedShow',
+    DartFixKindPriority.standard + 1,
+    "Import library '{0}' with prefix '{1}' and 'show'",
+  );
+  static const IMPORT_LIBRARY_PROJECT3_SHOW = FixKind(
+    'dart.fix.import.libraryProject3Show',
+    DartFixKindPriority.standard + 1,
+    "Import library '{0}' with 'show'",
+  );
   static const IMPORT_LIBRARY_SDK = FixKind(
     'dart.fix.import.librarySdk',
     DartFixKindPriority.standard + 4,
     "Import library '{0}'",
   );
   static const IMPORT_LIBRARY_SDK_PREFIXED = FixKind(
-    'dart.fix.import.librarySdk',
+    'dart.fix.import.librarySdkPrefixed',
     DartFixKindPriority.standard + 4,
     "Import library '{0}' with prefix '{1}'",
   );
+  static const IMPORT_LIBRARY_SDK_PREFIXED_SHOW = FixKind(
+    'dart.fix.import.librarySdkPrefixedShow',
+    DartFixKindPriority.standard + 4,
+    "Import library '{0}' with prefix '{1}' and 'show'",
+  );
+  static const IMPORT_LIBRARY_SDK_SHOW = FixKind(
+    'dart.fix.import.librarySdkShow',
+    DartFixKindPriority.standard + 4,
+    "Import library '{0}' with 'show'",
+  );
   static const INLINE_INVOCATION = FixKind(
     'dart.fix.inlineInvocation',
     DartFixKindPriority.standard - 20,
diff --git a/pkg/analysis_server/test/edit/fixes_test.dart b/pkg/analysis_server/test/edit/fixes_test.dart
index 12db6b7..e30f5dc 100644
--- a/pkg/analysis_server/test/edit/fixes_test.dart
+++ b/pkg/analysis_server/test/edit/fixes_test.dart
@@ -89,10 +89,11 @@
     var errorFixes = await _getFixesAt(testFile, 'Completer<String>');
     expect(errorFixes, hasLength(1));
     var fixes = errorFixes[0].fixes;
-    expect(fixes, hasLength(3));
+    expect(fixes, hasLength(4));
     expect(fixes[0].message, matches('Import library'));
-    expect(fixes[1].message, matches('Create class'));
-    expect(fixes[2].message, matches('Create mixin'));
+    expect(fixes[1].message, matches("Import library .+ with 'show'"));
+    expect(fixes[2].message, matches('Create class'));
+    expect(fixes[3].message, matches('Create mixin'));
   }
 
   Future<void> test_fromPlugins() async {
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 a3265de..d4fc544 100644
--- a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
@@ -36,7 +36,7 @@
     // expect a suggestion to add the dart:async import
     expect(fix.fixes, isNotEmpty);
 
-    var change = fix.fixes.singleWhere(
+    var change = fix.fixes.firstWhere(
       (SourceChange change) => change.message.startsWith('Import '),
     );
     expect(change.edits, hasLength(1));
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
index 665e750..558ec02 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
@@ -13,11 +13,17 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ImportLibraryProject1PrefixedTest);
+    defineReflectiveTests(ImportLibraryProject1PrefixedWithShowTest);
     defineReflectiveTests(ImportLibraryProject1Test);
+    defineReflectiveTests(ImportLibraryProject1WithShowTest);
     defineReflectiveTests(ImportLibraryProject2PrefixedTest);
+    defineReflectiveTests(ImportLibraryProject2PrefixedWithShowTest);
     defineReflectiveTests(ImportLibraryProject2Test);
+    defineReflectiveTests(ImportLibraryProject2WithShowTest);
     defineReflectiveTests(ImportLibraryProject3PrefixedTest);
+    defineReflectiveTests(ImportLibraryProject3PrefixedWithShowTest);
     defineReflectiveTests(ImportLibraryProject3Test);
+    defineReflectiveTests(ImportLibraryProject3WithShowTest);
   });
 }
 
@@ -155,6 +161,139 @@
 }
 
 @reflectiveTest
+class ImportLibraryProject1PrefixedWithShowTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT1_PREFIXED_SHOW;
+
+  Future<void> test_prefixed_class() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+class A {}
+''');
+    await resolveTestCode('''
+void f() {
+  prefix.A? a;
+  print('\$a');
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' as prefix show A;
+
+void f() {
+  prefix.A? a;
+  print('\$a');
+}
+''');
+  }
+
+  Future<void> test_prefixed_constant() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+const value = 0;
+''');
+    await resolveTestCode('''
+void f() {
+  lib.value;
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' as lib show value;
+
+void f() {
+  lib.value;
+}
+''');
+  }
+
+  Future<void> test_prefixed_extension_constructor() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+extension A on int {}
+''');
+    await resolveTestCode('''
+void f(int i) {
+  prefix.A(i);
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' as prefix show A;
+
+void f(int i) {
+  prefix.A(i);
+}
+''');
+  }
+
+  Future<void> test_prefixed_extensionType() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+extension type A(int _) {}
+''');
+    await resolveTestCode('''
+void f(a.A a) {
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' as a show A;
+
+void f(a.A a) {
+}
+''');
+  }
+
+  Future<void> test_prefixed_extensionType_constructor() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+extension type A(int _) {}
+''');
+    await resolveTestCode('''
+void f(int i) {
+  prefix.A(i);
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' as prefix show A;
+
+void f(int i) {
+  prefix.A(i);
+}
+''');
+  }
+
+  Future<void> test_prefixed_function() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+void foo() {}
+''');
+    await resolveTestCode('''
+void f() {
+  prefix.foo();
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' as prefix show foo;
+
+void f() {
+  prefix.foo();
+}
+''');
+  }
+
+  Future<void> test_withEnum_value() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+library lib;
+enum E { one, two }
+''');
+    await resolveTestCode('''
+void f() {
+  lib.E.one;
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' as lib show E;
+
+void f() {
+  lib.E.one;
+}
+''');
+  }
+}
+
+@reflectiveTest
 class ImportLibraryProject1Test extends FixProcessorTest {
   @override
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT1;
@@ -1624,6 +1763,139 @@
 }
 
 @reflectiveTest
+class ImportLibraryProject1WithShowTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT1_SHOW;
+
+  Future<void> test_prefixed_class() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+class A {}
+''');
+    await resolveTestCode('''
+void f() {
+  A? a;
+  print('\$a');
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' show A;
+
+void f() {
+  A? a;
+  print('\$a');
+}
+''');
+  }
+
+  Future<void> test_prefixed_constant() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+const value = 0;
+''');
+    await resolveTestCode('''
+void f() {
+  value;
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' show value;
+
+void f() {
+  value;
+}
+''');
+  }
+
+  Future<void> test_prefixed_extension_constructor() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+extension A on int {}
+''');
+    await resolveTestCode('''
+void f(int i) {
+  A(i);
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' show A;
+
+void f(int i) {
+  A(i);
+}
+''');
+  }
+
+  Future<void> test_prefixed_extensionType() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+extension type A(int _) {}
+''');
+    await resolveTestCode('''
+void f(A a) {
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' show A;
+
+void f(A a) {
+}
+''');
+  }
+
+  Future<void> test_prefixed_extensionType_constructor() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+extension type A(int _) {}
+''');
+    await resolveTestCode('''
+void f(int i) {
+  A(i);
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' show A;
+
+void f(int i) {
+  A(i);
+}
+''');
+  }
+
+  Future<void> test_prefixed_function() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+void foo() {}
+''');
+    await resolveTestCode('''
+void f() {
+  foo();
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' show foo;
+
+void f() {
+  foo();
+}
+''');
+  }
+
+  Future<void> test_withEnum_value() async {
+    newFile('$testPackageLibPath/lib.dart', '''
+library lib;
+enum E { one, two }
+''');
+    await resolveTestCode('''
+void f() {
+  E.one;
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart' show E;
+
+void f() {
+  E.one;
+}
+''');
+  }
+}
+
+@reflectiveTest
 class ImportLibraryProject2PrefixedTest extends FixProcessorTest {
   @override
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT2_PREFIXED;
@@ -1756,6 +2028,138 @@
 }
 
 @reflectiveTest
+class ImportLibraryProject2PrefixedWithShowTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT2_PREFIXED_SHOW;
+
+  Future<void> test_prefixed_class() async {
+    newFile('$testPackageLibPath/lib1.dart', '''
+class A {}
+''');
+    newFile('$testPackageLibPath/lib2.dart', '''
+export 'package:test/lib1.dart';
+''');
+    await resolveTestCode('''
+void f() {
+  prefix.A? a;
+  print('\$a');
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib2.dart' as prefix show A;
+
+void f() {
+  prefix.A? a;
+  print('\$a');
+}
+''');
+  }
+
+  Future<void> test_prefixed_constant() async {
+    newFile('$testPackageLibPath/lib1.dart', '''
+const value = 0;
+''');
+    newFile('$testPackageLibPath/lib2.dart', '''
+export 'package:test/lib1.dart';
+''');
+    await resolveTestCode('''
+void f() {
+  lib.value;
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib2.dart' as lib show value;
+
+void f() {
+  lib.value;
+}
+''');
+  }
+
+  Future<void> test_prefixed_extension_constructor() async {
+    newFile('$testPackageLibPath/lib1.dart', '''
+extension A on int {}
+''');
+    newFile('$testPackageLibPath/lib2.dart', '''
+export 'package:test/lib1.dart';
+''');
+    await resolveTestCode('''
+void f(int i) {
+  prefix.A(i);
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib2.dart' as prefix show A;
+
+void f(int i) {
+  prefix.A(i);
+}
+''');
+  }
+
+  Future<void> test_prefixed_extensionType() async {
+    newFile('$testPackageLibPath/lib1.dart', '''
+extension type A(int _) {}
+''');
+    newFile('$testPackageLibPath/lib2.dart', '''
+export 'package:test/lib1.dart';
+''');
+    await resolveTestCode('''
+void f(a.A a) {
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib2.dart' as a show A;
+
+void f(a.A a) {
+}
+''');
+  }
+
+  Future<void> test_prefixed_extensionType_constructor() async {
+    newFile('$testPackageLibPath/lib1.dart', '''
+extension type A(int _) {}
+''');
+    newFile('$testPackageLibPath/lib2.dart', '''
+export 'package:test/lib1.dart';
+''');
+    await resolveTestCode('''
+void f(int i) {
+  prefix.A(i);
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib2.dart' as prefix show A;
+
+void f(int i) {
+  prefix.A(i);
+}
+''');
+  }
+
+  Future<void> test_prefixed_function() async {
+    newFile('$testPackageLibPath/lib1.dart', '''
+void foo() {}
+''');
+    newFile('$testPackageLibPath/lib2.dart', '''
+export 'package:test/lib1.dart';
+''');
+    await resolveTestCode('''
+void f() {
+  prefix.foo();
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib2.dart' as prefix show foo;
+
+void f() {
+  prefix.foo();
+}
+''');
+  }
+}
+
+@reflectiveTest
 class ImportLibraryProject2Test extends FixProcessorTest {
   @override
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT2;
@@ -1864,6 +2268,138 @@
 }
 
 @reflectiveTest
+class ImportLibraryProject2WithShowTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT2_SHOW;
+
+  Future<void> test_prefixed_class() async {
+    newFile('$testPackageLibPath/lib1.dart', '''
+class A {}
+''');
+    newFile('$testPackageLibPath/lib2.dart', '''
+export 'package:test/lib1.dart';
+''');
+    await resolveTestCode('''
+void f() {
+  A? a;
+  print('\$a');
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib2.dart' show A;
+
+void f() {
+  A? a;
+  print('\$a');
+}
+''');
+  }
+
+  Future<void> test_prefixed_constant() async {
+    newFile('$testPackageLibPath/lib1.dart', '''
+const value = 0;
+''');
+    newFile('$testPackageLibPath/lib2.dart', '''
+export 'package:test/lib1.dart';
+''');
+    await resolveTestCode('''
+void f() {
+  value;
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib2.dart' show value;
+
+void f() {
+  value;
+}
+''');
+  }
+
+  Future<void> test_prefixed_extension_constructor() async {
+    newFile('$testPackageLibPath/lib1.dart', '''
+extension A on int {}
+''');
+    newFile('$testPackageLibPath/lib2.dart', '''
+export 'package:test/lib1.dart';
+''');
+    await resolveTestCode('''
+void f(int i) {
+  A(i);
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib2.dart' show A;
+
+void f(int i) {
+  A(i);
+}
+''');
+  }
+
+  Future<void> test_prefixed_extensionType() async {
+    newFile('$testPackageLibPath/lib1.dart', '''
+extension type A(int _) {}
+''');
+    newFile('$testPackageLibPath/lib2.dart', '''
+export 'package:test/lib1.dart';
+''');
+    await resolveTestCode('''
+void f(A a) {
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib2.dart' show A;
+
+void f(A a) {
+}
+''');
+  }
+
+  Future<void> test_prefixed_extensionType_constructor() async {
+    newFile('$testPackageLibPath/lib1.dart', '''
+extension type A(int _) {}
+''');
+    newFile('$testPackageLibPath/lib2.dart', '''
+export 'package:test/lib1.dart';
+''');
+    await resolveTestCode('''
+void f(int i) {
+  A(i);
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib2.dart' show A;
+
+void f(int i) {
+  A(i);
+}
+''');
+  }
+
+  Future<void> test_prefixed_function() async {
+    newFile('$testPackageLibPath/lib1.dart', '''
+void foo() {}
+''');
+    newFile('$testPackageLibPath/lib2.dart', '''
+export 'package:test/lib1.dart';
+''');
+    await resolveTestCode('''
+void f() {
+  foo();
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib2.dart' show foo;
+
+void f() {
+  foo();
+}
+''');
+  }
+}
+
+@reflectiveTest
 class ImportLibraryProject3PrefixedTest extends FixProcessorTest {
   @override
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT3_PREFIXED;
@@ -1932,6 +2468,74 @@
 }
 
 @reflectiveTest
+class ImportLibraryProject3PrefixedWithShowTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT3_PREFIXED_SHOW;
+
+  Future<void> test_inLibSrc_thisContextRoot_extension() async {
+    newFile('$testPackageLibPath/src/lib.dart', '''
+extension E on int {
+  static String m() => '';
+}
+''');
+    await resolveTestCode('''
+f() {
+  print(lib.E.m());
+}
+''');
+    await assertHasFix('''
+import 'package:test/src/lib.dart' as lib show E;
+
+f() {
+  print(lib.E.m());
+}
+''');
+  }
+
+  Future<void> test_withClass_pub_this_inLib_includesThisSrc() async {
+    updateTestPubspecFile(r'''
+name: test
+''');
+
+    newFile('$testPackageLibPath/src/a.dart', r'''
+class Test {}
+''');
+
+    await resolveTestCode('''
+void f(lib.Test t) {}
+''');
+
+    await assertHasFix('''
+import 'package:test/src/a.dart' as lib show Test;
+
+void f(lib.Test t) {}
+''');
+  }
+
+  Future<void> test_withClass_pub_this_inTest_includesThisSrc() async {
+    updateTestPubspecFile(r'''
+name: test
+''');
+
+    newFile('$testPackageLibPath/src/a.dart', r'''
+class Test {}
+''');
+
+    var b = newFile('$testPackageTestPath/b.dart', r'''
+void f(lib.Test t) {}
+''');
+
+    await getResolvedUnit(b);
+
+    await assertHasFix('''
+import 'package:test/src/a.dart' as lib show Test;
+
+void f(lib.Test t) {}
+''', target: b.path);
+  }
+}
+
+@reflectiveTest
 class ImportLibraryProject3Test extends FixProcessorTest {
   @override
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT3;
@@ -1998,3 +2602,71 @@
 ''', target: b.path);
   }
 }
+
+@reflectiveTest
+class ImportLibraryProject3WithShowTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT3_SHOW;
+
+  Future<void> test_inLibSrc_thisContextRoot_extension() async {
+    newFile('$testPackageLibPath/src/lib.dart', '''
+extension E on int {
+  static String m() => '';
+}
+''');
+    await resolveTestCode('''
+f() {
+  print(E.m());
+}
+''');
+    await assertHasFix('''
+import 'package:test/src/lib.dart' show E;
+
+f() {
+  print(E.m());
+}
+''');
+  }
+
+  Future<void> test_withClass_pub_this_inLib_includesThisSrc() async {
+    updateTestPubspecFile(r'''
+name: test
+''');
+
+    newFile('$testPackageLibPath/src/a.dart', r'''
+class Test {}
+''');
+
+    await resolveTestCode('''
+void f(Test t) {}
+''');
+
+    await assertHasFix('''
+import 'package:test/src/a.dart' show Test;
+
+void f(Test t) {}
+''');
+  }
+
+  Future<void> test_withClass_pub_this_inTest_includesThisSrc() async {
+    updateTestPubspecFile(r'''
+name: test
+''');
+
+    newFile('$testPackageLibPath/src/a.dart', r'''
+class Test {}
+''');
+
+    var b = newFile('$testPackageTestPath/b.dart', r'''
+void f(Test t) {}
+''');
+
+    await getResolvedUnit(b);
+
+    await assertHasFix('''
+import 'package:test/src/a.dart' show Test;
+
+void f(Test t) {}
+''', target: b.path);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_sdk_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_sdk_test.dart
index 28d7ec5..7b8981d 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/import_library_sdk_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_sdk_test.dart
@@ -12,7 +12,9 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ImportLibrarySdkPrefixedTest);
+    defineReflectiveTests(ImportLibrarySdkPrefixedWithShowTest);
     defineReflectiveTests(ImportLibrarySdkTest);
+    defineReflectiveTests(ImportLibrarySdkWithShowTest);
   });
 }
 
@@ -40,6 +42,29 @@
 }
 
 @reflectiveTest
+class ImportLibrarySdkPrefixedWithShowTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_SDK_PREFIXED_SHOW;
+
+  Future<void> test_prefixed_class_async() async {
+    await resolveTestCode('''
+void f() {
+  prefix.Completer? c;
+  print('\$c');
+}
+''');
+    await assertHasFix('''
+import 'dart:async' as prefix show Completer;
+
+void f() {
+  prefix.Completer? c;
+  print('\$c');
+}
+''');
+  }
+}
+
+@reflectiveTest
 class ImportLibrarySdkTest extends FixProcessorTest {
   @override
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_SDK;
@@ -349,3 +374,26 @@
 ''');
   }
 }
+
+@reflectiveTest
+class ImportLibrarySdkWithShowTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_SDK_SHOW;
+
+  Future<void> test_prefixed_class_async() async {
+    await resolveTestCode('''
+void f() {
+  Completer? c;
+  print('\$c');
+}
+''');
+    await assertHasFix('''
+import 'dart:async' show Completer;
+
+void f() {
+  Completer? c;
+  print('\$c');
+}
+''');
+  }
+}
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index b518001..d616db0 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -2226,12 +2226,35 @@
     return ImportLibraryElementResultImpl(null);
   }
 
-  String importLibraryWithAbsoluteUri(Uri uri, [String? prefix]) {
-    return _importLibrary(uri, prefix: prefix, forceAbsolute: true).uriText;
+  String importLibraryWithAbsoluteUri(
+    Uri uri, {
+    String? prefix,
+    String? shownName,
+    bool useShow = false,
+  }) {
+    return _importLibrary(
+      uri,
+      prefix: prefix,
+      shownName: shownName,
+      useShow: useShow,
+      forceAbsolute: true,
+    ).uriText;
   }
 
-  String importLibraryWithRelativeUri(Uri uri, [String? prefix]) {
-    return _importLibrary(uri, prefix: prefix, forceRelative: true).uriText;
+  String importLibraryWithRelativeUri(
+    Uri uri, {
+    String? prefix,
+    String? shownName,
+    bool useShow = false,
+  }) {
+    return _importLibrary(
+      uri,
+      prefix: prefix,
+      shownName: shownName,
+      useShow: useShow,
+      forceAbsolute: true,
+      forceRelative: true,
+    ).uriText;
   }
 
   @override