Skip to content

Commit 8e7db4d

Browse files
committed
Because .tsbuildinfo is flag now, use .tsbuildinfo just like any other output to determine if project needs rebuild
1 parent 026c1dd commit 8e7db4d

117 files changed

Lines changed: 125 additions & 62017 deletions

File tree

Some content is hidden

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

src/compiler/tsbuild.ts

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -713,8 +713,7 @@ namespace ts {
713713
}
714714

715715
// Collect the expected outputs of this project
716-
// Do not use presence or absence of buildInfo to determine status of build
717-
const outputs = getAllProjectOutputs(project, /*ignoreBuildInfo*/ true);
716+
const outputs = getAllProjectOutputs(project);
718717

719718
if (outputs.length === 0) {
720719
return {
@@ -1300,11 +1299,6 @@ namespace ts {
13001299
priorNewestUpdateTime = newer(priorNewestUpdateTime, host.getModifiedTime(file) || missingFileModifiedTime);
13011300
}
13021301

1303-
// For info file, ignore if we cant update modified time
1304-
if (isBuildInfoFile(file) && !host.fileExists(file)) {
1305-
continue;
1306-
}
1307-
13081302
host.setModifiedTime(file, now);
13091303
if (proj.options.listEmittedFiles) {
13101304
writeFileName(`TSFILE: ${file}`);
@@ -1478,19 +1472,17 @@ namespace ts {
14781472
return combinePaths(project, "tsconfig.json") as ResolvedConfigFileName;
14791473
}
14801474

1481-
export function getAllProjectOutputs(project: ParsedCommandLine, ignoreBuildInfo?: true): ReadonlyArray<string> {
1475+
export function getAllProjectOutputs(project: ParsedCommandLine): ReadonlyArray<string> {
14821476
if (project.options.outFile || project.options.out) {
1483-
return getOutFileOutputs(project, ignoreBuildInfo);
1477+
return getOutFileOutputs(project);
14841478
}
14851479
else {
14861480
const outputs: string[] = [];
14871481
for (const inputFile of project.fileNames) {
14881482
outputs.push(...getOutputFileNames(inputFile, project));
14891483
}
1490-
if (!ignoreBuildInfo) {
1491-
const buildInfoPath = getOutputPathForBuildInfo(project.options);
1492-
if (buildInfoPath) outputs.push(buildInfoPath);
1493-
}
1484+
const buildInfoPath = getOutputPathForBuildInfo(project.options);
1485+
if (buildInfoPath) outputs.push(buildInfoPath);
14941486
return outputs;
14951487
}
14961488
}

src/testRunner/unittests/tsbuild/helpers.ts

Lines changed: 38 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,9 @@ namespace ts {
148148
expectedMapFileNames: ReadonlyArray<string>;
149149
expectedBuildInfoFilesForSectionBaselines?: ReadonlyArray<BuildInfoSectionBaselineFiles>;
150150
modifyFs: (fs: vfs.FileSystem) => void;
151-
withoutBuildInfo: boolean;
152151
}
153152

154-
function build({ fs, tick, rootNames, expectedMapFileNames, expectedBuildInfoFilesForSectionBaselines, modifyFs, withoutBuildInfo }: BuildInput) {
153+
function build({ fs, tick, rootNames, expectedMapFileNames, expectedBuildInfoFilesForSectionBaselines, modifyFs }: BuildInput) {
155154
const actualReadFileMap = createMap<number>();
156155
modifyFs(fs);
157156
tick();
@@ -165,29 +164,19 @@ namespace ts {
165164
if (path.startsWith("/src/")) {
166165
actualReadFileMap.set(path, (actualReadFileMap.get(path) || 0) + 1);
167166
}
168-
if (withoutBuildInfo && isBuildInfoFile(path)) {
169-
return undefined;
170-
}
171167
return originalReadFile.call(host, path);
172168
};
173-
if (withoutBuildInfo) {
174-
const originalWriteFile = host.writeFile;
175-
host.writeFile = (fileName, content, writeByteOrder) => {
176-
return !isBuildInfoFile(fileName) &&
177-
originalWriteFile.call(host, fileName, content, writeByteOrder);
178-
};
179-
}
180169
builder.buildAllProjects();
181170
generateSourceMapBaselineFiles(fs, expectedMapFileNames);
182171
generateBuildInfoSectionBaselineFiles(fs, expectedBuildInfoFilesForSectionBaselines || emptyArray);
183172
fs.makeReadonly();
184173
return { fs, actualReadFileMap, host, builder };
185174
}
186175

187-
function generateBaseline(fs: vfs.FileSystem, proj: string, scenario: string, subScenario: string, withoutBuildInfo: boolean, baseFs: vfs.FileSystem) {
176+
function generateBaseline(fs: vfs.FileSystem, proj: string, scenario: string, subScenario: string, baseFs: vfs.FileSystem) {
188177
const patch = fs.diff(baseFs);
189178
// tslint:disable-next-line:no-null-keyword
190-
Harness.Baseline.runBaseline(`tsbuild/${proj}/${subScenario.split(" ").join("-")}/${withoutBuildInfo ? "no-" : ""}buildInfo/${scenario.split(" ").join("-")}.js`, patch ? vfs.formatPatch(patch) : null);
179+
Harness.Baseline.runBaseline(`tsbuild/${proj}/${subScenario.split(" ").join("-")}/${scenario.split(" ").join("-")}.js`, patch ? vfs.formatPatch(patch) : null);
191180
}
192181

193182
function verifyReadFileCalls(actualReadFileMap: Map<number>, expectedReadFiles: ReadonlyMap<number>) {
@@ -209,31 +198,39 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(arrayFrom(mapDefinedIt
209198
return map;
210199
}
211200

212-
export interface ExpectedBuildOutputPerState {
201+
export interface ExpectedBuildOutput {
213202
expectedDiagnostics?: ReadonlyArray<fakes.ExpectedDiagnostic>;
214203
expectedReadFiles?: ReadonlyMap<number>;
215204
}
216205

217-
export interface ExpectedBuildOutputDifferingWithBuildInfo extends ExpectedBuildOutputPerState {
206+
export interface BuildState extends ExpectedBuildOutput {
218207
modifyFs: (fs: vfs.FileSystem) => void;
219-
// Common ones
220-
expectedDiagnostics?: ReadonlyArray<fakes.ExpectedDiagnostic>;
221-
expectedReadFiles?: ReadonlyMap<number>;
222-
// Differing
223-
withBuildInfo?: ExpectedBuildOutputPerState;
224-
withoutBuildInfo?: ExpectedBuildOutputPerState;
225208
}
226209

227-
interface VerifyTsBuildInputWorker extends VerifyTsBuildInput {
228-
withoutBuildInfo: boolean;
210+
export interface VerifyTsBuildInput {
211+
scenario: string;
212+
projFs: () => vfs.FileSystem;
213+
time: () => number;
214+
tick: () => void;
215+
proj: string;
216+
rootNames: ReadonlyArray<string>;
217+
expectedMapFileNames: ReadonlyArray<string>;
218+
expectedBuildInfoFilesForSectionBaselines?: ReadonlyArray<BuildInfoSectionBaselineFiles>;
219+
lastProjectOutputJs: string;
220+
initialBuild: BuildState;
221+
outputFiles?: ReadonlyArray<string>;
222+
incrementalDtsChangedBuild?: BuildState;
223+
incrementalDtsUnchangedBuild?: BuildState;
224+
incrementalHeaderChangedBuild?: BuildState;
225+
baselineOnly?: true;
229226
}
230227

231-
function verifyTsbuildOutputWorker({
228+
export function verifyTsbuildOutput({
232229
scenario, projFs, time, tick, proj, rootNames, outputFiles, baselineOnly,
233-
expectedMapFileNames, expectedBuildInfoFilesForSectionBaselines, withoutBuildInfo, lastProjectOutputJs,
230+
expectedMapFileNames, expectedBuildInfoFilesForSectionBaselines, lastProjectOutputJs,
234231
initialBuild, incrementalDtsChangedBuild, incrementalDtsUnchangedBuild, incrementalHeaderChangedBuild
235-
}: VerifyTsBuildInputWorker) {
236-
describe(`tsc --b ${proj}:: ${scenario}${withoutBuildInfo ? " without build info" : ""}`, () => {
232+
}: VerifyTsBuildInput) {
233+
describe(`tsc --b ${proj}:: ${scenario}`, () => {
237234
let fs: vfs.FileSystem;
238235
let actualReadFileMap: Map<number>;
239236
let firstBuildTime: number;
@@ -246,7 +243,6 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(arrayFrom(mapDefinedIt
246243
expectedMapFileNames,
247244
expectedBuildInfoFilesForSectionBaselines,
248245
modifyFs: initialBuild.modifyFs,
249-
withoutBuildInfo
250246
});
251247
({ fs, actualReadFileMap, host } = result);
252248
firstBuildTime = time();
@@ -259,24 +255,19 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(arrayFrom(mapDefinedIt
259255
describe("initialBuild", () => {
260256
if (!baselineOnly) {
261257
it(`verify diagnostics`, () => {
262-
host.assertDiagnosticMessages(...(getValue(initialBuild, withoutBuildInfo, "expectedDiagnostics") || emptyArray));
258+
host.assertDiagnosticMessages(...(initialBuild.expectedDiagnostics || emptyArray));
263259
});
264260
}
265261
it(`Generates files matching the baseline`, () => {
266-
generateBaseline(fs, proj, scenario, "initial Build", withoutBuildInfo, projFs());
262+
generateBaseline(fs, proj, scenario, "initial Build", projFs());
267263
});
268-
const expectedReadFiles = getValue(initialBuild, withoutBuildInfo, "expectedReadFiles");
269-
if (!baselineOnly && expectedReadFiles) {
264+
if (!baselineOnly) {
270265
it("verify readFile calls", () => {
271-
verifyReadFileCalls(actualReadFileMap, expectedReadFiles);
266+
verifyReadFileCalls(actualReadFileMap, Debug.assertDefined(initialBuild.expectedReadFiles));
272267
});
273268
}
274269
});
275270

276-
function getValue<T extends keyof ExpectedBuildOutputPerState>(value: ExpectedBuildOutputDifferingWithBuildInfo, withoutBuildInfo: boolean, key: T): ExpectedBuildOutputPerState[T] {
277-
return (withoutBuildInfo ? value.withoutBuildInfo && value.withoutBuildInfo[key] : value.withBuildInfo && value.withBuildInfo[key]) || value[key];
278-
}
279-
280271
function incrementalBuild(subScenario: string, incrementalModifyFs: (fs: vfs.FileSystem) => void, incrementalExpectedDiagnostics: ReadonlyArray<fakes.ExpectedDiagnostic> | undefined, incrementalExpectedReadFiles: ReadonlyMap<number> | undefined) {
281272
describe(subScenario, () => {
282273
let newFs: vfs.FileSystem;
@@ -294,7 +285,6 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(arrayFrom(mapDefinedIt
294285
expectedMapFileNames,
295286
expectedBuildInfoFilesForSectionBaselines,
296287
modifyFs: incrementalModifyFs,
297-
withoutBuildInfo
298288
}));
299289
assert.equal(newFs.statSync(lastProjectOutputJs).mtimeMs, time(), "Second build timestamp is correct");
300290
});
@@ -309,11 +299,11 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(arrayFrom(mapDefinedIt
309299
});
310300
}
311301
it(`Generates files matching the baseline`, () => {
312-
generateBaseline(newFs, proj, scenario, subScenario, withoutBuildInfo, fs);
302+
generateBaseline(newFs, proj, scenario, subScenario, fs);
313303
});
314-
if (!baselineOnly && incrementalExpectedReadFiles) {
304+
if (!baselineOnly) {
315305
it("verify readFile calls", () => {
316-
verifyReadFileCalls(actualReadFileMap, incrementalExpectedReadFiles);
306+
verifyReadFileCalls(actualReadFileMap, Debug.assertDefined(incrementalExpectedReadFiles));
317307
});
318308
}
319309
it(`Verify emit output file text is same when built clean`, () => {
@@ -331,7 +321,6 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(arrayFrom(mapDefinedIt
331321
}
332322
}
333323
},
334-
withoutBuildInfo
335324
});
336325

337326
for (const outputFile of expectedOutputFiles) {
@@ -346,52 +335,28 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(arrayFrom(mapDefinedIt
346335
incrementalBuild(
347336
"incremental declaration changes",
348337
incrementalDtsChangedBuild.modifyFs,
349-
getValue(incrementalDtsChangedBuild, withoutBuildInfo, "expectedDiagnostics"),
350-
getValue(incrementalDtsChangedBuild, withoutBuildInfo, "expectedReadFiles"),
338+
incrementalDtsChangedBuild.expectedDiagnostics,
339+
incrementalDtsChangedBuild.expectedReadFiles,
351340
);
352341
}
353342

354343
if (incrementalDtsUnchangedBuild) {
355344
incrementalBuild(
356345
"incremental declaration doesnt change",
357346
incrementalDtsUnchangedBuild.modifyFs,
358-
getValue(incrementalDtsUnchangedBuild, withoutBuildInfo, "expectedDiagnostics"),
359-
getValue(incrementalDtsUnchangedBuild, withoutBuildInfo, "expectedReadFiles")
347+
incrementalDtsUnchangedBuild.expectedDiagnostics,
348+
incrementalDtsUnchangedBuild.expectedReadFiles
360349
);
361350
}
362351

363352
if (incrementalHeaderChangedBuild) {
364353
incrementalBuild(
365354
"incremental headers change without dts changes",
366355
incrementalHeaderChangedBuild.modifyFs,
367-
getValue(incrementalHeaderChangedBuild, withoutBuildInfo, "expectedDiagnostics"),
368-
getValue(incrementalHeaderChangedBuild, withoutBuildInfo, "expectedReadFiles")
356+
incrementalHeaderChangedBuild.expectedDiagnostics,
357+
incrementalHeaderChangedBuild.expectedReadFiles
369358
);
370359
}
371360
});
372361
}
373-
374-
export interface VerifyTsBuildInput {
375-
scenario: string;
376-
projFs: () => vfs.FileSystem;
377-
time: () => number;
378-
tick: () => void;
379-
proj: string;
380-
rootNames: ReadonlyArray<string>;
381-
expectedMapFileNames: ReadonlyArray<string>;
382-
expectedBuildInfoFilesForSectionBaselines?: ReadonlyArray<BuildInfoSectionBaselineFiles>;
383-
lastProjectOutputJs: string;
384-
initialBuild: ExpectedBuildOutputDifferingWithBuildInfo;
385-
outputFiles?: ReadonlyArray<string>;
386-
ignoreWithoutBuildInfo?: boolean;
387-
incrementalDtsChangedBuild ?: ExpectedBuildOutputDifferingWithBuildInfo;
388-
incrementalDtsUnchangedBuild ?: ExpectedBuildOutputDifferingWithBuildInfo;
389-
incrementalHeaderChangedBuild?: ExpectedBuildOutputDifferingWithBuildInfo;
390-
baselineOnly?: true;
391-
}
392-
393-
export function verifyTsbuildOutput(input: VerifyTsBuildInput) {
394-
verifyTsbuildOutputWorker({ ...input, withoutBuildInfo: false });
395-
if (!input.ignoreWithoutBuildInfo) verifyTsbuildOutputWorker({ ...input, withoutBuildInfo: true });
396-
}
397362
}

0 commit comments

Comments
 (0)