diff --git a/tsc/internal/fourslash/tests/importNameCodeFix_jsx4_test.go b/tsc/internal/fourslash/tests/importNameCodeFix_jsx4_test.go
index 0c1ac7a4df43f..f3c3c27dc9ba4 100644
--- a/tsc/internal/fourslash/tests/importNameCodeFix_jsx4_test.go
+++ b/tsc/internal/fourslash/tests/importNameCodeFix_jsx4_test.go
@@ -8,7 +8,6 @@ import (
)
func TestImportNameCodeFix_jsx4(t *testing.T) {
- t.Skip("Known failing fourslash test")
t.Parallel()
defer testutil.RecoverAndFail(t, "Panic on fourslash test")
const content = `// @jsx: react
diff --git a/tsc/internal/fourslash/tests/importNameCodeFix_jsx6_test.go b/tsc/internal/fourslash/tests/importNameCodeFix_jsx6_test.go
index 242e949aa228f..2841e7761282b 100644
--- a/tsc/internal/fourslash/tests/importNameCodeFix_jsx6_test.go
+++ b/tsc/internal/fourslash/tests/importNameCodeFix_jsx6_test.go
@@ -8,7 +8,6 @@ import (
)
func TestImportNameCodeFix_jsx6(t *testing.T) {
- t.Skip("Known failing fourslash test")
t.Parallel()
defer testutil.RecoverAndFail(t, "Panic on fourslash test")
const content = `// @lib: es5
diff --git a/tsc/internal/fourslash/tests/importNameCodeFix_jsx8_test.go b/tsc/internal/fourslash/tests/importNameCodeFix_jsx8_test.go
new file mode 100644
index 0000000000000..cfaf7182b8e19
--- /dev/null
+++ b/tsc/internal/fourslash/tests/importNameCodeFix_jsx8_test.go
@@ -0,0 +1,35 @@
+package fourslash_test
+
+import (
+ "testing"
+
+ "github.com/microsoft/TypeScript/tsc/internal/fourslash"
+ "github.com/microsoft/TypeScript/tsc/internal/testutil"
+)
+
+func TestImportNameCodeFix_jsx8(t *testing.T) {
+ t.Parallel()
+ defer testutil.RecoverAndFail(t, "Panic on fourslash test")
+ const content = `// @jsx: react
+// @module: esnext
+// @esModuleInterop: true
+// @moduleResolution: bundler
+// @Filename: /node_modules/react/index.d.ts
+export = React;
+export as namespace React;
+declare namespace React {
+ class Component {}
+}
+// @Filename: /a.tsx
+import { Component } from "react";
+;`
+ f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content)
+ defer done()
+ f.GoToFile(t, "/a.tsx")
+ f.VerifyCodeFix(t, fourslash.VerifyCodeFixOptions{
+ Description: "Import 'React' from \"react\"",
+ NewFileContent: `import React, { Component } from "react";
+;`,
+ Index: 0,
+ })
+}
diff --git a/tsc/internal/ls/autoimport/fix.go b/tsc/internal/ls/autoimport/fix.go
index 46423f35f8e3e..0628f8fd27174 100644
--- a/tsc/internal/ls/autoimport/fix.go
+++ b/tsc/internal/ls/autoimport/fix.go
@@ -60,6 +60,7 @@ func (f *Fix) Edits(
formatOptions lsutil.FormatCodeSettings,
converters *lsconv.Converters,
preferences lsutil.UserPreferences,
+ includeSymbolNameInDescription bool,
) ([]*lsproto.TextEdit, string, bool) {
locale := locale.FromContext(ctx)
tracker := change.NewTracker(ctx, compilerOptions, formatOptions, converters)
@@ -75,6 +76,9 @@ func (f *Fix) Edits(
existingFix := getAddToExistingImportFix(file, f)
addToExistingImport(tracker, file, existingFix.importClauseOrBindingPattern, existingFix.defaultImport, core.SingleElementSlice(existingFix.namedImport), preferences)
edits, safe := fileEdits(tracker, file)
+ if includeSymbolNameInDescription {
+ return edits, diagnostics.Import_0_from_1.Localize(locale, f.Name, f.ModuleSpecifier), safe
+ }
return edits, diagnostics.Update_import_from_0.Localize(locale, f.ModuleSpecifier), safe
case lsproto.AutoImportFixKindAddNew:
var declarations []*ast.Statement
@@ -107,6 +111,9 @@ func (f *Fix) Edits(
// addNamespaceQualifier(tracker, file, qualification)
// }
edits, safe := fileEdits(tracker, file)
+ if includeSymbolNameInDescription {
+ return edits, diagnostics.Import_0_from_1.Localize(locale, f.Name, f.ModuleSpecifier), safe
+ }
return edits, diagnostics.Add_import_from_0.Localize(locale, f.ModuleSpecifier), safe
case lsproto.AutoImportFixKindPromoteTypeOnly:
promotedDeclaration := promoteFromTypeOnly(tracker, f.TypeOnlyAliasDeclaration, compilerOptions, file, preferences)
diff --git a/tsc/internal/ls/codeactions_importfixes.go b/tsc/internal/ls/codeactions_importfixes.go
index 51890a608c452..84398429153ba 100644
--- a/tsc/internal/ls/codeactions_importfixes.go
+++ b/tsc/internal/ls/codeactions_importfixes.go
@@ -81,6 +81,7 @@ func getImportCodeActions(ctx context.Context, fixContext *CodeFixContext) ([]*C
fixContext.LS.FormatOptions(),
fixContext.LS.converters,
fixContext.LS.UserPreferences(),
+ fixInfo.symbolName != fixInfo.errorIdentifierText,
)
if ok {
@@ -340,9 +341,10 @@ func getFixesInfoForNonUMDImport(fixContext *CodeFixContext, symbolToken *ast.No
fixes := view.GetFixes(export, isJSXTagName, isValidTypeOnlyUseSite, &usagePosition)
for _, fix := range fixes {
allInfo = append(allInfo, &fixInfo{
- fix: fix,
- symbolName: symbolName,
- isJsxNamespaceFix: symbolName != symbolToken.Text(),
+ fix: fix,
+ symbolName: symbolName,
+ errorIdentifierText: symbolToken.Text(),
+ isJsxNamespaceFix: symbolName != symbolToken.Text(),
})
}
}
diff --git a/tsc/internal/ls/completions.go b/tsc/internal/ls/completions.go
index eda157d04e864..22ac8baf43fb3 100644
--- a/tsc/internal/ls/completions.go
+++ b/tsc/internal/ls/completions.go
@@ -92,6 +92,7 @@ func (l *LanguageService) filterContentMappedAutoImports(ctx context.Context, pr
l.FormatOptions(),
l.converters,
l.UserPreferences(),
+ false, /*includeSymbolNameInDescription*/
)
if !ok {
continue
@@ -5544,7 +5545,7 @@ func (l *LanguageService) getCompletionItemDetails(
// Auto-imports in content-mapped files are evaluated eagerly so edits outside
// of verbatim spans can cause the completion item to be filtered out entirely.
// Only real files take this code path, so the final Edits() is guaranteed ok.
- edits, description, _ := (&autoimport.Fix{AutoImportFix: data.AutoImport}).Edits(ctx, file, program.Options(), l.FormatOptions(), l.converters, l.UserPreferences())
+ edits, description, _ := (&autoimport.Fix{AutoImportFix: data.AutoImport}).Edits(ctx, file, program.Options(), l.FormatOptions(), l.converters, l.UserPreferences(), false /*includeSymbolNameInDescription*/)
item.AdditionalTextEdits = &edits
item.Detail = strPtrTo(description)
return item