diff --git a/tsc/internal/fourslash/tests/autoImportPreferIndexReExport_test.go b/tsc/internal/fourslash/tests/autoImportPreferIndexReExport_test.go new file mode 100644 index 0000000000000..5bea7b914bb5f --- /dev/null +++ b/tsc/internal/fourslash/tests/autoImportPreferIndexReExport_test.go @@ -0,0 +1,61 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/TypeScript/tsc/internal/fourslash" + . "github.com/microsoft/TypeScript/tsc/internal/fourslash/tests/util" + "github.com/microsoft/TypeScript/tsc/internal/ls" + "github.com/microsoft/TypeScript/tsc/internal/lsp/lsproto" + "github.com/microsoft/TypeScript/tsc/internal/testutil" +) + +func TestAutoImportPreferIndexReExport(t *testing.T) { + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @module: nodenext +// @noLib: true +// @Filename: /package.json +{ "type": "module" } +// @Filename: /src/utils/double/index.ts +export { double } from "./double.js"; +// @Filename: /src/utils/double/double.ts +export const double = (x: number) => x * 2; +// @Filename: /src/index.ts +dou/**/` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Exact: CompletionGlobalsPlus( + []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "double", + Data: &lsproto.CompletionItemData{ + AutoImport: &lsproto.AutoImportFix{ + ModuleSpecifier: "./utils/double/index.js", + }, + }, + Detail: new("(alias) const double: (x: number) => number\nimport double"), + Kind: new(lsproto.CompletionItemKindVariable), + AdditionalTextEdits: fourslash.AnyTextEdits, + SortText: new(string(ls.SortTextAutoImportSuggestions)), + }, + }, true, + ), + }, + }) + f.VerifyApplyCodeActionFromCompletion(t, new(""), &fourslash.ApplyCodeActionFromCompletionOptions{ + Name: "double", + Source: "./utils/double/index.js", + Description: "Add import from \"./utils/double/index.js\"", + NewFileContent: new(`import { double } from "./utils/double/index.js"; + +dou`), + }) +} diff --git a/tsc/internal/fourslash/tests/importNameCodeFix_barrelExport3_test.go b/tsc/internal/fourslash/tests/importNameCodeFix_barrelExport3_test.go index ab3443a41b754..4a827c4b773fd 100644 --- a/tsc/internal/fourslash/tests/importNameCodeFix_barrelExport3_test.go +++ b/tsc/internal/fourslash/tests/importNameCodeFix_barrelExport3_test.go @@ -31,5 +31,5 @@ export * from "./a";` f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) defer done() f.VerifyImportFixModuleSpecifiers(t, "sibling", []string{"./a", "./index", "../index"}, &lsutil.UserPreferences{ImportModuleSpecifierEnding: "index"}) - f.VerifyImportFixModuleSpecifiers(t, "parent", []string{"../foo/a", "../foo/index", "../index"}, &lsutil.UserPreferences{ImportModuleSpecifierEnding: "index"}) + f.VerifyImportFixModuleSpecifiers(t, "parent", []string{"../foo/index", "../foo/a", "../index"}, &lsutil.UserPreferences{ImportModuleSpecifierEnding: "index"}) } diff --git a/tsc/internal/fourslash/tests/importNameCodeFix_barrelExport5_test.go b/tsc/internal/fourslash/tests/importNameCodeFix_barrelExport5_test.go index 37c3c6d664bd5..75b827cb52046 100644 --- a/tsc/internal/fourslash/tests/importNameCodeFix_barrelExport5_test.go +++ b/tsc/internal/fourslash/tests/importNameCodeFix_barrelExport5_test.go @@ -32,5 +32,5 @@ export * from "./a.js";` f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) defer done() f.VerifyImportFixModuleSpecifiers(t, "sibling", []string{"./a.js", "./index.js", "../index.js"}, nil /*preferences*/) - f.VerifyImportFixModuleSpecifiers(t, "parent", []string{"../foo/a.js", "../foo/index.js", "../index.js"}, nil /*preferences*/) + f.VerifyImportFixModuleSpecifiers(t, "parent", []string{"../foo/index.js", "../foo/a.js", "../index.js"}, nil /*preferences*/) } diff --git a/tsc/internal/ls/autoimport/fix.go b/tsc/internal/ls/autoimport/fix.go index a035f305eaf1d..1081c34754b8d 100644 --- a/tsc/internal/ls/autoimport/fix.go +++ b/tsc/internal/ls/autoimport/fix.go @@ -1046,6 +1046,16 @@ func (v *View) compareModuleSpecifiersForRanking(a, b *Fix) int { if comparison := tspath.CompareNumberOfDirectorySeparators(a.ModuleSpecifier, b.ModuleSpecifier); comparison != 0 { return comparison } + if a.ModuleSpecifierKind == modulespecifiers.ResultKindRelative && b.ModuleSpecifierKind == modulespecifiers.ResultKindRelative { + aIsIndexReExport := a.IsReExport && isIndexFileName(a.ModuleFileName) + bIsIndexReExport := b.IsReExport && isIndexFileName(b.ModuleFileName) + if aIsIndexReExport != bIsIndexReExport { + if aIsIndexReExport { + return -1 + } + return 1 + } + } return 0 }