Skip to content

Commit 979dac3

Browse files
committed
Create map from fileNames in referenced projects to resolvedProjectReference for quick determination of fileName to projectReferenceRedirect
1 parent 79b9fa5 commit 979dac3

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

src/compiler/program.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,7 @@ namespace ts {
683683
// A parallel array to projectReferences storing the results of reading in the referenced tsconfig files
684684
let resolvedProjectReferences: ReadonlyArray<ResolvedProjectReference | undefined> | undefined;
685685
let projectReferenceRedirects: Map<ResolvedProjectReference | false> | undefined;
686+
let mapFromFileToProjectReferenceRedirects: Map<Path> | undefined;
686687

687688
const shouldCreateNewSourceFile = shouldProgramCreateNewSourceFiles(oldProgram, options);
688689
const structuralIsReused = tryReuseStructureFromOldProgram();
@@ -2231,7 +2232,6 @@ namespace ts {
22312232
if (!referencedProject) {
22322233
return undefined;
22332234
}
2234-
22352235
const out = referencedProject.commandLine.options.outFile || referencedProject.commandLine.options.out;
22362236
return out ?
22372237
changeExtension(out, Extension.Dts) :
@@ -2242,16 +2242,20 @@ namespace ts {
22422242
* Get the referenced project if the file is input file from that reference project
22432243
*/
22442244
function getResolvedProjectReferenceToRedirect(fileName: string) {
2245-
return forEachResolvedProjectReference((referencedProject, referenceProjectPath) => {
2246-
// not input file from the referenced project, ignore
2247-
if (!referencedProject ||
2248-
toPath(options.configFilePath!) === referenceProjectPath ||
2249-
!contains(referencedProject.commandLine.fileNames, fileName, isSameFile)) {
2250-
return undefined;
2251-
}
2245+
if (mapFromFileToProjectReferenceRedirects === undefined) {
2246+
mapFromFileToProjectReferenceRedirects = createMap();
2247+
forEachResolvedProjectReference((referencedProject, referenceProjectPath) => {
2248+
// not input file from the referenced project, ignore
2249+
if (referencedProject &&
2250+
toPath(options.configFilePath!) !== referenceProjectPath) {
2251+
referencedProject.commandLine.fileNames.forEach(f =>
2252+
mapFromFileToProjectReferenceRedirects!.set(toPath(f), referenceProjectPath));
2253+
}
2254+
});
2255+
}
22522256

2253-
return referencedProject;
2254-
});
2257+
const referencedProjectPath = mapFromFileToProjectReferenceRedirects.get(toPath(fileName));
2258+
return referencedProjectPath && getResolvedProjectReferenceByPath(referencedProjectPath);
22552259
}
22562260

22572261
function forEachResolvedProjectReference<T>(

0 commit comments

Comments
 (0)