Skip to content

Commit 7356020

Browse files
committed
Write buildInfo irrespective of incremental if invoked from tsc --b
1 parent 64d29c6 commit 7356020

File tree

171 files changed

+2606
-294
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

171 files changed

+2606
-294
lines changed

src/compiler/builder.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import {
5656
HostForComputeHash,
5757
isArray,
5858
isDeclarationFileName,
59+
isIncrementalCompilation,
5960
isJsonSourceFile,
6061
isNumber,
6162
isString,
@@ -376,7 +377,7 @@ function createBuilderProgramState(
376377
}
377378
else {
378379
// We arent using old state, so atleast emit buildInfo with current information
379-
state.buildInfoEmitPending = true;
380+
state.buildInfoEmitPending = isIncrementalCompilation(compilerOptions);
380381
}
381382

382383
// Update changed files and copy semantic diagnostics if we can
@@ -1190,6 +1191,9 @@ function getBuildInfo(state: BuilderProgramStateWithDefinedProgram): BuildInfo {
11901191
const fileNames: string[] = [];
11911192
const fileNameToFileId = new Map<string, ProgramBuildInfoFileId>();
11921193
const rootFileNames = new Set(state.program.getRootFileNames().map(f => toPath(f, currentDirectory, state.program.getCanonicalFileName)));
1194+
1195+
if (!isIncrementalCompilation(state.compilerOptions)) return createBuildInfo(/*program*/ undefined);
1196+
11931197
const root: ProgramBuildInfoRoot[] = [];
11941198
if (state.compilerOptions.outFile) {
11951199
// Copy all fileInfo, version and impliedFormat

src/compiler/diagnosticMessages.json

+4
Original file line numberDiff line numberDiff line change
@@ -4617,6 +4617,10 @@
46174617
"category": "Error",
46184618
"code": 5110
46194619
},
4620+
"Option 'tsBuildInfoFile' cannot be specified without specifying option 'incremental' or 'composite' or if not running 'tsc -b'.": {
4621+
"category": "Error",
4622+
"code": 5111
4623+
},
46204624

46214625
"Generates a sourcemap for each corresponding '.d.ts' file.": {
46224626
"category": "Message",

src/compiler/emitter.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ export function forEachEmittedFile<T>(
480480

481481
export function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions) {
482482
const configFile = options.configFilePath;
483-
if (!isIncrementalCompilation(options)) return undefined;
483+
if (!canEmitTsBuildInfo(options)) return undefined;
484484
if (options.tsBuildInfoFile) return options.tsBuildInfoFile;
485485
const outPath = options.outFile;
486486
let buildInfoExtensionLess: string;
@@ -499,6 +499,11 @@ export function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions) {
499499
return buildInfoExtensionLess + Extension.TsBuildInfo;
500500
}
501501

502+
/** @internal */
503+
export function canEmitTsBuildInfo(options: CompilerOptions) {
504+
return isIncrementalCompilation(options) || !!options.tscBuild;
505+
}
506+
502507
/** @internal */
503508
export function getOutputPathsForBundle(options: CompilerOptions, forceDtsPaths: boolean): EmitFileNames {
504509
const outPath = options.outFile!;

src/compiler/program.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
AsExpression,
99
BuilderProgram,
1010
CancellationToken,
11+
canEmitTsBuildInfo,
1112
canHaveDecorators,
1213
canHaveIllegalDecorators,
1314
chainDiagnosticMessages,
@@ -195,7 +196,6 @@ import {
195196
isImportEqualsDeclaration,
196197
isImportSpecifier,
197198
isImportTypeNode,
198-
isIncrementalCompilation,
199199
isInJSFile,
200200
isJSDocImportTag,
201201
isLiteralImportTypeNode,
@@ -4324,8 +4324,8 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
43244324

43254325
const outputFile = options.outFile;
43264326
if (options.tsBuildInfoFile) {
4327-
if (!isIncrementalCompilation(options)) {
4328-
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "tsBuildInfoFile", "incremental", "composite");
4327+
if (!canEmitTsBuildInfo(options)) {
4328+
createDiagnosticForOptionName(Diagnostics.Option_tsBuildInfoFile_cannot_be_specified_without_specifying_option_incremental_or_composite_or_if_not_running_tsc_b, "tsBuildInfoFile");
43294329
}
43304330
}
43314331
else if (options.incremental && !outputFile && !options.configFilePath) {

src/compiler/tsbuildPublic.ts

+78-84
Large diffs are not rendered by default.

src/compiler/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -7411,6 +7411,7 @@ export interface CompilerOptions {
74117411
esModuleInterop?: boolean;
74127412
/** @internal */ showConfig?: boolean;
74137413
useDefineForClassFields?: boolean;
7414+
/** @internal */ tscBuild?: boolean;
74147415

74157416
[option: string]: CompilerOptionsValue | TsConfigSourceFile | undefined;
74167417
}

src/testRunner/unittests/helpers/baseline.ts

+5
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ export type ReadableProgramBuildInfo = ReadableProgramMultiFileEmitBuildInfo | R
206206
export function isReadableProgramBundleEmitBuildInfo(info: ReadableProgramBuildInfo | undefined): info is ReadableProgramBundleEmitBuildInfo {
207207
return !!info && !!info.options?.outFile;
208208
}
209+
210+
export function isReadableProgramMultiFileEmitBuildInfo(info: ReadableProgramBuildInfo | undefined): info is ReadableProgramMultiFileEmitBuildInfo {
211+
return !!info && !info.options?.outFile;
212+
}
213+
209214
export type ReadableBuildInfo = Omit<ts.BuildInfo, "program"> & { program: ReadableProgramBuildInfo | undefined; size: number; };
210215
function generateBuildInfoProgramBaseline(sys: ts.System, buildInfoPath: string, buildInfo: ts.BuildInfo) {
211216
let program: ReadableProgramBuildInfo | undefined;

src/testRunner/unittests/helpers/tsc.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
CommandLineProgram,
1111
generateSourceMapBaselineFiles,
1212
isReadableProgramBundleEmitBuildInfo,
13+
isReadableProgramMultiFileEmitBuildInfo,
1314
ReadableBuildInfo,
1415
ReadableProgramBuildInfoFileInfo,
1516
ReadableProgramBundleEmitBuildInfo,
@@ -307,6 +308,7 @@ function verifyTscEditDiscrepancies({
307308
`FileInfos:: File:: ${outputFile}`,
308309
);
309310
if (!isReadableProgramBundleEmitBuildInfo(incrementalReadableBuildInfo?.program)) {
311+
// Should not be with --outFile
310312
ts.Debug.assert(!isReadableProgramBundleEmitBuildInfo(cleanReadableBuildInfo?.program));
311313
// Verify that incrementally pending affected file emit are in clean build since clean build can contain more files compared to incremental depending of noEmitOnError option
312314
if (incrementalReadableBuildInfo?.program?.affectedFilesPendingEmit) {
@@ -337,7 +339,8 @@ function verifyTscEditDiscrepancies({
337339
}
338340
}
339341
else {
340-
ts.Debug.assert(isReadableProgramBundleEmitBuildInfo(cleanReadableBuildInfo?.program));
342+
// Should not be without --outFile
343+
ts.Debug.assert(!isReadableProgramMultiFileEmitBuildInfo(cleanReadableBuildInfo?.program));
341344
// Verify that incrementally pending affected file emit are in clean build since clean build can contain more files compared to incremental depending of noEmitOnError option
342345
if (incrementalReadableBuildInfo?.program?.pendingEmit) {
343346
if (cleanReadableBuildInfo?.program?.pendingEmit === undefined) {

src/testRunner/unittests/tsbuild/outFile.ts

+4
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,10 @@ describe("unittests:: tsbuild:: outFile::", () => {
249249
caption: "Make non incremental build with change in file that doesnt affect dts",
250250
edit: fs => appendText(fs, "/src/first/first_PART1.ts", "console.log(s);"),
251251
commandLineArgs: ["--b", "/src/third", "--verbose"],
252+
discrepancyExplanation: () => [
253+
"Clean build is non incremental so it will have non incremental tsbuildInfo for third project",
254+
"The incremental build does not build third so will only update timestamps for third tsbuildInfo and hence its from incremental build before",
255+
],
252256
},
253257
{
254258
caption: "Make incremental build with change in file that doesnt affect dts",

src/testRunner/unittests/tsbuild/referencesWithRootDirInParent.ts

+52
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { noop } from "../../_namespaces/ts.js";
12
import { dedent } from "../../_namespaces/Utils.js";
23
import * as vfs from "../../_namespaces/vfs.js";
34
import { jsonToReadableText } from "../helpers.js";
@@ -90,6 +91,57 @@ describe("unittests:: tsbuild:: with rootDir of project reference in parentDirec
9091
edits: noChangeOnlyRuns,
9192
});
9293

94+
verifyTsc({
95+
scenario: "projectReferenceWithRootDirInParent",
96+
subScenario: "reports error for same tsbuildinfo file without incremental",
97+
fs: () => projFs,
98+
commandLineArgs: ["--b", "/src/src/main", "--verbose"],
99+
modifyFs: fs => {
100+
fs.writeFileSync(
101+
"/src/src/main/tsconfig.json",
102+
jsonToReadableText({
103+
compilerOptions: { outDir: "../../dist/" },
104+
references: [{ path: "../other" }],
105+
}),
106+
);
107+
fs.writeFileSync(
108+
"/src/src/other/tsconfig.json",
109+
jsonToReadableText({
110+
compilerOptions: { composite: true, outDir: "../../dist/" },
111+
}),
112+
);
113+
},
114+
});
115+
116+
verifyTsc({
117+
scenario: "projectReferenceWithRootDirInParent",
118+
subScenario: "reports error for same tsbuildinfo file without incremental with tsc",
119+
fs: () => projFs,
120+
commandLineArgs: ["--b", "/src/src/other", "--verbose"],
121+
modifyFs: fs => {
122+
fs.writeFileSync(
123+
"/src/src/main/tsconfig.json",
124+
jsonToReadableText({
125+
compilerOptions: { outDir: "../../dist/" },
126+
references: [{ path: "../other" }],
127+
}),
128+
);
129+
fs.writeFileSync(
130+
"/src/src/other/tsconfig.json",
131+
jsonToReadableText({
132+
compilerOptions: { composite: true, outDir: "../../dist/" },
133+
}),
134+
);
135+
},
136+
edits: [
137+
{
138+
caption: "Running tsc on main",
139+
edit: noop,
140+
commandLineArgs: ["-p", "/src/src/main"],
141+
},
142+
],
143+
});
144+
93145
verifyTsc({
94146
scenario: "projectReferenceWithRootDirInParent",
95147
subScenario: "reports no error when tsbuildinfo differ",
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
error TS5069: Option 'tsBuildInfoFile' cannot be specified without specifying option 'incremental' or option 'composite'.
1+
error TS5111: Option 'tsBuildInfoFile' cannot be specified without specifying option 'incremental' or 'composite' or if not running 'tsc -b'.
22

33

4-
!!! error TS5069: Option 'tsBuildInfoFile' cannot be specified without specifying option 'incremental' or option 'composite'.
4+
!!! error TS5111: Option 'tsBuildInfoFile' cannot be specified without specifying option 'incremental' or 'composite' or if not running 'tsc -b'.
55
==== optionsTsBuildInfoFileWithoutIncrementalAndComposite.ts (0 errors) ====
66
const x = "Hello World";
77

tests/baselines/reference/tsbuild/clean/tsx-with-dts-emit.js

+11-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ Output::
3636
[HH:MM:SS AM] Projects in this build:
3737
* src/project/tsconfig.json
3838

39-
[[90mHH:MM:SS AM[0m] Project 'src/project/tsconfig.json' is out of date because output file 'src/project/src/main.js' does not exist
39+
[[90mHH:MM:SS AM[0m] Project 'src/project/tsconfig.json' is out of date because output file 'src/project/tsconfig.tsbuildinfo' does not exist
4040

4141
[HH:MM:SS AM] Building project '/src/project/tsconfig.json'...
4242

@@ -58,6 +58,15 @@ exports.x = void 0;
5858
exports.x = 10;
5959

6060

61+
//// [/src/project/tsconfig.tsbuildinfo]
62+
{"version":"FakeTSVersion"}
63+
64+
//// [/src/project/tsconfig.tsbuildinfo.readable.baseline.txt]
65+
{
66+
"version": "FakeTSVersion",
67+
"size": 27
68+
}
69+
6170

6271

6372
Change:: no-change-run
@@ -85,5 +94,6 @@ Output::
8594
exitCode:: ExitStatus.Success
8695

8796

97+
//// [/src/project/tsconfig.tsbuildinfo] unlink
8898
//// [/src/project/src/main.d.ts] unlink
8999
//// [/src/project/src/main.js] unlink

tests/baselines/reference/tsbuild/commandLine/multiFile/different-options-with-incremental.js

+11
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ Program root files: [
5454
]
5555
Program options: {
5656
"incremental": true,
57+
"tscBuild": true,
5758
"configFilePath": "/src/project/tsconfig.json"
5859
}
5960
Program structureReused: Not
@@ -233,6 +234,7 @@ Program root files: [
233234
Program options: {
234235
"incremental": true,
235236
"sourceMap": true,
237+
"tscBuild": true,
236238
"configFilePath": "/src/project/tsconfig.json"
237239
}
238240
Program structureReused: Not
@@ -416,6 +418,7 @@ Program root files: [
416418
]
417419
Program options: {
418420
"incremental": true,
421+
"tscBuild": true,
419422
"configFilePath": "/src/project/tsconfig.json"
420423
}
421424
Program structureReused: Not
@@ -585,6 +588,7 @@ Program root files: [
585588
Program options: {
586589
"incremental": true,
587590
"declaration": true,
591+
"tscBuild": true,
588592
"configFilePath": "/src/project/tsconfig.json"
589593
}
590594
Program structureReused: Not
@@ -746,6 +750,7 @@ Program options: {
746750
"incremental": true,
747751
"declaration": true,
748752
"declarationMap": true,
753+
"tscBuild": true,
749754
"configFilePath": "/src/project/tsconfig.json"
750755
}
751756
Program structureReused: Not
@@ -937,6 +942,7 @@ Program root files: [
937942
]
938943
Program options: {
939944
"incremental": true,
945+
"tscBuild": true,
940946
"configFilePath": "/src/project/tsconfig.json"
941947
}
942948
Program structureReused: Not
@@ -1089,6 +1095,7 @@ Program options: {
10891095
"incremental": true,
10901096
"declaration": true,
10911097
"declarationMap": true,
1098+
"tscBuild": true,
10921099
"configFilePath": "/src/project/tsconfig.json"
10931100
}
10941101
Program structureReused: Not
@@ -1258,6 +1265,7 @@ Program root files: [
12581265
Program options: {
12591266
"incremental": true,
12601267
"inlineSourceMap": true,
1268+
"tscBuild": true,
12611269
"configFilePath": "/src/project/tsconfig.json"
12621270
}
12631271
Program structureReused: Not
@@ -1434,6 +1442,7 @@ Program root files: [
14341442
Program options: {
14351443
"incremental": true,
14361444
"sourceMap": true,
1445+
"tscBuild": true,
14371446
"configFilePath": "/src/project/tsconfig.json"
14381447
}
14391448
Program structureReused: Not
@@ -1615,6 +1624,7 @@ Program root files: [
16151624
]
16161625
Program options: {
16171626
"incremental": true,
1627+
"tscBuild": true,
16181628
"configFilePath": "/src/project/tsconfig.json"
16191629
}
16201630
Program structureReused: Not
@@ -1789,6 +1799,7 @@ Program options: {
17891799
"incremental": true,
17901800
"declaration": true,
17911801
"declarationMap": true,
1802+
"tscBuild": true,
17921803
"configFilePath": "/src/project/tsconfig.json"
17931804
}
17941805
Program structureReused: Not

0 commit comments

Comments
 (0)