From 35470b3f3bdde41a4d975b84a5f8d40853b05952 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 25 Mar 2019 12:37:55 -0700 Subject: [PATCH] Make tsbuildInfoFile as commandline option to tsc (and not tsc -b) --- src/compiler/builder.ts | 6 ++-- src/compiler/commandLineParser.ts | 1 - src/compiler/diagnosticMessages.json | 2 +- src/compiler/emitter.ts | 3 +- src/compiler/program.ts | 16 ++++++---- .../unittests/config/commandLineParsing.ts | 29 ++++++++++++++++++- src/tsc/tsc.ts | 29 +++++++------------ .../baselines/reference/incrementalConfig.js | 6 ++++ .../reference/incrementalConfig.symbols | 4 +++ .../reference/incrementalConfig.types | 5 ++++ .../reference/incrementalInvalid.errors.txt | 8 +++++ .../baselines/reference/incrementalInvalid.js | 7 +++++ .../reference/incrementalInvalid.symbols | 5 ++++ .../reference/incrementalInvalid.types | 6 ++++ tests/baselines/reference/incrementalOut.js | 7 +++++ .../reference/incrementalOut.symbols | 5 ++++ .../baselines/reference/incrementalOut.types | 6 ++++ .../reference/invalidIncremental.errors.txt | 8 ----- .../baselines/reference/invalidIncremental.js | 7 ----- .../reference/invalidIncremental.symbols | 5 ---- .../reference/invalidIncremental.types | 6 ---- tests/cases/compiler/incrementalConfig.ts | 8 +++++ ...idIncremental.ts => incrementalInvalid.ts} | 0 tests/cases/compiler/incrementalOut.ts | 5 ++++ 24 files changed, 126 insertions(+), 58 deletions(-) create mode 100644 tests/baselines/reference/incrementalConfig.js create mode 100644 tests/baselines/reference/incrementalConfig.symbols create mode 100644 tests/baselines/reference/incrementalConfig.types create mode 100644 tests/baselines/reference/incrementalInvalid.errors.txt create mode 100644 tests/baselines/reference/incrementalInvalid.js create mode 100644 tests/baselines/reference/incrementalInvalid.symbols create mode 100644 tests/baselines/reference/incrementalInvalid.types create mode 100644 tests/baselines/reference/incrementalOut.js create mode 100644 tests/baselines/reference/incrementalOut.symbols create mode 100644 tests/baselines/reference/incrementalOut.types delete mode 100644 tests/baselines/reference/invalidIncremental.errors.txt delete mode 100644 tests/baselines/reference/invalidIncremental.js delete mode 100644 tests/baselines/reference/invalidIncremental.symbols delete mode 100644 tests/baselines/reference/invalidIncremental.types create mode 100644 tests/cases/compiler/incrementalConfig.ts rename tests/cases/compiler/{invalidIncremental.ts => incrementalInvalid.ts} (100%) create mode 100644 tests/cases/compiler/incrementalOut.ts diff --git a/src/compiler/builder.ts b/src/compiler/builder.ts index faf51568241..f72f30b226c 100644 --- a/src/compiler/builder.ts +++ b/src/compiler/builder.ts @@ -792,7 +792,7 @@ namespace ts { state, // When whole program is affected, do emit only once (eg when --out or --outFile is specified) // Otherwise just affected file - affected.emitBuildInfo(writeFile || host.writeFile, cancellationToken), + affected.emitBuildInfo(writeFile || maybeBind(host, host.writeFile), cancellationToken), affected, /*isPendingEmitFile*/ false, /*isBuildInfoEmit*/ true @@ -820,7 +820,7 @@ namespace ts { state, // When whole program is affected, do emit only once (eg when --out or --outFile is specified) // Otherwise just affected file - Debug.assertDefined(state.program).emit(affected === state.program ? undefined : affected as SourceFile, writeFile || host.writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers), + Debug.assertDefined(state.program).emit(affected === state.program ? undefined : affected as SourceFile, writeFile || maybeBind(host, host.writeFile), cancellationToken, emitOnlyDtsFiles, customTransformers), affected, isPendingEmitFile ); @@ -862,7 +862,7 @@ namespace ts { }; } } - return Debug.assertDefined(state.program).emit(targetSourceFile, writeFile || host.writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers); + return Debug.assertDefined(state.program).emit(targetSourceFile, writeFile || maybeBind(host, host.writeFile), cancellationToken, emitOnlyDtsFiles, customTransformers); } /** diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index a200ebf67e0..12a20e0df42 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -343,7 +343,6 @@ namespace ts { type: "string", isFilePath: true, paramType: Diagnostics.FILE, - isTSConfigOnly: true, category: Diagnostics.Basic_Options, description: Diagnostics.Specify_file_to_store_incremental_compilation_information, }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 6638d2c409a..6cb498df827 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3072,7 +3072,7 @@ "category": "Error", "code": 5073 }, - "Option '--incremental' can only be specified when using tsconfig.": { + "Option '--incremental' can only be specified using tsconfig, emitting to single file or when option `--tsBuildInfoFile` is specified.": { "category": "Error", "code": 5074 }, diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index be867db68fb..8f91e3d25c1 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -54,7 +54,7 @@ namespace ts { /*@internal*/ export function getOutputPathForBuildInfo(options: CompilerOptions) { const configFile = options.configFilePath; - if (!configFile || !isIncrementalCompilation(options)) return undefined; + if (!isIncrementalCompilation(options)) return undefined; if (options.tsBuildInfoFile) return options.tsBuildInfoFile; const outPath = options.outFile || options.out; let buildInfoExtensionLess: string; @@ -62,6 +62,7 @@ namespace ts { buildInfoExtensionLess = removeFileExtension(outPath); } else { + if (!configFile) return undefined; const configFileExtensionLess = removeFileExtension(configFile); buildInfoExtensionLess = options.outDir ? options.rootDir ? diff --git a/src/compiler/program.ts b/src/compiler/program.ts index b65c8c0431c..5bace99aa53 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -198,7 +198,8 @@ namespace ts { getDirectories: (path: string) => system.getDirectories(path), realpath, readDirectory: (path, extensions, include, exclude, depth) => system.readDirectory(path, extensions, include, exclude, depth), - createDirectory: d => system.createDirectory(d) + createDirectory: d => system.createDirectory(d), + createHash: maybeBind(system, system.createHash) }; return compilerHost; } @@ -320,7 +321,10 @@ namespace ts { }; } - export function getPreEmitDiagnostics(program: Program, sourceFile?: SourceFile, cancellationToken?: CancellationToken): ReadonlyArray { + // tslint:disable unified-signatures + export function getPreEmitDiagnostics(program: Program, sourceFile?: SourceFile, cancellationToken?: CancellationToken): ReadonlyArray; + /*@internal*/ export function getPreEmitDiagnostics(program: BuilderProgram, sourceFile?: SourceFile, cancellationToken?: CancellationToken): ReadonlyArray; + export function getPreEmitDiagnostics(program: Program | BuilderProgram, sourceFile?: SourceFile, cancellationToken?: CancellationToken): ReadonlyArray { const diagnostics = [ ...program.getConfigFileParsingDiagnostics(), ...program.getOptionsDiagnostics(cancellationToken), @@ -335,6 +339,7 @@ namespace ts { return sortAndDeduplicateDiagnostics(diagnostics); } + // tslint:enable unified-signatures export interface FormatDiagnosticsHost { getCurrentDirectory(): string; @@ -2722,10 +2727,6 @@ namespace ts { createDiagnosticForOptionName(Diagnostics.Option_paths_cannot_be_used_without_specifying_baseUrl_option, "paths"); } - if (options.incremental && !options.configFilePath) { - programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Option_incremental_can_only_be_specified_when_using_tsconfig)); - } - if (options.composite) { if (options.declaration === false) { createDiagnosticForOptionName(Diagnostics.Composite_projects_may_not_disable_declaration_emit, "declaration"); @@ -2740,6 +2741,9 @@ namespace ts { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "tsBuildInfoFile", "incremental", "composite"); } } + else if (options.incremental && !options.outFile && !options.out && !options.configFilePath) { + programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Option_incremental_can_only_be_specified_using_tsconfig_emitting_to_single_file_or_when_option_tsBuildInfoFile_is_specified)); + } verifyProjectReferences(); diff --git a/src/testRunner/unittests/config/commandLineParsing.ts b/src/testRunner/unittests/config/commandLineParsing.ts index 33716841b79..ccb2378c644 100644 --- a/src/testRunner/unittests/config/commandLineParsing.ts +++ b/src/testRunner/unittests/config/commandLineParsing.ts @@ -375,6 +375,16 @@ namespace ts { options: { incremental: true } }); }); + + it("parse --tsBuildInfoFile", () => { + // --lib es6 0.ts + assertParseResult(["--tsBuildInfoFile", "build.tsbuildinfo", "0.ts"], + { + errors: [], + fileNames: ["0.ts"], + options: { tsBuildInfoFile: "build.tsbuildinfo" } + }); + }); }); describe("unittests:: config:: commandLineParsing:: parseBuildOptions", () => { @@ -466,7 +476,7 @@ namespace ts { }); }); - it("parse build with --incremental ", () => { + it("parse build with --incremental", () => { // --lib es6 0.ts assertParseResult(["--incremental", "tests"], { @@ -476,6 +486,23 @@ namespace ts { }); }); + it("parse build with --tsBuildInfoFile", () => { + // --lib es6 0.ts + assertParseResult(["--tsBuildInfoFile", "build.tsbuildinfo", "tests"], + { + errors: [{ + messageText: "Unknown build option '--tsBuildInfoFile'.", + category: Diagnostics.Unknown_build_option_0.category, + code: Diagnostics.Unknown_build_option_0.code, + file: undefined, + start: undefined, + length: undefined + }], + projects: ["build.tsbuildinfo", "tests"], + buildOptions: { } + }); + }); + describe("Combining options that make no sense together", () => { function verifyInvalidCombination(flag1: keyof BuildOptions, flag2: keyof BuildOptions) { it(`--${flag1} and --${flag2} together is invalid`, () => { diff --git a/src/tsc/tsc.ts b/src/tsc/tsc.ts index 499848fdf92..b8ee7e3c8d1 100644 --- a/src/tsc/tsc.ts +++ b/src/tsc/tsc.ts @@ -165,6 +165,9 @@ namespace ts { reportWatchModeWithoutSysSupport(); createWatchOfFilesAndCompilerOptions(commandLine.fileNames, commandLineOptions); } + else if (isIncrementalCompilation(commandLineOptions)) { + performIncrementalCompilation(commandLine); + } else { performCompilation(commandLine.fileNames, /*references*/ undefined, commandLineOptions); } @@ -265,34 +268,22 @@ namespace ts { 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 + fileNames, + options, + host, + readBuilderProgram(options, path => host.readFile(path)), + configFileParsingDiagnostics, + projectReferences ); - const exitStatus = emitFilesAndReportErrors( builderProgram, reportDiagnostic, s => sys.write(s + sys.newLine), createReportErrorSummary(options) ); - reportStatistics(program); + reportStatistics(builderProgram.getProgram()); return sys.exit(exitStatus); } diff --git a/tests/baselines/reference/incrementalConfig.js b/tests/baselines/reference/incrementalConfig.js new file mode 100644 index 00000000000..b90c65b9f09 --- /dev/null +++ b/tests/baselines/reference/incrementalConfig.js @@ -0,0 +1,6 @@ +//// [a.ts] +const x = 10; + + +//// [a.js] +var x = 10; diff --git a/tests/baselines/reference/incrementalConfig.symbols b/tests/baselines/reference/incrementalConfig.symbols new file mode 100644 index 00000000000..05c35bcf58a --- /dev/null +++ b/tests/baselines/reference/incrementalConfig.symbols @@ -0,0 +1,4 @@ +=== /a.ts === +const x = 10; +>x : Symbol(x, Decl(a.ts, 0, 5)) + diff --git a/tests/baselines/reference/incrementalConfig.types b/tests/baselines/reference/incrementalConfig.types new file mode 100644 index 00000000000..ed892fed2ba --- /dev/null +++ b/tests/baselines/reference/incrementalConfig.types @@ -0,0 +1,5 @@ +=== /a.ts === +const x = 10; +>x : 10 +>10 : 10 + diff --git a/tests/baselines/reference/incrementalInvalid.errors.txt b/tests/baselines/reference/incrementalInvalid.errors.txt new file mode 100644 index 00000000000..6c88c5fc9d3 --- /dev/null +++ b/tests/baselines/reference/incrementalInvalid.errors.txt @@ -0,0 +1,8 @@ +error TS5074: Option '--incremental' can only be specified using tsconfig, emitting to single file or when option `--tsBuildInfoFile` is specified. + + +!!! error TS5074: Option '--incremental' can only be specified using tsconfig, emitting to single file or when option `--tsBuildInfoFile` is specified. +==== tests/cases/compiler/incrementalInvalid.ts (0 errors) ==== + const x = 10; + + \ No newline at end of file diff --git a/tests/baselines/reference/incrementalInvalid.js b/tests/baselines/reference/incrementalInvalid.js new file mode 100644 index 00000000000..6ca4b1b2dad --- /dev/null +++ b/tests/baselines/reference/incrementalInvalid.js @@ -0,0 +1,7 @@ +//// [incrementalInvalid.ts] +const x = 10; + + + +//// [incrementalInvalid.js] +var x = 10; diff --git a/tests/baselines/reference/incrementalInvalid.symbols b/tests/baselines/reference/incrementalInvalid.symbols new file mode 100644 index 00000000000..7a75ad5da9d --- /dev/null +++ b/tests/baselines/reference/incrementalInvalid.symbols @@ -0,0 +1,5 @@ +=== tests/cases/compiler/incrementalInvalid.ts === +const x = 10; +>x : Symbol(x, Decl(incrementalInvalid.ts, 0, 5)) + + diff --git a/tests/baselines/reference/incrementalInvalid.types b/tests/baselines/reference/incrementalInvalid.types new file mode 100644 index 00000000000..90e391222dd --- /dev/null +++ b/tests/baselines/reference/incrementalInvalid.types @@ -0,0 +1,6 @@ +=== tests/cases/compiler/incrementalInvalid.ts === +const x = 10; +>x : 10 +>10 : 10 + + diff --git a/tests/baselines/reference/incrementalOut.js b/tests/baselines/reference/incrementalOut.js new file mode 100644 index 00000000000..af73fb45a22 --- /dev/null +++ b/tests/baselines/reference/incrementalOut.js @@ -0,0 +1,7 @@ +//// [incrementalOut.ts] +const x = 10; + + + +//// [output.js] +var x = 10; diff --git a/tests/baselines/reference/incrementalOut.symbols b/tests/baselines/reference/incrementalOut.symbols new file mode 100644 index 00000000000..6ad1a4d76ee --- /dev/null +++ b/tests/baselines/reference/incrementalOut.symbols @@ -0,0 +1,5 @@ +=== tests/cases/compiler/incrementalOut.ts === +const x = 10; +>x : Symbol(x, Decl(incrementalOut.ts, 0, 5)) + + diff --git a/tests/baselines/reference/incrementalOut.types b/tests/baselines/reference/incrementalOut.types new file mode 100644 index 00000000000..55b02107adf --- /dev/null +++ b/tests/baselines/reference/incrementalOut.types @@ -0,0 +1,6 @@ +=== tests/cases/compiler/incrementalOut.ts === +const x = 10; +>x : 10 +>10 : 10 + + diff --git a/tests/baselines/reference/invalidIncremental.errors.txt b/tests/baselines/reference/invalidIncremental.errors.txt deleted file mode 100644 index cdd19e67093..00000000000 --- a/tests/baselines/reference/invalidIncremental.errors.txt +++ /dev/null @@ -1,8 +0,0 @@ -error TS5074: Option '--incremental' can only be specified when using tsconfig. - - -!!! error TS5074: Option '--incremental' can only be specified when using tsconfig. -==== tests/cases/compiler/invalidIncremental.ts (0 errors) ==== - const x = 10; - - \ No newline at end of file diff --git a/tests/baselines/reference/invalidIncremental.js b/tests/baselines/reference/invalidIncremental.js deleted file mode 100644 index 4798b1d4fa3..00000000000 --- a/tests/baselines/reference/invalidIncremental.js +++ /dev/null @@ -1,7 +0,0 @@ -//// [invalidIncremental.ts] -const x = 10; - - - -//// [invalidIncremental.js] -var x = 10; diff --git a/tests/baselines/reference/invalidIncremental.symbols b/tests/baselines/reference/invalidIncremental.symbols deleted file mode 100644 index 840f3d76536..00000000000 --- a/tests/baselines/reference/invalidIncremental.symbols +++ /dev/null @@ -1,5 +0,0 @@ -=== tests/cases/compiler/invalidIncremental.ts === -const x = 10; ->x : Symbol(x, Decl(invalidIncremental.ts, 0, 5)) - - diff --git a/tests/baselines/reference/invalidIncremental.types b/tests/baselines/reference/invalidIncremental.types deleted file mode 100644 index 2035b6fa749..00000000000 --- a/tests/baselines/reference/invalidIncremental.types +++ /dev/null @@ -1,6 +0,0 @@ -=== tests/cases/compiler/invalidIncremental.ts === -const x = 10; ->x : 10 ->10 : 10 - - diff --git a/tests/cases/compiler/incrementalConfig.ts b/tests/cases/compiler/incrementalConfig.ts new file mode 100644 index 00000000000..6ed172c837a --- /dev/null +++ b/tests/cases/compiler/incrementalConfig.ts @@ -0,0 +1,8 @@ +// @incremental: true + +// @Filename: /a.ts +const x = 10; + +// @Filename: /tsconfig.json +{ } + diff --git a/tests/cases/compiler/invalidIncremental.ts b/tests/cases/compiler/incrementalInvalid.ts similarity index 100% rename from tests/cases/compiler/invalidIncremental.ts rename to tests/cases/compiler/incrementalInvalid.ts diff --git a/tests/cases/compiler/incrementalOut.ts b/tests/cases/compiler/incrementalOut.ts new file mode 100644 index 00000000000..4cd49dbba11 --- /dev/null +++ b/tests/cases/compiler/incrementalOut.ts @@ -0,0 +1,5 @@ +// @incremental: true +// @out: output.js + +const x = 10; +