From e41cbb6316f9f973f2a25ab578a956e697b20472 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 4 Mar 2019 15:24:55 -0800 Subject: [PATCH] Add incremental to normal tsc --- src/compiler/tsbuild.ts | 8 +------- src/compiler/watch.ts | 27 ++++++++++++++------------- src/tsc/tsc.ts | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 20 deletions(-) diff --git a/src/compiler/tsbuild.ts b/src/compiler/tsbuild.ts index 59edd85d716..20e7101fcd8 100644 --- a/src/compiler/tsbuild.ts +++ b/src/compiler/tsbuild.ts @@ -1233,13 +1233,7 @@ namespace ts { function getOldProgram(proj: ResolvedConfigFileName, parsed: ParsedCommandLine) { const value = builderPrograms.getValue(proj); if (value) return value; - const buildInfoPath = getOutputPathForBuildInfo(parsed.options); - if (!buildInfoPath) return undefined; - const content = readFileWithCache(buildInfoPath); - if (!content) return undefined; - const buildInfo = getBuildInfo(content); - if (buildInfo.version !== version) return undefined; - return buildInfo.program && createBuildProgramUsingProgramBuildInfo(buildInfo.program) as any as T; + return readBuilderProgram(parsed.options, readFileWithCache) as any as T; } function updateBundle(proj: ResolvedConfigFileName): BuildResultFlags { diff --git a/src/compiler/watch.ts b/src/compiler/watch.ts index 18d9e7807a3..e4660130be5 100644 --- a/src/compiler/watch.ts +++ b/src/compiler/watch.ts @@ -371,6 +371,19 @@ namespace ts { host.projectReferences = projectReferences; return host; } + + export function readBuilderProgram(compilerOptions: CompilerOptions, readFile: (path: string) => string | undefined) { + if (compilerOptions.out || compilerOptions.outFile) return undefined; + if (!isIncrementalCompilation(compilerOptions)) return undefined; + const buildInfoPath = getOutputPathForBuildInfo(compilerOptions); + if (!buildInfoPath) return undefined; + const content = readFile(buildInfoPath); + if (!content) return undefined; + const buildInfo = getBuildInfo(content); + if (buildInfo.version !== version) return undefined; + if (!buildInfo.program) return undefined; + return createBuildProgramUsingProgramBuildInfo(buildInfo.program); + } } namespace ts { @@ -645,7 +658,7 @@ namespace ts { ((typeDirectiveNames, containingFile, redirectedReference) => resolutionCache.resolveTypeReferenceDirectives(typeDirectiveNames, containingFile, redirectedReference)); const userProvidedResolution = !!host.resolveModuleNames || !!host.resolveTypeReferenceDirectives; - readBuilderProgram(); + readBuilderProgram(compilerOptions, path => compilerHost.readFile(path)); synchronizeProgram(); // Update the wild card directory watch @@ -677,18 +690,6 @@ namespace ts { } } - function readBuilderProgram() { - if (compilerOptions.out || compilerOptions.outFile) return; - if (!isIncrementalCompilation(compilerOptions)) return; - const buildInfoPath = getOutputPathForBuildInfo(compilerOptions); - if (!buildInfoPath) return; - const content = directoryStructureHost.readFile(buildInfoPath); - if (!content) return; - const buildInfo = JSON.parse(content) as BuildInfo; - if (!buildInfo.program) return; - builderProgram = createBuildProgramUsingProgramBuildInfo(buildInfo.program) as any as T; - } - function getCurrentBuilderProgram() { return builderProgram; } diff --git a/src/tsc/tsc.ts b/src/tsc/tsc.ts index 88c3cdedfd9..d53d5bd3bd6 100644 --- a/src/tsc/tsc.ts +++ b/src/tsc/tsc.ts @@ -147,6 +147,9 @@ namespace ts { reportWatchModeWithoutSysSupport(); createWatchOfConfigFile(configParseResult, commandLineOptions); } + else if (isIncrementalCompilation(configParseResult.options)) { + performIncrementalCompilation(configParseResult); + } else { performCompilation(configParseResult.fileNames, configParseResult.projectReferences, configParseResult.options, getConfigFileParsingDiagnostics(configParseResult)); } @@ -254,6 +257,44 @@ namespace ts { return sys.exit(exitStatus); } + function performIncrementalCompilation(config: ParsedCommandLine) { + const { options, fileNames, projectReferences } = config; + const host = createCompilerHost(options); + const currentDirectory = host.getCurrentDirectory(); + const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames()); + changeCompilerHostLikeToUseCache(host, fileName => toPath(fileName, currentDirectory, getCanonicalFileName)); + enableStatistics(options); + const oldProgram = readBuilderProgram(options, path => host.readFile(path)); + const configFileParsingDiagnostics = getConfigFileParsingDiagnostics(config); + const programOptions: CreateProgramOptions = { + rootNames: fileNames, + options, + projectReferences, + host, + configFileParsingDiagnostics: getConfigFileParsingDiagnostics(config), + }; + const program = createProgram(programOptions); + const builderProgram = createEmitAndSemanticDiagnosticsBuilderProgram( + program, + { + useCaseSensitiveFileNames: () => sys.useCaseSensitiveFileNames, + createHash: maybeBind(sys, sys.createHash), + writeFile: (path, data, writeByteOrderMark) => sys.writeFile(path, data, writeByteOrderMark) + }, + oldProgram, + configFileParsingDiagnostics + ); + + const exitStatus = emitFilesAndReportErrors( + builderProgram, + reportDiagnostic, + s => sys.write(s + sys.newLine), + createReportErrorSummary(options) + ); + reportStatistics(program); + return sys.exit(exitStatus); + } + function updateCreateProgram(host: { createProgram: CreateProgram; }) { const compileUsingBuilder = host.createProgram; host.createProgram = (rootNames, options, host, oldProgram, configFileParsingDiagnostics, projectReferences) => {