Skip to content

Commit 18f559f

Browse files
authored
Store array only if dtsOnly emit is pending to compress buildinfo (#51246)
1 parent e50bb07 commit 18f559f

File tree

38 files changed

+196
-147
lines changed

38 files changed

+196
-147
lines changed

src/compiler/builder.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,7 @@ namespace ts {
770770
export type ProgramBuildInfoFileId = number & { __programBuildInfoFileIdBrand: any };
771771
export type ProgramBuildInfoFileIdListId = number & { __programBuildInfoFileIdListIdBrand: any };
772772
export type ProgramBuildInfoDiagnostic = ProgramBuildInfoFileId | [fileId: ProgramBuildInfoFileId, diagnostics: readonly ReusableDiagnostic[]];
773-
export type ProgramBuilderInfoFilePendingEmit = [fileId: ProgramBuildInfoFileId, emitKind: BuilderFileEmit];
773+
export type ProgramBuilderInfoFilePendingEmit = ProgramBuildInfoFileId | [fileId: ProgramBuildInfoFileId];
774774
export type ProgramBuildInfoReferencedMap = [fileId: ProgramBuildInfoFileId, fileIdListId: ProgramBuildInfoFileIdListId][];
775775
export type ProgramBuildInfoBuilderStateFileInfo = Omit<BuilderState.FileInfo, "signature"> & {
776776
/**
@@ -923,7 +923,10 @@ namespace ts {
923923
const seenFiles = new Set<Path>();
924924
for (const path of state.affectedFilesPendingEmit.slice(state.affectedFilesPendingEmitIndex).sort(compareStringsCaseSensitive)) {
925925
if (tryAddToSet(seenFiles, path)) {
926-
(affectedFilesPendingEmit ||= []).push([toFileId(path), state.affectedFilesPendingEmitKind!.get(path)!]);
926+
const fileId = toFileId(path), emitKind = state.affectedFilesPendingEmitKind!.get(path)!;
927+
(affectedFilesPendingEmit ||= []).push(
928+
emitKind === BuilderFileEmit.Full ? fileId : [fileId]
929+
);
927930
}
928931
}
929932
}
@@ -1475,6 +1478,10 @@ namespace ts {
14751478
{ version: fileInfo.version, signature: fileInfo.signature === false ? undefined : fileInfo.version, affectsGlobalScope: fileInfo.affectsGlobalScope, impliedFormat: fileInfo.impliedFormat };
14761479
}
14771480

1481+
export function toBuilderFileEmit(value: ProgramBuilderInfoFilePendingEmit): BuilderFileEmit{
1482+
return isNumber(value) ? BuilderFileEmit.Full : BuilderFileEmit.DtsOnly;
1483+
}
1484+
14781485
export function createBuilderProgramUsingProgramBuildInfo(program: ProgramBuildInfo, buildInfoPath: string, host: ReadBuildProgramHost): EmitAndSemanticDiagnosticsBuilderProgram {
14791486
const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory()));
14801487
const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames());
@@ -1513,8 +1520,8 @@ namespace ts {
15131520
exportedModulesMap: toManyToManyPathMap(program.exportedModulesMap),
15141521
semanticDiagnosticsPerFile: program.semanticDiagnosticsPerFile && arrayToMap(program.semanticDiagnosticsPerFile, value => toFilePath(isNumber(value) ? value : value[0]), value => isNumber(value) ? emptyArray : value[1]),
15151522
hasReusableDiagnostic: true,
1516-
affectedFilesPendingEmit: map(program.affectedFilesPendingEmit, value => toFilePath(value[0])),
1517-
affectedFilesPendingEmitKind: program.affectedFilesPendingEmit && arrayToMap(program.affectedFilesPendingEmit, value => toFilePath(value[0]), value => value[1]),
1523+
affectedFilesPendingEmit: map(program.affectedFilesPendingEmit, value => toFilePath(isNumber(value) ? value : value[0])),
1524+
affectedFilesPendingEmitKind: program.affectedFilesPendingEmit && arrayToMap(program.affectedFilesPendingEmit, value => toFilePath(isNumber(value) ? value : value[0]), toBuilderFileEmit),
15181525
affectedFilesPendingEmitIndex: program.affectedFilesPendingEmit && 0,
15191526
changedFilesSet: new Set(map(program.changeFileSet, toFilePath)),
15201527
latestChangedDtsFile,

src/testRunner/unittests/tsbuild/helpers.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ interface Symbol {
198198
}
199199

200200
type ReadableProgramBuildInfoDiagnostic = string | [string, readonly ReusableDiagnostic[]];
201-
type ReadableProgramBuilderInfoFilePendingEmit = [string, "DtsOnly" | "Full"];
201+
type ReadableProgramBuilderInfoFilePendingEmit = [original: string | [string], emitKind: "DtsOnly" | "Full"];
202202
type ReadableProgramBuildInfoEmitSignature = string | [string, string];
203203
type ReadableProgramBuildInfoFileInfo = Omit<BuilderState.FileInfo, "impliedFormat"> & { impliedFormat: string | undefined; };
204204
type ReadableProgramMultiFileEmitBuildInfo = Omit<ProgramMultiFileEmitBuildInfo,
@@ -252,12 +252,7 @@ interface Symbol {
252252
toFileName(d) :
253253
[toFileName(d[0]), d[1]]
254254
),
255-
affectedFilesPendingEmit: buildInfo.program.affectedFilesPendingEmit?.map(([fileId, emitKind]) => [
256-
toFileName(fileId),
257-
emitKind === BuilderFileEmit.DtsOnly ? "DtsOnly" :
258-
emitKind === BuilderFileEmit.Full ? "Full" :
259-
Debug.assertNever(emitKind)
260-
]),
255+
affectedFilesPendingEmit: buildInfo.program.affectedFilesPendingEmit?.map(toReadableProgramBuilderInfoFilePendingEmit),
261256
changeFileSet: buildInfo.program.changeFileSet?.map(toFileName),
262257
emitSignatures: buildInfo.program.emitSignatures?.map(s =>
263258
isNumber(s) ?
@@ -316,6 +311,16 @@ interface Symbol {
316311
}
317312
return result;
318313
}
314+
315+
function toReadableProgramBuilderInfoFilePendingEmit(value: ProgramBuilderInfoFilePendingEmit): ReadableProgramBuilderInfoFilePendingEmit {
316+
const emitKind = toBuilderFileEmit(value);
317+
return [
318+
isNumber(value) ? toFileName(value) : [toFileName(value[0])],
319+
emitKind === BuilderFileEmit.DtsOnly ? "DtsOnly" :
320+
emitKind === BuilderFileEmit.Full ? "Full" :
321+
Debug.assertNever(emitKind),
322+
];
323+
}
319324
}
320325

321326
export function toPathWithSystem(sys: System, fileName: string): Path {
@@ -438,8 +443,13 @@ interface Symbol {
438443
);
439444
}
440445
let expectedIndex = 0;
441-
incrementalReadableBuildInfo.program.affectedFilesPendingEmit.forEach(([actualFile]) => {
442-
expectedIndex = findIndex((cleanReadableBuildInfo!.program! as ReadableProgramMultiFileEmitBuildInfo).affectedFilesPendingEmit, ([expectedFile]) => actualFile === expectedFile, expectedIndex);
446+
incrementalReadableBuildInfo.program.affectedFilesPendingEmit.forEach(([actualFileOrArray]) => {
447+
const actualFile = isString(actualFileOrArray) ? actualFileOrArray : actualFileOrArray[0];
448+
expectedIndex = findIndex(
449+
(cleanReadableBuildInfo!.program! as ReadableProgramMultiFileEmitBuildInfo).affectedFilesPendingEmit,
450+
([expectedFileOrArray]) => actualFile === (isString(expectedFileOrArray) ? expectedFileOrArray : expectedFileOrArray[0]),
451+
expectedIndex
452+
);
443453
if (expectedIndex === -1) {
444454
addBaseline(
445455
`Incremental build contains ${actualFile} file as pending emit, clean build does not have it: ${outputFile}::`,

tests/baselines/reference/tsbuild/demo/in-bad-ref-branch-reports-the-error-about-files-not-in-rootDir-at-the-import-location.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ exitCode:: ExitStatus.DiagnosticsPresent_OutputsSkipped
222222

223223

224224
//// [/src/lib/core/tsconfig.tsbuildinfo]
225-
{"program":{"fileNames":["../../../lib/lib.d.ts","../../animals/animal.ts","../../animals/dog.ts","../../animals/index.ts","../../core/utilities.ts"],"fileInfos":[{"version":"3858781397-/// <reference no-default-lib=\"true\"/>\ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array<T> { length: number; [n: number]: T; }\ninterface ReadonlyArray<T> {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},"-14984181202-export type Size = \"small\" | \"medium\" | \"large\";\r\nexport default interface Animal {\r\n size: Size;\r\n}\r\n","-10991948013-import Animal from '.';\r\nimport { makeRandomName } from '../core/utilities';\r\n\r\nexport interface Dog extends Animal {\r\n woof(): void;\r\n name: string;\r\n}\r\n\r\nexport function createDog(): Dog {\r\n return ({\r\n size: \"medium\",\r\n woof: function(this: Dog) {\r\n console.log(`${this.name} says \"Woof\"!`);\r\n },\r\n name: makeRandomName()\r\n });\r\n}\r\n\r\n","-5382672599-import Animal from './animal';\r\n\r\nexport default Animal;\r\nimport { createDog, Dog } from './dog';\r\nexport { createDog, Dog };\r\n","-15713992787-import * as A from '../animals';\n\r\nexport function makeRandomName() {\r\n return \"Bob!?! \";\r\n}\r\n\r\nexport function lastElementOf<T>(arr: T[]): T | undefined {\r\n if (arr.length === 0) return undefined;\r\n return arr[arr.length - 1];\r\n}\r\n\r\n"],"options":{"composite":true,"declaration":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitReturns":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","rootDir":"../../core","strict":true,"target":1},"fileIdsList":[[4,5],[2,3],[4]],"referencedMap":[[3,1],[4,2],[5,3]],"exportedModulesMap":[[3,1],[4,2],[5,3]],"semanticDiagnosticsPerFile":[1,2,3,4,[5,[{"file":"../../core/utilities.ts","start":0,"length":32,"messageText":"'A' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true}]]],"affectedFilesPendingEmit":[[2,1],[3,1],[4,1],[5,1]],"emitSignatures":[2,3,4,5]},"version":"FakeTSVersion"}
225+
{"program":{"fileNames":["../../../lib/lib.d.ts","../../animals/animal.ts","../../animals/dog.ts","../../animals/index.ts","../../core/utilities.ts"],"fileInfos":[{"version":"3858781397-/// <reference no-default-lib=\"true\"/>\ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array<T> { length: number; [n: number]: T; }\ninterface ReadonlyArray<T> {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},"-14984181202-export type Size = \"small\" | \"medium\" | \"large\";\r\nexport default interface Animal {\r\n size: Size;\r\n}\r\n","-10991948013-import Animal from '.';\r\nimport { makeRandomName } from '../core/utilities';\r\n\r\nexport interface Dog extends Animal {\r\n woof(): void;\r\n name: string;\r\n}\r\n\r\nexport function createDog(): Dog {\r\n return ({\r\n size: \"medium\",\r\n woof: function(this: Dog) {\r\n console.log(`${this.name} says \"Woof\"!`);\r\n },\r\n name: makeRandomName()\r\n });\r\n}\r\n\r\n","-5382672599-import Animal from './animal';\r\n\r\nexport default Animal;\r\nimport { createDog, Dog } from './dog';\r\nexport { createDog, Dog };\r\n","-15713992787-import * as A from '../animals';\n\r\nexport function makeRandomName() {\r\n return \"Bob!?! \";\r\n}\r\n\r\nexport function lastElementOf<T>(arr: T[]): T | undefined {\r\n if (arr.length === 0) return undefined;\r\n return arr[arr.length - 1];\r\n}\r\n\r\n"],"options":{"composite":true,"declaration":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitReturns":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","rootDir":"../../core","strict":true,"target":1},"fileIdsList":[[4,5],[2,3],[4]],"referencedMap":[[3,1],[4,2],[5,3]],"exportedModulesMap":[[3,1],[4,2],[5,3]],"semanticDiagnosticsPerFile":[1,2,3,4,[5,[{"file":"../../core/utilities.ts","start":0,"length":32,"messageText":"'A' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true}]]],"affectedFilesPendingEmit":[2,3,4,5],"emitSignatures":[2,3,4,5]},"version":"FakeTSVersion"}
226226

227227
//// [/src/lib/core/tsconfig.tsbuildinfo.readable.baseline.txt]
228228
{
@@ -355,6 +355,6 @@ exitCode:: ExitStatus.DiagnosticsPresent_OutputsSkipped
355355
]
356356
},
357357
"version": "FakeTSVersion",
358-
"size": 2314
358+
"size": 2298
359359
}
360360

0 commit comments

Comments
 (0)