Skip to content

Commit b9d96df

Browse files
authored
Some refactoring so we arent checking undefined on program or asserting it so much (#58782)
1 parent f5238c3 commit b9d96df

File tree

7 files changed

+352
-144
lines changed

7 files changed

+352
-144
lines changed

src/compiler/builder.ts

+231-104
Large diffs are not rendered by default.

src/compiler/builderPublic.ts

+101-14
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export type HostForComputeHash = Pick<BuilderProgramHost, "createHash" | "storeS
4646
*/
4747
export interface BuilderProgram {
4848
/** @internal */
49-
getState(): ReusableBuilderProgramState;
49+
state: ReusableBuilderProgramState;
5050
/** @internal */
5151
saveEmitState(): SavedBuildProgramEmitState;
5252
/** @internal */
@@ -164,28 +164,115 @@ export interface EmitAndSemanticDiagnosticsBuilderProgram extends SemanticDiagno
164164
/**
165165
* Create the builder to manage semantic diagnostics and cache them
166166
*/
167-
export function createSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): SemanticDiagnosticsBuilderProgram;
168-
export function createSemanticDiagnosticsBuilderProgram(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): SemanticDiagnosticsBuilderProgram;
169-
export function createSemanticDiagnosticsBuilderProgram(newProgramOrRootNames: Program | readonly string[] | undefined, hostOrOptions: BuilderProgramHost | CompilerOptions | undefined, oldProgramOrHost?: CompilerHost | SemanticDiagnosticsBuilderProgram, configFileParsingDiagnosticsOrOldProgram?: readonly Diagnostic[] | SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]) {
170-
return createBuilderProgram(BuilderProgramKind.SemanticDiagnosticsBuilderProgram, getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences));
167+
export function createSemanticDiagnosticsBuilderProgram(
168+
newProgram: Program,
169+
host: BuilderProgramHost,
170+
oldProgram?: SemanticDiagnosticsBuilderProgram,
171+
configFileParsingDiagnostics?: readonly Diagnostic[],
172+
): SemanticDiagnosticsBuilderProgram;
173+
export function createSemanticDiagnosticsBuilderProgram(
174+
rootNames: readonly string[] | undefined,
175+
options: CompilerOptions | undefined,
176+
host?: CompilerHost,
177+
oldProgram?: SemanticDiagnosticsBuilderProgram,
178+
configFileParsingDiagnostics?: readonly Diagnostic[],
179+
projectReferences?: readonly ProjectReference[],
180+
): SemanticDiagnosticsBuilderProgram;
181+
export function createSemanticDiagnosticsBuilderProgram(
182+
newProgramOrRootNames: Program | readonly string[] | undefined,
183+
hostOrOptions: BuilderProgramHost | CompilerOptions | undefined,
184+
oldProgramOrHost?: CompilerHost | SemanticDiagnosticsBuilderProgram,
185+
configFileParsingDiagnosticsOrOldProgram?: readonly Diagnostic[] | SemanticDiagnosticsBuilderProgram,
186+
configFileParsingDiagnostics?: readonly Diagnostic[],
187+
projectReferences?: readonly ProjectReference[],
188+
) {
189+
return createBuilderProgram(
190+
BuilderProgramKind.SemanticDiagnosticsBuilderProgram,
191+
getBuilderCreationParameters(
192+
newProgramOrRootNames,
193+
hostOrOptions,
194+
oldProgramOrHost,
195+
configFileParsingDiagnosticsOrOldProgram,
196+
configFileParsingDiagnostics,
197+
projectReferences,
198+
),
199+
);
171200
}
172201

173202
/**
174203
* Create the builder that can handle the changes in program and iterate through changed files
175204
* to emit the those files and manage semantic diagnostics cache as well
176205
*/
177-
export function createEmitAndSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): EmitAndSemanticDiagnosticsBuilderProgram;
178-
export function createEmitAndSemanticDiagnosticsBuilderProgram(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): EmitAndSemanticDiagnosticsBuilderProgram;
179-
export function createEmitAndSemanticDiagnosticsBuilderProgram(newProgramOrRootNames: Program | readonly string[] | undefined, hostOrOptions: BuilderProgramHost | CompilerOptions | undefined, oldProgramOrHost?: CompilerHost | EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnosticsOrOldProgram?: readonly Diagnostic[] | EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]) {
180-
return createBuilderProgram(BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram, getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences));
206+
export function createEmitAndSemanticDiagnosticsBuilderProgram(
207+
newProgram: Program,
208+
host: BuilderProgramHost,
209+
oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram,
210+
configFileParsingDiagnostics?: readonly Diagnostic[],
211+
): EmitAndSemanticDiagnosticsBuilderProgram;
212+
export function createEmitAndSemanticDiagnosticsBuilderProgram(
213+
rootNames: readonly string[] | undefined,
214+
options: CompilerOptions | undefined,
215+
host?: CompilerHost,
216+
oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram,
217+
configFileParsingDiagnostics?: readonly Diagnostic[],
218+
projectReferences?: readonly ProjectReference[],
219+
): EmitAndSemanticDiagnosticsBuilderProgram;
220+
export function createEmitAndSemanticDiagnosticsBuilderProgram(
221+
newProgramOrRootNames: Program | readonly string[] | undefined,
222+
hostOrOptions: BuilderProgramHost | CompilerOptions | undefined,
223+
oldProgramOrHost?: CompilerHost | EmitAndSemanticDiagnosticsBuilderProgram,
224+
configFileParsingDiagnosticsOrOldProgram?: readonly Diagnostic[] | EmitAndSemanticDiagnosticsBuilderProgram,
225+
configFileParsingDiagnostics?: readonly Diagnostic[],
226+
projectReferences?: readonly ProjectReference[],
227+
) {
228+
return createBuilderProgram(
229+
BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram,
230+
getBuilderCreationParameters(
231+
newProgramOrRootNames,
232+
hostOrOptions,
233+
oldProgramOrHost,
234+
configFileParsingDiagnosticsOrOldProgram,
235+
configFileParsingDiagnostics,
236+
projectReferences,
237+
),
238+
);
181239
}
182240

183241
/**
184242
* Creates a builder thats just abstraction over program and can be used with watch
185243
*/
186-
export function createAbstractBuilder(newProgram: Program, host: BuilderProgramHost, oldProgram?: BuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): BuilderProgram;
187-
export function createAbstractBuilder(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: BuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): BuilderProgram;
188-
export function createAbstractBuilder(newProgramOrRootNames: Program | readonly string[] | undefined, hostOrOptions: BuilderProgramHost | CompilerOptions | undefined, oldProgramOrHost?: CompilerHost | BuilderProgram, configFileParsingDiagnosticsOrOldProgram?: readonly Diagnostic[] | BuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): BuilderProgram {
189-
const { newProgram, configFileParsingDiagnostics: newConfigFileParsingDiagnostics } = getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences);
190-
return createRedirectedBuilderProgram(() => ({ program: newProgram, compilerOptions: newProgram.getCompilerOptions() }), newConfigFileParsingDiagnostics);
244+
export function createAbstractBuilder(
245+
newProgram: Program,
246+
host: BuilderProgramHost,
247+
oldProgram?: BuilderProgram,
248+
configFileParsingDiagnostics?: readonly Diagnostic[],
249+
): BuilderProgram;
250+
export function createAbstractBuilder(
251+
rootNames: readonly string[] | undefined,
252+
options: CompilerOptions | undefined,
253+
host?: CompilerHost,
254+
oldProgram?: BuilderProgram,
255+
configFileParsingDiagnostics?: readonly Diagnostic[],
256+
projectReferences?: readonly ProjectReference[],
257+
): BuilderProgram;
258+
export function createAbstractBuilder(
259+
newProgramOrRootNames: Program | readonly string[] | undefined,
260+
hostOrOptions: BuilderProgramHost | CompilerOptions | undefined,
261+
oldProgramOrHost?: CompilerHost | BuilderProgram,
262+
configFileParsingDiagnosticsOrOldProgram?: readonly Diagnostic[] | BuilderProgram,
263+
configFileParsingDiagnostics?: readonly Diagnostic[],
264+
projectReferences?: readonly ProjectReference[],
265+
): BuilderProgram {
266+
const { newProgram, configFileParsingDiagnostics: newConfigFileParsingDiagnostics } = getBuilderCreationParameters(
267+
newProgramOrRootNames,
268+
hostOrOptions,
269+
oldProgramOrHost,
270+
configFileParsingDiagnosticsOrOldProgram,
271+
configFileParsingDiagnostics,
272+
projectReferences,
273+
);
274+
return createRedirectedBuilderProgram(
275+
{ program: newProgram, compilerOptions: newProgram.getCompilerOptions() },
276+
newConfigFileParsingDiagnostics,
277+
);
191278
}

src/compiler/watch.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -329,8 +329,8 @@ function createTabularErrorsDisplay(filesInError: (ReportFileInError | undefined
329329
}
330330

331331
/** @internal */
332-
export function isBuilderProgram(program: Program | BuilderProgram): program is BuilderProgram {
333-
return !!(program as BuilderProgram).getState;
332+
export function isBuilderProgram<T extends BuilderProgram>(program: Program | BuilderProgram): program is T {
333+
return !!(program as T).state;
334334
}
335335

336336
/** @internal */

src/compiler/watchUtilities.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
identity,
3131
insertSorted,
3232
isArray,
33+
isBuilderProgram,
3334
isDeclarationFileName,
3435
isExcludedFile,
3536
isSupportedSourceFileName,
@@ -627,7 +628,7 @@ export function isIgnoredFileFromWildCardWatching({
627628
return realProgram ?
628629
!!realProgram.getSourceFileByPath(file) :
629630
builderProgram ?
630-
builderProgram.getState().fileInfos.has(file) :
631+
builderProgram.state.fileInfos.has(file) :
631632
!!find(program as readonly string[], rootFile => toPath(rootFile) === file);
632633
}
633634

@@ -651,10 +652,6 @@ export function isIgnoredFileFromWildCardWatching({
651652
}
652653
}
653654

654-
function isBuilderProgram<T extends BuilderProgram>(program: Program | T): program is T {
655-
return !!(program as T).getState;
656-
}
657-
658655
/** @internal */
659656
export function isEmittedFileOfProgram(program: Program | undefined, file: string) {
660657
if (!program) {

src/testRunner/unittests/helpers/baseline.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,8 @@ function baselineProgram(baseline: string[], [program, builderProgram]: CommandL
7272

7373
if (!builderProgram) return;
7474
if (builderProgram !== oldProgram?.[1]) {
75-
const state = builderProgram.getState();
76-
const internalState = state as unknown as ts.BuilderProgramState;
77-
if (state.semanticDiagnosticsPerFile.size) {
75+
const internalState = builderProgram.state as ts.BuilderProgramState;
76+
if (builderProgram.state.semanticDiagnosticsPerFile.size) {
7877
baseline.push("Semantic diagnostics in builder refreshed for::");
7978
for (const file of program.getSourceFiles()) {
8079
if (!internalState.semanticDiagnosticsFromOldState || !internalState.semanticDiagnosticsFromOldState.has(file.resolvedPath)) {
@@ -90,7 +89,7 @@ function baselineProgram(baseline: string[], [program, builderProgram]: CommandL
9089
if (internalState.hasCalledUpdateShapeSignature?.size) {
9190
baseline.push("Shape signatures in builder refreshed for::");
9291
internalState.hasCalledUpdateShapeSignature.forEach((path: ts.Path) => {
93-
const info = state.fileInfos.get(path);
92+
const info = builderProgram.state.fileInfos.get(path);
9493
const signatureInfo = internalState.signatureInfo?.get(path)!;
9594
switch (signatureInfo) {
9695
case ts.SignatureInfo.ComputedDts:

src/testRunner/unittests/helpers/tsc.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,7 @@ function storeDtsSignatures(sys: TscCompileSystem, programs: readonly CommandLin
180180
sys.dtsSignaures ??= new Map();
181181
const dtsSignatureData = new Map<string, string>();
182182
sys.dtsSignaures.set(`${toPathWithSystem(sys, buildInfoPath)}.readable.baseline.txt` as ts.Path, dtsSignatureData);
183-
const state = builderProgram.getState();
184-
state.hasCalledUpdateShapeSignature?.forEach(resolvedPath => {
183+
builderProgram.state.hasCalledUpdateShapeSignature?.forEach(resolvedPath => {
185184
const file = program.getSourceFileByPath(resolvedPath);
186185
if (!file || file.isDeclarationFile) return;
187186
// Compute dts and exported map and store it

src/testRunner/unittests/tscWatch/incremental.ts

+12-13
Original file line numberDiff line numberDiff line change
@@ -170,42 +170,41 @@ describe("unittests:: tsc-watch:: emit file --incremental", () => {
170170
host: ts.createIncrementalCompilerHost(command.options, system),
171171
});
172172

173-
const state = builderProgram.getState();
174-
assert.equal(state.changedFilesSet!.size, 0, "changes");
173+
assert.equal(builderProgram.state.changedFilesSet!.size, 0, "changes");
175174

176-
assert.equal(state.fileInfos.size, 3, "FileInfo size");
177-
assert.deepEqual(state.fileInfos.get(libFile.path as ts.Path), {
175+
assert.equal(builderProgram.state.fileInfos.size, 3, "FileInfo size");
176+
assert.deepEqual(builderProgram.state.fileInfos.get(libFile.path as ts.Path), {
178177
version: system.createHash(libFile.content),
179178
signature: system.createHash(libFile.content),
180179
affectsGlobalScope: true,
181180
impliedFormat: ts.ModuleKind.CommonJS,
182181
});
183-
assert.deepEqual(state.fileInfos.get(file1.path as ts.Path), {
182+
assert.deepEqual(builderProgram.state.fileInfos.get(file1.path as ts.Path), {
184183
version: system.createHash(file1.content),
185184
signature: system.createHash(file1.content),
186185
affectsGlobalScope: undefined,
187186
impliedFormat: ts.ModuleKind.CommonJS,
188187
});
189-
assert.deepEqual(state.fileInfos.get(file2.path as ts.Path), {
188+
assert.deepEqual(builderProgram.state.fileInfos.get(file2.path as ts.Path), {
190189
version: system.createHash(fileModified.content),
191190
signature: system.createHash(fileModified.content),
192191
affectsGlobalScope: undefined,
193192
impliedFormat: ts.ModuleKind.CommonJS,
194193
});
195194

196-
assert.deepEqual(state.compilerOptions, {
195+
assert.deepEqual(builderProgram.state.compilerOptions, {
197196
incremental: true,
198197
module: ts.ModuleKind.AMD,
199198
configFilePath: config.path,
200199
});
201200

202-
assert.equal(ts.arrayFrom(state.referencedMap!.keys()).length, 0);
201+
assert.equal(ts.arrayFrom(builderProgram.state.referencedMap!.keys()).length, 0);
203202

204-
assert.equal(state.semanticDiagnosticsPerFile.size, 3);
205-
assert.deepEqual(state.semanticDiagnosticsPerFile.get(libFile.path as ts.Path), ts.emptyArray);
206-
assert.deepEqual(state.semanticDiagnosticsPerFile.get(file1.path as ts.Path), ts.emptyArray);
207-
assert.deepEqual(state.semanticDiagnosticsPerFile.get(file2.path as ts.Path), [{
208-
file: state.program!.getSourceFileByPath(file2.path as ts.Path)!,
203+
assert.equal(builderProgram.state.semanticDiagnosticsPerFile.size, 3);
204+
assert.deepEqual(builderProgram.state.semanticDiagnosticsPerFile.get(libFile.path as ts.Path), ts.emptyArray);
205+
assert.deepEqual(builderProgram.state.semanticDiagnosticsPerFile.get(file1.path as ts.Path), ts.emptyArray);
206+
assert.deepEqual(builderProgram.state.semanticDiagnosticsPerFile.get(file2.path as ts.Path), [{
207+
file: builderProgram.state.program!.getSourceFileByPath(file2.path as ts.Path)!,
209208
start: 13,
210209
length: 1,
211210
code: ts.Diagnostics.Type_0_is_not_assignable_to_type_1.code,

0 commit comments

Comments
 (0)