diff --git a/src/compiler/moduleSpecifiers.ts b/src/compiler/moduleSpecifiers.ts index 09e73c22a26..ded50764acc 100644 --- a/src/compiler/moduleSpecifiers.ts +++ b/src/compiler/moduleSpecifiers.ts @@ -18,7 +18,6 @@ namespace ts.moduleSpecifiers { const info = getInfo(compilerOptions, importingSourceFile, importingSourceFileName, host); const modulePaths = getAllModulePaths(files, toFileName, info.getCanonicalFileName, host); return firstDefined(modulePaths, moduleFileName => getGlobalModuleSpecifier(moduleFileName, info, host, compilerOptions)) || - getGlobalModuleSpecifier(toFileName, info, host, compilerOptions) || first(getLocalModuleSpecifiers(toFileName, info, compilerOptions, preferences)); } @@ -67,8 +66,7 @@ namespace ts.moduleSpecifiers { compilerOptions: CompilerOptions, ) { return tryGetModuleNameFromTypeRoots(compilerOptions, host, getCanonicalFileName, moduleFileName, addJsExtension) - || tryGetModuleNameAsNodeModule(compilerOptions, moduleFileName, host, getCanonicalFileName, sourceDirectory) - || compilerOptions.rootDirs && tryGetModuleNameFromRootDirs(compilerOptions.rootDirs, moduleFileName, sourceDirectory, getCanonicalFileName); + || tryGetModuleNameAsNodeModule(compilerOptions, moduleFileName, host, getCanonicalFileName, sourceDirectory); } function getLocalModuleSpecifiers( @@ -76,10 +74,11 @@ namespace ts.moduleSpecifiers { { moduleResolutionKind, addJsExtension, getCanonicalFileName, sourceDirectory }: Info, compilerOptions: CompilerOptions, preferences: ModuleSpecifierPreferences, - ) { - const { baseUrl, paths } = compilerOptions; + ): ReadonlyArray { + const { baseUrl, paths, rootDirs } = compilerOptions; - const relativePath = removeExtensionAndIndexPostFix(ensurePathIsNonModuleName(getRelativePathFromDirectory(sourceDirectory, moduleFileName, getCanonicalFileName)), moduleResolutionKind, addJsExtension); + const relativePath = rootDirs && tryGetModuleNameFromRootDirs(rootDirs, moduleFileName, sourceDirectory, getCanonicalFileName) || + removeExtensionAndIndexPostFix(ensurePathIsNonModuleName(getRelativePathFromDirectory(sourceDirectory, moduleFileName, getCanonicalFileName)), moduleResolutionKind, addJsExtension); if (!baseUrl || preferences.importModuleSpecifierPreference === "relative") { return [relativePath]; } diff --git a/tests/cases/fourslash/importNameCodeFix_rootDirs.ts b/tests/cases/fourslash/importNameCodeFix_rootDirs.ts new file mode 100644 index 00000000000..d19bb8f4fa5 --- /dev/null +++ b/tests/cases/fourslash/importNameCodeFix_rootDirs.ts @@ -0,0 +1,23 @@ +/// + +// @Filename: /a.ts +////export const a = 0; + +// @Filename: /b.ts +////a; + +// @Filename: /tsconfig.json +////{ +//// "compilerOptions": { +//// "baseUrl": ".", +//// "rootDirs": ["."] +//// } +////} + +const nonRelative = 'import { a } from "a";\n\na;'; +const relative = nonRelative.replace('"a"', '"./a"'); + +goTo.file("/b.ts"); +verify.importFixAtPosition([nonRelative, relative]); +verify.importFixAtPosition([nonRelative], undefined, { importModuleSpecifierPreference: "non-relative" }); +verify.importFixAtPosition([relative], undefined, { importModuleSpecifierPreference: "relative" });