Skip to content

Commit e41cbb6

Browse files
committed
Add incremental to normal tsc
1 parent 6c0b456 commit e41cbb6

File tree

3 files changed

+56
-20
lines changed

3 files changed

+56
-20
lines changed

src/compiler/tsbuild.ts

+1-7
Original file line numberDiff line numberDiff line change
@@ -1233,13 +1233,7 @@ namespace ts {
12331233
function getOldProgram(proj: ResolvedConfigFileName, parsed: ParsedCommandLine) {
12341234
const value = builderPrograms.getValue(proj);
12351235
if (value) return value;
1236-
const buildInfoPath = getOutputPathForBuildInfo(parsed.options);
1237-
if (!buildInfoPath) return undefined;
1238-
const content = readFileWithCache(buildInfoPath);
1239-
if (!content) return undefined;
1240-
const buildInfo = getBuildInfo(content);
1241-
if (buildInfo.version !== version) return undefined;
1242-
return buildInfo.program && createBuildProgramUsingProgramBuildInfo(buildInfo.program) as any as T;
1236+
return readBuilderProgram(parsed.options, readFileWithCache) as any as T;
12431237
}
12441238

12451239
function updateBundle(proj: ResolvedConfigFileName): BuildResultFlags {

src/compiler/watch.ts

+14-13
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,19 @@ namespace ts {
371371
host.projectReferences = projectReferences;
372372
return host;
373373
}
374+
375+
export function readBuilderProgram(compilerOptions: CompilerOptions, readFile: (path: string) => string | undefined) {
376+
if (compilerOptions.out || compilerOptions.outFile) return undefined;
377+
if (!isIncrementalCompilation(compilerOptions)) return undefined;
378+
const buildInfoPath = getOutputPathForBuildInfo(compilerOptions);
379+
if (!buildInfoPath) return undefined;
380+
const content = readFile(buildInfoPath);
381+
if (!content) return undefined;
382+
const buildInfo = getBuildInfo(content);
383+
if (buildInfo.version !== version) return undefined;
384+
if (!buildInfo.program) return undefined;
385+
return createBuildProgramUsingProgramBuildInfo(buildInfo.program);
386+
}
374387
}
375388

376389
namespace ts {
@@ -645,7 +658,7 @@ namespace ts {
645658
((typeDirectiveNames, containingFile, redirectedReference) => resolutionCache.resolveTypeReferenceDirectives(typeDirectiveNames, containingFile, redirectedReference));
646659
const userProvidedResolution = !!host.resolveModuleNames || !!host.resolveTypeReferenceDirectives;
647660

648-
readBuilderProgram();
661+
readBuilderProgram(compilerOptions, path => compilerHost.readFile(path));
649662
synchronizeProgram();
650663

651664
// Update the wild card directory watch
@@ -677,18 +690,6 @@ namespace ts {
677690
}
678691
}
679692

680-
function readBuilderProgram() {
681-
if (compilerOptions.out || compilerOptions.outFile) return;
682-
if (!isIncrementalCompilation(compilerOptions)) return;
683-
const buildInfoPath = getOutputPathForBuildInfo(compilerOptions);
684-
if (!buildInfoPath) return;
685-
const content = directoryStructureHost.readFile(buildInfoPath);
686-
if (!content) return;
687-
const buildInfo = JSON.parse(content) as BuildInfo;
688-
if (!buildInfo.program) return;
689-
builderProgram = createBuildProgramUsingProgramBuildInfo(buildInfo.program) as any as T;
690-
}
691-
692693
function getCurrentBuilderProgram() {
693694
return builderProgram;
694695
}

src/tsc/tsc.ts

+41
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ namespace ts {
147147
reportWatchModeWithoutSysSupport();
148148
createWatchOfConfigFile(configParseResult, commandLineOptions);
149149
}
150+
else if (isIncrementalCompilation(configParseResult.options)) {
151+
performIncrementalCompilation(configParseResult);
152+
}
150153
else {
151154
performCompilation(configParseResult.fileNames, configParseResult.projectReferences, configParseResult.options, getConfigFileParsingDiagnostics(configParseResult));
152155
}
@@ -254,6 +257,44 @@ namespace ts {
254257
return sys.exit(exitStatus);
255258
}
256259

260+
function performIncrementalCompilation(config: ParsedCommandLine) {
261+
const { options, fileNames, projectReferences } = config;
262+
const host = createCompilerHost(options);
263+
const currentDirectory = host.getCurrentDirectory();
264+
const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames());
265+
changeCompilerHostLikeToUseCache(host, fileName => toPath(fileName, currentDirectory, getCanonicalFileName));
266+
enableStatistics(options);
267+
const oldProgram = readBuilderProgram(options, path => host.readFile(path));
268+
const configFileParsingDiagnostics = getConfigFileParsingDiagnostics(config);
269+
const programOptions: CreateProgramOptions = {
270+
rootNames: fileNames,
271+
options,
272+
projectReferences,
273+
host,
274+
configFileParsingDiagnostics: getConfigFileParsingDiagnostics(config),
275+
};
276+
const program = createProgram(programOptions);
277+
const builderProgram = createEmitAndSemanticDiagnosticsBuilderProgram(
278+
program,
279+
{
280+
useCaseSensitiveFileNames: () => sys.useCaseSensitiveFileNames,
281+
createHash: maybeBind(sys, sys.createHash),
282+
writeFile: (path, data, writeByteOrderMark) => sys.writeFile(path, data, writeByteOrderMark)
283+
},
284+
oldProgram,
285+
configFileParsingDiagnostics
286+
);
287+
288+
const exitStatus = emitFilesAndReportErrors(
289+
builderProgram,
290+
reportDiagnostic,
291+
s => sys.write(s + sys.newLine),
292+
createReportErrorSummary(options)
293+
);
294+
reportStatistics(program);
295+
return sys.exit(exitStatus);
296+
}
297+
257298
function updateCreateProgram<T extends BuilderProgram>(host: { createProgram: CreateProgram<T>; }) {
258299
const compileUsingBuilder = host.createProgram;
259300
host.createProgram = (rootNames, options, host, oldProgram, configFileParsingDiagnostics, projectReferences) => {

0 commit comments

Comments
 (0)