mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Delay the calculation of common source root if it would be needed when calculation dts files (#59070)
This commit is contained in:
@@ -4418,7 +4418,8 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
|
||||
options.outDir || // there is --outDir specified
|
||||
options.rootDir || // there is --rootDir specified
|
||||
options.sourceRoot || // there is --sourceRoot specified
|
||||
options.mapRoot // there is --mapRoot specified
|
||||
options.mapRoot || // there is --mapRoot specified
|
||||
(getEmitDeclarations(options) && options.declarationDir) // there is --declarationDir specified
|
||||
) {
|
||||
// Precalculate and cache the common source directory
|
||||
const dir = getCommonSourceDirectory();
|
||||
|
||||
@@ -6315,15 +6315,15 @@ export function getOwnEmitOutputFilePath(fileName: string, host: EmitHost, exten
|
||||
|
||||
/** @internal */
|
||||
export function getDeclarationEmitOutputFilePath(fileName: string, host: EmitHost) {
|
||||
return getDeclarationEmitOutputFilePathWorker(fileName, host.getCompilerOptions(), host.getCurrentDirectory(), host.getCommonSourceDirectory(), f => host.getCanonicalFileName(f));
|
||||
return getDeclarationEmitOutputFilePathWorker(fileName, host.getCompilerOptions(), host);
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
export function getDeclarationEmitOutputFilePathWorker(fileName: string, options: CompilerOptions, currentDirectory: string, commonSourceDirectory: string, getCanonicalFileName: GetCanonicalFileName): string {
|
||||
export function getDeclarationEmitOutputFilePathWorker(fileName: string, options: CompilerOptions, host: Pick<EmitHost, "getCommonSourceDirectory" | "getCurrentDirectory" | "getCanonicalFileName">): string {
|
||||
const outputDir = options.declarationDir || options.outDir; // Prefer declaration folder if specified
|
||||
|
||||
const path = outputDir
|
||||
? getSourceFilePathInNewDirWorker(fileName, outputDir, currentDirectory, commonSourceDirectory, getCanonicalFileName)
|
||||
? getSourceFilePathInNewDirWorker(fileName, outputDir, host.getCurrentDirectory(), host.getCommonSourceDirectory(), f => host.getCanonicalFileName(f))
|
||||
: fileName;
|
||||
const declarationExtension = getDeclarationEmitExtensionForPath(path);
|
||||
return removeFileExtension(path) + declarationExtension;
|
||||
|
||||
@@ -1699,7 +1699,7 @@ export abstract class Project implements LanguageServiceHost, ModuleResolutionHo
|
||||
!sourceFile ||
|
||||
sourceFile.resolvedPath !== source ||
|
||||
!this.isValidGeneratedFileWatcher(
|
||||
getDeclarationEmitOutputFilePathWorker(sourceFile.fileName, this.compilerOptions, this.currentDirectory, this.program!.getCommonSourceDirectory(), this.getCanonicalFileName),
|
||||
getDeclarationEmitOutputFilePathWorker(sourceFile.fileName, this.compilerOptions, this.program!),
|
||||
watcher,
|
||||
)
|
||||
) {
|
||||
|
||||
@@ -117,7 +117,7 @@ export function getSourceMapper(host: SourceMapperHost): SourceMapper {
|
||||
|
||||
const declarationPath = outPath ?
|
||||
removeFileExtension(outPath) + Extension.Dts :
|
||||
getDeclarationEmitOutputFilePathWorker(info.fileName, program.getCompilerOptions(), currentDirectory, program.getCommonSourceDirectory(), getCanonicalFileName);
|
||||
getDeclarationEmitOutputFilePathWorker(info.fileName, program.getCompilerOptions(), program);
|
||||
if (declarationPath === undefined) return undefined;
|
||||
|
||||
const newLoc = getDocumentPositionMapper(declarationPath, info.fileName).getGeneratedPosition(info);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import * as ts from "../../_namespaces/ts.js";
|
||||
import { jsonToReadableText } from "../helpers.js";
|
||||
import { libContent } from "../helpers/contents.js";
|
||||
import {
|
||||
baselineTsserverLogs,
|
||||
closeFilesForSession,
|
||||
@@ -833,3 +834,29 @@ describe("unittests:: tsserver:: projectErrors:: with file rename on wsl2::", ()
|
||||
baselineTsserverLogs("projectErrors", "file rename on wsl2", session);
|
||||
});
|
||||
});
|
||||
|
||||
describe("unittests:: tsserver:: projectErrors:: dts errors when files dont belong to common root", () => {
|
||||
[undefined, "decls"].forEach(declarationDir => {
|
||||
it(`dts errors when files dont belong to common root${declarationDir ? " with declarationDir" : ""}`, () => {
|
||||
const host = createServerHost({
|
||||
"/home/src/projects/project/src/file.ts": `import { a } from "../a";`,
|
||||
"/home/src/projects/project/a.ts": `export const a = 10;`,
|
||||
"/home/src/projects/project/src/tsconfig.json": jsonToReadableText({
|
||||
compilerOptions: {
|
||||
composite: true,
|
||||
noEmit: true,
|
||||
declarationDir,
|
||||
},
|
||||
}),
|
||||
[libFile.path]: libContent,
|
||||
});
|
||||
const session = new TestSession(host);
|
||||
openFilesForSession(["/home/src/projects/project/src/file.ts"], session);
|
||||
verifyGetErrRequest({
|
||||
session,
|
||||
files: ["/home/src/projects/project/src/file.ts"],
|
||||
});
|
||||
baselineTsserverLogs("projectErrors", `dts errors when files dont belong to common root${declarationDir ? " with declarationDir" : ""}`, session);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user