From 979dac3ceda6292bd85ea211c7addf6ada48ab34 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 19 Nov 2018 12:58:49 -0800 Subject: [PATCH] Create map from fileNames in referenced projects to resolvedProjectReference for quick determination of fileName to projectReferenceRedirect --- src/compiler/program.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 15c09a1a79..968ad2d073 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -683,6 +683,7 @@ namespace ts { // A parallel array to projectReferences storing the results of reading in the referenced tsconfig files let resolvedProjectReferences: ReadonlyArray | undefined; let projectReferenceRedirects: Map | undefined; + let mapFromFileToProjectReferenceRedirects: Map | undefined; const shouldCreateNewSourceFile = shouldProgramCreateNewSourceFiles(oldProgram, options); const structuralIsReused = tryReuseStructureFromOldProgram(); @@ -2231,7 +2232,6 @@ namespace ts { if (!referencedProject) { return undefined; } - const out = referencedProject.commandLine.options.outFile || referencedProject.commandLine.options.out; return out ? changeExtension(out, Extension.Dts) : @@ -2242,16 +2242,20 @@ namespace ts { * Get the referenced project if the file is input file from that reference project */ function getResolvedProjectReferenceToRedirect(fileName: string) { - return forEachResolvedProjectReference((referencedProject, referenceProjectPath) => { - // not input file from the referenced project, ignore - if (!referencedProject || - toPath(options.configFilePath!) === referenceProjectPath || - !contains(referencedProject.commandLine.fileNames, fileName, isSameFile)) { - return undefined; - } + if (mapFromFileToProjectReferenceRedirects === undefined) { + mapFromFileToProjectReferenceRedirects = createMap(); + forEachResolvedProjectReference((referencedProject, referenceProjectPath) => { + // not input file from the referenced project, ignore + if (referencedProject && + toPath(options.configFilePath!) !== referenceProjectPath) { + referencedProject.commandLine.fileNames.forEach(f => + mapFromFileToProjectReferenceRedirects!.set(toPath(f), referenceProjectPath)); + } + }); + } - return referencedProject; - }); + const referencedProjectPath = mapFromFileToProjectReferenceRedirects.get(toPath(fileName)); + return referencedProjectPath && getResolvedProjectReferenceByPath(referencedProjectPath); } function forEachResolvedProjectReference(