Build info baseline improvements (#43200)

* Use ids as 1 based so we can specialize `0` to be some special meaning

* Baseline tsbuildinfo size in the readable baseline

* Baseline fileName and fileNames list as well in readable tsbuildinfo so that new additions are easy to recognize
This commit is contained in:
Sheetal Nandi
2021-03-11 13:30:06 -08:00
committed by GitHub
parent 2643e65da4
commit 9933c8ac7d
235 changed files with 5005 additions and 934 deletions

View File

@@ -733,7 +733,7 @@ namespace ts {
const fileInfos = arrayFrom(state.fileInfos.entries(), ([key, value]) => {
// Ensure fileId
const fileId = toFileId(key);
Debug.assert(fileNames[fileId] === relativeToBuildInfo(key));
Debug.assert(fileNames[fileId - 1] === relativeToBuildInfo(key));
const signature = state.currentAffectedFilesSignatures && state.currentAffectedFilesSignatures.get(key);
return signature === undefined ? value : { version: value.version, signature, affectsGlobalScope: value.affectsGlobalScope };
});
@@ -804,19 +804,23 @@ namespace ts {
}
function toFileId(path: Path): number {
const existing = fileNameToFileId.get(path);
if (existing !== undefined) return existing;
fileNameToFileId.set(path, fileNames.length);
return fileNames.push(relativeToBuildInfo(path)) - 1;
let fileId = fileNameToFileId.get(path);
if (fileId === undefined) {
fileNames.push(relativeToBuildInfo(path));
fileNameToFileId.set(path, fileId = fileNames.length);
}
return fileId;
}
function toFileIdListId(set: ReadonlySet<Path>): number {
const fileIds = arrayFrom(set.keys(), toFileId).sort(compareValues);
const key = fileIds.join();
const existing = fileNamesToFileIdListId?.get(key);
if (existing !== undefined) return existing;
(fileNamesToFileIdListId ||= new Map()).set(key, fileIdsList?.length || 0);
return (fileIdsList ||= []).push(fileIds) - 1;
let fileIdListId = fileNamesToFileIdListId?.get(key);
if (fileIdListId === undefined) {
(fileIdsList ||= []).push(fileIds);
(fileNamesToFileIdListId ||= new Map()).set(key, fileIdListId = fileIdsList.length);
}
return fileIdListId;
}
}
@@ -1216,7 +1220,7 @@ namespace ts {
const filePaths = program.fileNames.map(toPath);
const filePathsSetList = program.fileIdsList?.map(fileIds => new Set(fileIds.map(toFilePath)));
const fileInfos = new Map<Path, BuilderState.FileInfo>();
program.fileInfos.forEach((fileInfo, fileId) => fileInfos.set(toFilePath(fileId), fileInfo));
program.fileInfos.forEach((fileInfo, index) => fileInfos.set(toFilePath(index + 1), fileInfo));
const state: ReusableBuilderProgramState = {
fileInfos,
compilerOptions: convertToOptionsWithAbsolutePaths(program.options, toAbsolutePath),
@@ -1262,11 +1266,11 @@ namespace ts {
}
function toFilePath(fileId: number) {
return filePaths[fileId];
return filePaths[fileId - 1];
}
function toFilePathsSet(fileIdsListId: number) {
return filePathsSetList![fileIdsListId];
return filePathsSetList![fileIdsListId - 1];
}
function toMapOfReferencedSet(referenceMap: ProgramBuildInfoReferencedMap | undefined): ReadonlyESMap<Path, BuilderState.ReferencedSet> | undefined {

View File

@@ -240,6 +240,8 @@ interface Symbol {
type ProgramBuildInfoDiagnostic = string | [string, readonly ReusableDiagnostic[]];
type ProgramBuilderInfoFilePendingEmit = [string, BuilderFileEmit];
interface ProgramBuildInfo {
fileNames: readonly string[];
fileNamesList: readonly (readonly string[])[] | undefined;
fileInfos: MapLike<BuilderState.FileInfo>;
options: CompilerOptions;
referencedMap?: MapLike<string[]>;
@@ -248,11 +250,11 @@ interface Symbol {
affectedFilesPendingEmit?: ProgramBuilderInfoFilePendingEmit[];
}
const fileInfos: ProgramBuildInfo["fileInfos"] = {};
buildInfo.program?.fileInfos.forEach((fileInfo, fileId) => {
fileInfos[toFileName(fileId)] = fileInfo;
});
buildInfo.program?.fileInfos.forEach((fileInfo, index) => fileInfos[toFileName(index + 1)] = fileInfo);
const fileNamesList = buildInfo.program?.fileIdsList?.map(fileIdsListId => fileIdsListId.map(toFileName));
const program: ProgramBuildInfo | undefined = buildInfo.program && {
fileNames: buildInfo.program.fileNames,
fileNamesList,
fileInfos,
options: buildInfo.program.options,
referencedMap: toMapOfReferencedSet(buildInfo.program.referencedMap),
@@ -267,20 +269,22 @@ interface Symbol {
emitKind
]),
};
const result: Omit<BuildInfo, "program"> & { program: ProgramBuildInfo | undefined; } = {
const version = buildInfo.version === ts.version ? fakes.version : buildInfo.version;
const result: Omit<BuildInfo, "program"> & { program: ProgramBuildInfo | undefined; size: number; } = {
bundle: buildInfo.bundle,
program,
version: buildInfo.version === version ? fakes.version : buildInfo.version,
version,
size: getBuildInfoText({ ...buildInfo, version }).length,
};
// For now its just JSON.stringify
originalWriteFile.call(sys, `${buildInfoPath}.readable.baseline.txt`, JSON.stringify(result, /*replacer*/ undefined, 2));
function toFileName(fileId: number) {
return buildInfo.program!.fileNames[fileId];
return buildInfo.program!.fileNames[fileId - 1];
}
function toFileNames(fileIdsListId: number) {
return fileNamesList![fileIdsListId];
return fileNamesList![fileIdsListId - 1];
}
function toMapOfReferencedSet(referenceMap: ProgramBuildInfoReferencedMap | undefined): MapLike<string[]> | undefined {