mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-23 07:07:09 -05:00
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:
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user