Skip to content

Commit 2be231d

Browse files
committedJan 19, 2018
Add createProgram on WatchCompilerHost
1 parent bd43e45 commit 2be231d

File tree

8 files changed

+177
-132
lines changed

8 files changed

+177
-132
lines changed
 

Diff for: ‎src/compiler/builder.ts

+56-7
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,30 @@ namespace ts {
220220
EmitAndSemanticDiagnosticsBuilderProgram
221221
}
222222

223-
export function createBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram: BuilderProgram | undefined, kind: BuilderProgramKind.SemanticDiagnosticsBuilderProgram): SemanticDiagnosticsBuilderProgram;
224-
export function createBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram: BuilderProgram | undefined, kind: BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram): EmitAndSemanticDiagnosticsBuilderProgram;
225-
export function createBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram: BuilderProgram | undefined, kind: BuilderProgramKind) {
223+
export interface BuilderCreationParameters {
224+
newProgram: Program;
225+
host: BuilderProgramHost;
226+
oldProgram: BuilderProgram | undefined;
227+
}
228+
229+
export function getBuilderCreationParameters(newProgramOrRootNames: Program | ReadonlyArray<string>, hostOrOptions: BuilderProgramHost | CompilerOptions, oldProgramOrHost?: CompilerHost | BuilderProgram, oldProgram?: BuilderProgram): BuilderCreationParameters {
230+
let host: BuilderProgramHost;
231+
let newProgram: Program;
232+
if (isArray(newProgramOrRootNames)) {
233+
newProgram = createProgram(newProgramOrRootNames, hostOrOptions as CompilerOptions, oldProgramOrHost as CompilerHost, oldProgram && oldProgram.getProgram());
234+
host = oldProgramOrHost as CompilerHost;
235+
}
236+
else {
237+
newProgram = newProgramOrRootNames as Program;
238+
host = hostOrOptions as BuilderProgramHost;
239+
oldProgram = oldProgramOrHost as BuilderProgram;
240+
}
241+
return { host, newProgram, oldProgram };
242+
}
243+
244+
export function createBuilderProgram(kind: BuilderProgramKind.SemanticDiagnosticsBuilderProgram, builderCreationParameters: BuilderCreationParameters): SemanticDiagnosticsBuilderProgram;
245+
export function createBuilderProgram(kind: BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram, builderCreationParameters: BuilderCreationParameters): EmitAndSemanticDiagnosticsBuilderProgram;
246+
export function createBuilderProgram(kind: BuilderProgramKind, { newProgram, host, oldProgram }: BuilderCreationParameters) {
226247
// Return same program if underlying program doesnt change
227248
let oldState = oldProgram && oldProgram.getState();
228249
if (oldState && newProgram === oldState.program) {
@@ -518,15 +539,43 @@ namespace ts {
518539
/**
519540
* Create the builder to manage semantic diagnostics and cache them
520541
*/
521-
export function createSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: SemanticDiagnosticsBuilderProgram): SemanticDiagnosticsBuilderProgram {
522-
return createBuilderProgram(newProgram, host, oldProgram, BuilderProgramKind.SemanticDiagnosticsBuilderProgram);
542+
export function createSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: SemanticDiagnosticsBuilderProgram): SemanticDiagnosticsBuilderProgram;
543+
export function createSemanticDiagnosticsBuilderProgram(rootNames: ReadonlyArray<string>, options: CompilerOptions, host?: CompilerHost, oldProgram?: SemanticDiagnosticsBuilderProgram): SemanticDiagnosticsBuilderProgram;
544+
export function createSemanticDiagnosticsBuilderProgram(newProgramOrRootNames: Program | ReadonlyArray<string>, hostOrOptions: BuilderProgramHost | CompilerOptions, oldProgramOrHost?: CompilerHost | SemanticDiagnosticsBuilderProgram, oldProgram?: SemanticDiagnosticsBuilderProgram) {
545+
return createBuilderProgram(BuilderProgramKind.SemanticDiagnosticsBuilderProgram, getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, oldProgram));
523546
}
524547

525548
/**
526549
* Create the builder that can handle the changes in program and iterate through changed files
527550
* to emit the those files and manage semantic diagnostics cache as well
528551
*/
529-
export function createEmitAndSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram): EmitAndSemanticDiagnosticsBuilderProgram {
530-
return createBuilderProgram(newProgram, host, oldProgram, BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram);
552+
export function createEmitAndSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram): EmitAndSemanticDiagnosticsBuilderProgram;
553+
export function createEmitAndSemanticDiagnosticsBuilderProgram(rootNames: ReadonlyArray<string>, options: CompilerOptions, host?: CompilerHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram): EmitAndSemanticDiagnosticsBuilderProgram;
554+
export function createEmitAndSemanticDiagnosticsBuilderProgram(newProgramOrRootNames: Program | ReadonlyArray<string>, hostOrOptions: BuilderProgramHost | CompilerOptions, oldProgramOrHost?: CompilerHost | EmitAndSemanticDiagnosticsBuilderProgram, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram) {
555+
return createBuilderProgram(BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram, getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, oldProgram));
556+
}
557+
558+
/**
559+
* Creates a builder thats just abstraction over program and can be used with watch
560+
*/
561+
export function createAbstractBuilder(newProgram: Program, host: BuilderProgramHost, oldProgram?: BuilderProgram): BuilderProgram;
562+
export function createAbstractBuilder(rootNames: ReadonlyArray<string>, options: CompilerOptions, host?: CompilerHost, oldProgram?: BuilderProgram): BuilderProgram;
563+
export function createAbstractBuilder(newProgramOrRootNames: Program | ReadonlyArray<string>, hostOrOptions: BuilderProgramHost | CompilerOptions, oldProgramOrHost?: CompilerHost | BuilderProgram, oldProgram?: BuilderProgram): BuilderProgram {
564+
const { newProgram: program } = getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, oldProgram);
565+
return {
566+
// Only return program, all other methods are not implemented
567+
getProgram: () => program,
568+
getState: notImplemented,
569+
getCompilerOptions: notImplemented,
570+
getSourceFile: notImplemented,
571+
getSourceFiles: notImplemented,
572+
getOptionsDiagnostics: notImplemented,
573+
getGlobalDiagnostics: notImplemented,
574+
getSyntacticDiagnostics: notImplemented,
575+
getSemanticDiagnostics: notImplemented,
576+
emit: notImplemented,
577+
getAllDependencies: notImplemented,
578+
getCurrentDirectory: notImplemented
579+
};
531580
}
532581
}

Diff for: ‎src/compiler/tsc.ts

+12-8
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,16 @@ namespace ts {
149149
return sys.exit(exitStatus);
150150
}
151151

152-
function updateWatchCompilationHost(watchCompilerHost: WatchCompilerHost) {
153-
const compileUsingBuilder = watchCompilerHost.afterProgramCreate;
154-
watchCompilerHost.beforeProgramCreate = enableStatistics;
155-
watchCompilerHost.afterProgramCreate = program => {
156-
compileUsingBuilder(program);
157-
reportStatistics(program);
152+
function updateWatchCompilationHost(watchCompilerHost: WatchCompilerHost<EmitAndSemanticDiagnosticsBuilderProgram>) {
153+
const compileUsingBuilder = watchCompilerHost.createProgram;
154+
watchCompilerHost.createProgram = (rootNames, options, host, oldProgram) => {
155+
enableStatistics(options);
156+
return compileUsingBuilder(rootNames, options, host, oldProgram);
157+
};
158+
const emitFilesUsingBuilder = watchCompilerHost.afterProgramCreate;
159+
watchCompilerHost.afterProgramCreate = builderProgram => {
160+
emitFilesUsingBuilder(builderProgram);
161+
reportStatistics(builderProgram.getProgram());
158162
};
159163
}
160164

@@ -163,7 +167,7 @@ namespace ts {
163167
}
164168

165169
function createWatchOfConfigFile(configParseResult: ParsedCommandLine, optionsToExtend: CompilerOptions) {
166-
const watchCompilerHost = ts.createWatchCompilerHostOfConfigFile(configParseResult.options.configFilePath, optionsToExtend, sys, reportDiagnostic, createWatchStatusReporter(configParseResult.options));
170+
const watchCompilerHost = ts.createWatchCompilerHostOfConfigFile(configParseResult.options.configFilePath, optionsToExtend, sys, /*createProgram*/ undefined, reportDiagnostic, createWatchStatusReporter(configParseResult.options));
167171
updateWatchCompilationHost(watchCompilerHost);
168172
watchCompilerHost.rootFiles = configParseResult.fileNames;
169173
watchCompilerHost.options = configParseResult.options;
@@ -173,7 +177,7 @@ namespace ts {
173177
}
174178

175179
function createWatchOfFilesAndCompilerOptions(rootFiles: string[], options: CompilerOptions) {
176-
const watchCompilerHost = ts.createWatchCompilerHostOfFilesAndCompilerOptions(rootFiles, options, sys, reportDiagnostic, createWatchStatusReporter(options));
180+
const watchCompilerHost = ts.createWatchCompilerHostOfFilesAndCompilerOptions(rootFiles, options, sys, /*createProgram*/ undefined, reportDiagnostic, createWatchStatusReporter(options));
177181
updateWatchCompilationHost(watchCompilerHost);
178182
createWatchProgram(watchCompilerHost);
179183
}

Diff for: ‎src/compiler/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -4471,6 +4471,7 @@ namespace ts {
44714471
/* @internal */ onReleaseOldSourceFile?(oldSourceFile: SourceFile, oldOptions: CompilerOptions): void;
44724472
/* @internal */ hasInvalidatedResolution?: HasInvalidatedResolution;
44734473
/* @internal */ hasChangedAutomaticTypeDirectiveNames?: boolean;
4474+
createHash?(data: string): string;
44744475
}
44754476

44764477
/* @internal */

0 commit comments

Comments
 (0)