diff --git a/tsc/internal/fourslash/tests/importNameCodeFix_barrelExport_test.go b/tsc/internal/fourslash/tests/importNameCodeFix_barrelExport_test.go index 0a5590792c30c..7a30d622bee5f 100644 --- a/tsc/internal/fourslash/tests/importNameCodeFix_barrelExport_test.go +++ b/tsc/internal/fourslash/tests/importNameCodeFix_barrelExport_test.go @@ -32,3 +32,25 @@ export * from "./a";` f.VerifyImportFixModuleSpecifiers(t, "sibling", []string{"./a", ".", ".."}, nil /*preferences*/) f.VerifyImportFixModuleSpecifiers(t, "parent", []string{"../foo", "../foo/a", ".."}, nil /*preferences*/) } + +func TestImportNameCodeFix_barrelExportMixedModuleKinds(t *testing.T) { + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @module: commonjs +// @Filename: /node_modules/@types/example/index.d.ts +declare module "example" { export const A: number; } + +// @Filename: /foo/a.ts +export const A = 0; + +// @Filename: /foo/index.ts +export * from "./a"; +export * from "./b"; + +// @Filename: /foo/b.ts +export {}; +A/**/` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyImportFixModuleSpecifiers(t, "", []string{"example", "./a", "."}, nil /*preferences*/) +} diff --git a/tsc/internal/fourslash/tests/importNameCodeFix_uriStyleNodeCoreModules1_test.go b/tsc/internal/fourslash/tests/importNameCodeFix_uriStyleNodeCoreModules1_test.go index 58b5ece8e1fa4..0cb0898eef602 100644 --- a/tsc/internal/fourslash/tests/importNameCodeFix_uriStyleNodeCoreModules1_test.go +++ b/tsc/internal/fourslash/tests/importNameCodeFix_uriStyleNodeCoreModules1_test.go @@ -22,3 +22,39 @@ writeFile/**/` defer done() f.VerifyImportFixModuleSpecifiers(t, "", []string{"fs", "node:fs", "fs/promises", "node:fs/promises"}, nil /*preferences*/) } + +func TestImportNameCodeFix_uriStyleMixedModuleKinds(t *testing.T) { + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @module: commonjs +// @Filename: /node_modules/@types/node/index.d.ts +declare module "path" {} +declare module "node:path" {} +declare module "fs" { export function writeFile(): void } +declare module "node:fs" { export function writeFile(): void } + +// @Filename: /node_modules/lodash/package.json +{ "name": "lodash", "types": "index.d.ts" } + +// @Filename: /node_modules/lodash/index.d.ts +export declare function writeFile(): void; + +// @Filename: /package.json +{ "dependencies": { "lodash": "*" } } + +// @Filename: /prefix.ts +import "node:path"; +writeFile/*prefix*/ + +// @Filename: /noPrefix.ts +import "path"; +writeFile/*noPrefix*/ + +// @Filename: /unknown.ts +writeFile/*unknown*/` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyImportFixModuleSpecifiers(t, "prefix", []string{"node:fs", "fs", "lodash"}, nil /*preferences*/) + f.VerifyImportFixModuleSpecifiers(t, "noPrefix", []string{"fs", "lodash", "node:fs"}, nil /*preferences*/) + f.VerifyImportFixModuleSpecifiers(t, "unknown", []string{"fs", "lodash", "node:fs"}, nil /*preferences*/) +} diff --git a/tsc/internal/ls/autoimport/fix.go b/tsc/internal/ls/autoimport/fix.go index 1333ef59cc134..59271fd360b3a 100644 --- a/tsc/internal/ls/autoimport/fix.go +++ b/tsc/internal/ls/autoimport/fix.go @@ -1038,18 +1038,14 @@ func (v *View) compareModuleSpecifiersForRanking(a, b *Fix) int { if comparison := compareModuleSpecifierRelativity(a, b, v.preferences); comparison != 0 { return comparison } - if a.ModuleSpecifierKind == modulespecifiers.ResultKindAmbient && b.ModuleSpecifierKind == modulespecifiers.ResultKindAmbient { - if comparison := v.compareNodeCoreModuleSpecifiers(a.ModuleSpecifier, b.ModuleSpecifier, v.importingFile, v.program); comparison != 0 { - return comparison - } + if comparison := v.compareNodeCoreModuleSpecifiers(a.ModuleSpecifier, b.ModuleSpecifier, v.importingFile, v.program); comparison != 0 { + return comparison } - if a.ModuleSpecifierKind == modulespecifiers.ResultKindRelative && b.ModuleSpecifierKind == modulespecifiers.ResultKindRelative { - if comparison := core.CompareBooleans( - isFixPossiblyReExportingImportingFile(a, v.importingFile.FileName(), v.program.CaseSensitivity()), - isFixPossiblyReExportingImportingFile(b, v.importingFile.FileName(), v.program.CaseSensitivity()), - ); comparison != 0 { - return comparison - } + if comparison := core.CompareBooleans( + isFixPossiblyReExportingImportingFile(a, v.importingFile.FileName(), v.program.CaseSensitivity()), + isFixPossiblyReExportingImportingFile(b, v.importingFile.FileName(), v.program.CaseSensitivity()), + ); comparison != 0 { + return comparison } if comparison := tspath.CompareNumberOfDirectorySeparators(a.ModuleSpecifier, b.ModuleSpecifier); comparison != 0 { return comparison