To test platform independent buildInfo baselines, move the logic to writeFile of SolutionBuilderHost

This commit is contained in:
Sheetal Nandi
2019-03-08 12:37:57 -08:00
parent 990b199ebd
commit d4cfa41931
2 changed files with 48 additions and 50 deletions

View File

@@ -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;
}
/**

View File

@@ -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<ts.BuilderProgram> {
createProgram(rootNames: ReadonlyArray<string> | undefined, options: ts.CompilerOptions | undefined, host?: CompilerHost, oldProgram?: ts.EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: ReadonlyArray<ts.Diagnostic>, projectReferences?: ReadonlyArray<ts.ProjectReference> | 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<string[]> = {};
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<string[]> = {};
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<string[]> = {};
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<string[]> = {};
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());
}