Skip to content

Commit fd9e602

Browse files
authored
When the global file is deleted mark all files as changed (microsoft#37538)
* Add test case when the errors are not refreshed if global file is deleted Testcase for microsoft#36728 * When the global file is deleted mark all files as changed Fixes microsoft#36728 * Update other baselines to fix file info
1 parent 6bd68a8 commit fd9e602

File tree

107 files changed

+1963
-797
lines changed

Some content is hidden

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

107 files changed

+1963
-797
lines changed

src/compiler/builder.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,12 @@ namespace ts {
245245
}
246246
});
247247

248-
if (oldCompilerOptions && compilerOptionsAffectEmit(compilerOptions, oldCompilerOptions)) {
248+
// If the global file is removed, add all files as changed
249+
if (useOldState && forEachEntry(oldState!.fileInfos, (info, sourceFilePath) => info.affectsGlobalScope && !state.fileInfos.has(sourceFilePath))) {
250+
BuilderState.getAllFilesExcludingDefaultLibraryFile(state, newProgram, /*firstSourceFile*/ undefined)
251+
.forEach(file => state.changedFilesSet.set(file.resolvedPath, true));
252+
}
253+
else if (oldCompilerOptions && compilerOptionsAffectEmit(compilerOptions, oldCompilerOptions)) {
249254
// Add all files to affectedFilesPendingEmit since emit changed
250255
newProgram.getSourceFiles().forEach(f => addToAffectedFilesPendingEmit(state, f.resolvedPath, BuilderFileEmit.Full));
251256
Debug.assert(!state.seenAffectedFiles || !state.seenAffectedFiles.size);
@@ -701,7 +706,7 @@ namespace ts {
701706
const fileInfos: MapLike<BuilderState.FileInfo> = {};
702707
state.fileInfos.forEach((value, key) => {
703708
const signature = state.currentAffectedFilesSignatures && state.currentAffectedFilesSignatures.get(key);
704-
fileInfos[relativeToBuildInfo(key)] = signature === undefined ? value : { version: value.version, signature };
709+
fileInfos[relativeToBuildInfo(key)] = signature === undefined ? value : { version: value.version, signature, affectsGlobalScope: value.affectsGlobalScope };
705710
});
706711

707712
const result: ProgramBuildInfo = {

src/compiler/builderState.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ namespace ts {
6868
export interface FileInfo {
6969
readonly version: string;
7070
signature: string | undefined;
71+
affectsGlobalScope: boolean;
7172
}
7273
/**
7374
* Referenced files with values for the keys as referenced file's path to be true
@@ -225,7 +226,7 @@ namespace ts {
225226
}
226227
}
227228
}
228-
fileInfos.set(sourceFile.resolvedPath, { version, signature: oldInfo && oldInfo.signature });
229+
fileInfos.set(sourceFile.resolvedPath, { version, signature: oldInfo && oldInfo.signature, affectsGlobalScope: isFileAffectingGlobalScope(sourceFile) });
229230
}
230231

231232
return {
@@ -488,14 +489,14 @@ namespace ts {
488489
/**
489490
* Gets all files of the program excluding the default library file
490491
*/
491-
function getAllFilesExcludingDefaultLibraryFile(state: BuilderState, programOfThisState: Program, firstSourceFile: SourceFile): readonly SourceFile[] {
492+
export function getAllFilesExcludingDefaultLibraryFile(state: BuilderState, programOfThisState: Program, firstSourceFile: SourceFile | undefined): readonly SourceFile[] {
492493
// Use cached result
493494
if (state.allFilesExcludingDefaultLibraryFile) {
494495
return state.allFilesExcludingDefaultLibraryFile;
495496
}
496497

497498
let result: SourceFile[] | undefined;
498-
addSourceFile(firstSourceFile);
499+
if (firstSourceFile) addSourceFile(firstSourceFile);
499500
for (const sourceFile of programOfThisState.getSourceFiles()) {
500501
if (sourceFile !== firstSourceFile) {
501502
addSourceFile(sourceFile);

src/testRunner/unittests/tscWatch/incremental.ts

+17-3
Original file line numberDiff line numberDiff line change
@@ -164,15 +164,18 @@ namespace ts.tscWatch {
164164
assert.equal(state.fileInfos.size, 3, "FileInfo size");
165165
assert.deepEqual(state.fileInfos.get(libFile.path), {
166166
version: system.createHash(libFile.content),
167-
signature: system.createHash(libFile.content)
167+
signature: system.createHash(libFile.content),
168+
affectsGlobalScope: true,
168169
});
169170
assert.deepEqual(state.fileInfos.get(file1.path), {
170171
version: system.createHash(file1.content),
171-
signature: system.createHash(`${file1.content.replace("export ", "export declare ")}\n`)
172+
signature: system.createHash(`${file1.content.replace("export ", "export declare ")}\n`),
173+
affectsGlobalScope: false,
172174
});
173175
assert.deepEqual(state.fileInfos.get(file2.path), {
174176
version: system.createHash(fileModified.content),
175-
signature: system.createHash("export declare const y: string;\n")
177+
signature: system.createHash("export declare const y: string;\n"),
178+
affectsGlobalScope: false,
176179
});
177180

178181
assert.deepEqual(state.compilerOptions, {
@@ -265,5 +268,16 @@ export interface A {
265268
}
266269
`)
267270
});
271+
272+
verifyIncrementalWatchEmit({
273+
subScenario: "when file with ambient global declaration file is deleted",
274+
files: () => [
275+
{ path: libFile.path, content: libContent },
276+
{ path: `${project}/globals.d.ts`, content: `declare namespace Config { const value: string;} ` },
277+
{ path: `${project}/index.ts`, content: `console.log(Config.value);` },
278+
{ path: configFile.path, content: JSON.stringify({ compilerOptions: { incremental: true, } }) }
279+
],
280+
modifyFs: host => host.deleteFile(`${project}/globals.d.ts`)
281+
});
268282
});
269283
}

tests/baselines/reference/tsbuild/configFileErrors/incremental-declaration-changes/builds-after-fixing-config-file-errors.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,18 @@ exports.bar = bar;
3636
"fileInfos": {
3737
"../lib/lib.d.ts": {
3838
"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; };",
39-
"signature": "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; };"
39+
"signature": "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; };",
40+
"affectsGlobalScope": true
4041
},
4142
"./a.ts": {
4243
"version": "4646078106-export function foo() { }",
43-
"signature": "-6972466928-export declare function foo(): void;\r\n"
44+
"signature": "-6972466928-export declare function foo(): void;\r\n",
45+
"affectsGlobalScope": false
4446
},
4547
"./b.ts": {
4648
"version": "1045484683-export function bar() { }",
47-
"signature": "-1357953631-export declare function bar(): void;\r\n"
49+
"signature": "-1357953631-export declare function bar(): void;\r\n",
50+
"affectsGlobalScope": false
4851
}
4952
},
5053
"options": {

tests/baselines/reference/tsbuild/containerOnlyReferenced/initial-build/verify-that-subsequent-builds-after-initial-build-doesnt-build-anything.js

+12-6
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,13 @@ exports.x = 10;
3939
"fileInfos": {
4040
"../../../lib/lib.d.ts": {
4141
"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; };",
42-
"signature": "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; };"
42+
"signature": "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; };",
43+
"affectsGlobalScope": true
4344
},
4445
"./index.ts": {
4546
"version": "-10726455937-export const x = 10;",
46-
"signature": "-6057683066-export declare const x = 10;\r\n"
47+
"signature": "-6057683066-export declare const x = 10;\r\n",
48+
"affectsGlobalScope": false
4749
}
4850
},
4951
"options": {
@@ -77,11 +79,13 @@ exports.x = 10;
7779
"fileInfos": {
7880
"../../../lib/lib.d.ts": {
7981
"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; };",
80-
"signature": "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; };"
82+
"signature": "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; };",
83+
"affectsGlobalScope": true
8184
},
8285
"./index.ts": {
8386
"version": "-10726455937-export const x = 10;",
84-
"signature": "-6057683066-export declare const x = 10;\r\n"
87+
"signature": "-6057683066-export declare const x = 10;\r\n",
88+
"affectsGlobalScope": false
8589
}
8690
},
8791
"options": {
@@ -115,11 +119,13 @@ exports.x = 10;
115119
"fileInfos": {
116120
"../../lib/lib.d.ts": {
117121
"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; };",
118-
"signature": "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; };"
122+
"signature": "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; };",
123+
"affectsGlobalScope": true
119124
},
120125
"./index.ts": {
121126
"version": "-10726455937-export const x = 10;",
122-
"signature": "-6057683066-export declare const x = 10;\r\n"
127+
"signature": "-6057683066-export declare const x = 10;\r\n",
128+
"affectsGlobalScope": false
123129
}
124130
},
125131
"options": {

0 commit comments

Comments
 (0)