Create map from fileNames in referenced projects to resolvedProjectReference for quick determination of fileName to projectReferenceRedirect

This commit is contained in:
Sheetal Nandi 2018-11-19 12:58:49 -08:00
parent 79b9fa51b6
commit 979dac3ced

View file

@ -683,6 +683,7 @@ namespace ts {
// A parallel array to projectReferences storing the results of reading in the referenced tsconfig files // A parallel array to projectReferences storing the results of reading in the referenced tsconfig files
let resolvedProjectReferences: ReadonlyArray<ResolvedProjectReference | undefined> | undefined; let resolvedProjectReferences: ReadonlyArray<ResolvedProjectReference | undefined> | undefined;
let projectReferenceRedirects: Map<ResolvedProjectReference | false> | undefined; let projectReferenceRedirects: Map<ResolvedProjectReference | false> | undefined;
let mapFromFileToProjectReferenceRedirects: Map<Path> | undefined;
const shouldCreateNewSourceFile = shouldProgramCreateNewSourceFiles(oldProgram, options); const shouldCreateNewSourceFile = shouldProgramCreateNewSourceFiles(oldProgram, options);
const structuralIsReused = tryReuseStructureFromOldProgram(); const structuralIsReused = tryReuseStructureFromOldProgram();
@ -2231,7 +2232,6 @@ namespace ts {
if (!referencedProject) { if (!referencedProject) {
return undefined; return undefined;
} }
const out = referencedProject.commandLine.options.outFile || referencedProject.commandLine.options.out; const out = referencedProject.commandLine.options.outFile || referencedProject.commandLine.options.out;
return out ? return out ?
changeExtension(out, Extension.Dts) : changeExtension(out, Extension.Dts) :
@ -2242,16 +2242,20 @@ namespace ts {
* Get the referenced project if the file is input file from that reference project * Get the referenced project if the file is input file from that reference project
*/ */
function getResolvedProjectReferenceToRedirect(fileName: string) { function getResolvedProjectReferenceToRedirect(fileName: string) {
return forEachResolvedProjectReference((referencedProject, referenceProjectPath) => { if (mapFromFileToProjectReferenceRedirects === undefined) {
// not input file from the referenced project, ignore mapFromFileToProjectReferenceRedirects = createMap();
if (!referencedProject || forEachResolvedProjectReference((referencedProject, referenceProjectPath) => {
toPath(options.configFilePath!) === referenceProjectPath || // not input file from the referenced project, ignore
!contains(referencedProject.commandLine.fileNames, fileName, isSameFile)) { if (referencedProject &&
return undefined; 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<T>( function forEachResolvedProjectReference<T>(