diff --git a/src/compiler/builder.ts b/src/compiler/builder.ts index b3ab501546e..a97e07b132b 100644 --- a/src/compiler/builder.ts +++ b/src/compiler/builder.ts @@ -734,7 +734,7 @@ namespace ts { const computeHash = host.createHash || generateDjb2Hash; let state = createBuilderProgramState(newProgram, getCanonicalFileName, oldState); let backupState: BuilderProgramState | undefined; - newProgram.getProgramBuildInfo = () => result.getProgramBuildInfo(); + newProgram.getProgramBuildInfo = () => getProgramBuildInfo(state); // To ensure that we arent storing any references to old program or new program without state newProgram = undefined!; // TODO: GH#18217 @@ -758,7 +758,6 @@ namespace ts { releaseCache(state); backupState = undefined; }; - result.getProgramBuildInfo = () => getProgramBuildInfo(state); if (kind === BuilderProgramKind.SemanticDiagnosticsBuilderProgram) { (result as SemanticDiagnosticsBuilderProgram).getSemanticDiagnosticsOfNextAffectedFile = getSemanticDiagnosticsOfNextAffectedFile; @@ -997,7 +996,6 @@ namespace ts { getCurrentDirectory: notImplemented, emitNextAffectedFile: notImplemented, getSemanticDiagnosticsOfNextAffectedFile: notImplemented, - getProgramBuildInfo: notImplemented }; } @@ -1021,7 +1019,6 @@ namespace ts { emit: (sourceFile, writeFile, cancellationToken, emitOnlyDts, customTransformers) => getProgram().emit(sourceFile, writeFile, cancellationToken, emitOnlyDts, customTransformers), getAllDependencies: notImplemented, getCurrentDirectory: () => getProgram().getCurrentDirectory(), - getProgramBuildInfo: () => undefined }; function getProgram() { @@ -1135,10 +1132,6 @@ namespace ts { * Get the current directory of the program */ getCurrentDirectory(): string; - /** - * Returns the program info to be serialised - */ - /*@internal*/ getProgramBuildInfo(): ProgramBuildInfo | undefined; } /** diff --git a/src/harness/fakes.ts b/src/harness/fakes.ts index a541a518379..88dbc114045 100644 --- a/src/harness/fakes.ts +++ b/src/harness/fakes.ts @@ -384,49 +384,12 @@ namespace fakes { return text; } + function compareProgramBuildInfoDiagnostic(a: ts.ProgramBuildInfoDiagnostic, b: ts.ProgramBuildInfoDiagnostic) { + return ts.compareStringsCaseSensitive(ts.isString(a) ? a : a[0], ts.isString(b) ? b : b[0]); + } + export class SolutionBuilderHost extends CompilerHost implements ts.SolutionBuilderHost { - createProgram(rootNames: ReadonlyArray | undefined, options: ts.CompilerOptions | undefined, host?: CompilerHost, oldProgram?: ts.EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: ReadonlyArray, projectReferences?: ReadonlyArray | undefined) { - const program = ts.createEmitAndSemanticDiagnosticsBuilderProgram(rootNames, options, host, oldProgram, configFileParsingDiagnostics, projectReferences); - const originalGetProgramBuildInfo = program.getProgramBuildInfo.bind(program); - program.getProgramBuildInfo = () => { - const program = originalGetProgramBuildInfo() as ts.ProgramBuildInfo | undefined; - if (!program) return program; - // Fix lib signatures - for (const path of ts.getOwnKeys(program.fileInfos)) { - if (ts.startsWith(path, "/lib/")) { - const currentValue = program.fileInfos[path]; - ts.Debug.assert(currentValue.signature === currentValue.version); - program.fileInfos[path] = { version: path, signature: path }; - } - } - - // reference Map - if (program.referencedMap) { - const referencedMap: ts.MapLike = {}; - for (const path of ts.getOwnKeys(program.referencedMap).sort()) { - referencedMap[path] = program.referencedMap[path].sort(); - } - program.referencedMap = referencedMap; - } - - // exportedModulesMap - if (program.exportedModulesMap) { - const exportedModulesMap: ts.MapLike = {}; - for (const path of ts.getOwnKeys(program.exportedModulesMap).sort()) { - exportedModulesMap[path] = program.exportedModulesMap[path].sort(); - } - program.exportedModulesMap = exportedModulesMap; - } - - // semanticDiagnosticsPerFile - if (program.semanticDiagnosticsPerFile) { - program.semanticDiagnosticsPerFile.sort(); - } - - return program; - }; - return program; - } + createProgram = ts.createEmitAndSemanticDiagnosticsBuilderProgram; readFile(path: string) { const value = super.readFile(path); @@ -447,6 +410,48 @@ namespace fakes { return ts.getBuildInfoText(buildInfo); } + public writeFile(fileName: string, content: string, writeByteOrderMark: boolean) { + if (ts.isBuildInfoFile(fileName)) { + const buildInfo = JSON.parse(content) as ts.BuildInfo; + if (buildInfo.program) { + // Fix lib signatures + for (const path of ts.getOwnKeys(buildInfo.program.fileInfos)) { + if (ts.startsWith(path, "/lib/")) { + const currentValue = buildInfo.program.fileInfos[path]; + ts.Debug.assert(currentValue.signature === currentValue.version); + buildInfo.program.fileInfos[path] = { version: path, signature: path }; + } + } + + // reference Map + if (buildInfo.program.referencedMap) { + const referencedMap: ts.MapLike = {}; + for (const path of ts.getOwnKeys(buildInfo.program.referencedMap).sort()) { + referencedMap[path] = buildInfo.program.referencedMap[path].sort(); + } + buildInfo.program.referencedMap = referencedMap; + } + + // exportedModulesMap + if (buildInfo.program.exportedModulesMap) { + const exportedModulesMap: ts.MapLike = {}; + for (const path of ts.getOwnKeys(buildInfo.program.exportedModulesMap).sort()) { + exportedModulesMap[path] = buildInfo.program.exportedModulesMap[path].sort(); + } + buildInfo.program.exportedModulesMap = exportedModulesMap; + } + + // semanticDiagnosticsPerFile + if (buildInfo.program.semanticDiagnosticsPerFile) { + buildInfo.program.semanticDiagnosticsPerFile.sort(compareProgramBuildInfoDiagnostic); + } + + content = ts.getBuildInfoText(buildInfo); + } + } + super.writeFile(fileName, content, writeByteOrderMark); + } + now() { return new Date(this.sys.vfs.time()); }