diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7cab43a6931..1b689cbf26f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -29651,7 +29651,7 @@ namespace ts { function checkCollisionWithArgumentsInGeneratedCode(node: SignatureDeclaration) { // no rest parameters \ declaration context \ overload - no codegen impact - if (languageVersion >= ScriptTarget.ES2015 || shouldSuppressEmit(compilerOptions) || !hasRestParameter(node) || node.flags & NodeFlags.Ambient || nodeIsMissing((node).body)) { + if (languageVersion >= ScriptTarget.ES2015 || compilerOptions.noEmit || !hasRestParameter(node) || node.flags & NodeFlags.Ambient || nodeIsMissing((node).body)) { return; } @@ -29726,7 +29726,7 @@ namespace ts { function checkCollisionWithRequireExportsInGeneratedCode(node: Node, name: Identifier) { // No need to check for require or exports for ES6 modules and later - if (moduleKind >= ModuleKind.ES2015 || shouldSuppressEmit(compilerOptions)) { + if (moduleKind >= ModuleKind.ES2015 || compilerOptions.noEmit) { return; } @@ -29749,7 +29749,7 @@ namespace ts { } function checkCollisionWithGlobalPromiseInGeneratedCode(node: Node, name: Identifier): void { - if (languageVersion >= ScriptTarget.ES2017 || shouldSuppressEmit(compilerOptions) || !needCollisionCheckForIdentifier(node, name, "Promise")) { + if (languageVersion >= ScriptTarget.ES2017 || compilerOptions.noEmit || !needCollisionCheckForIdentifier(node, name, "Promise")) { return; } @@ -35639,7 +35639,7 @@ namespace ts { return grammarErrorOnNode(node.exclamationToken, Diagnostics.Definite_assignment_assertions_can_only_be_used_along_with_a_type_annotation); } - if (compilerOptions.module !== ModuleKind.ES2015 && compilerOptions.module !== ModuleKind.ESNext && compilerOptions.module !== ModuleKind.System && !shouldSuppressEmit(compilerOptions) && + if (compilerOptions.module !== ModuleKind.ES2015 && compilerOptions.module !== ModuleKind.ESNext && compilerOptions.module !== ModuleKind.System && !compilerOptions.noEmit && !(node.parent.parent.flags & NodeFlags.Ambient) && hasModifier(node.parent.parent, ModifierFlags.Export)) { checkESModuleMarker(node.name); } diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 636d7c333f7..cbff1fb2512 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -332,7 +332,7 @@ namespace ts { // Write build information if applicable if (!buildInfoPath || targetSourceFile || emitSkipped) return; const program = host.getProgramBuildInfo(); - if (host.isEmitBlocked(buildInfoPath) || shouldSuppressEmit(compilerOptions)) { + if (host.isEmitBlocked(buildInfoPath) || compilerOptions.noEmit) { emitSkipped = true; return; } @@ -349,7 +349,7 @@ namespace ts { } // Make sure not to write js file and source map file if any of them cannot be written - if ((jsFilePath && host.isEmitBlocked(jsFilePath)) || shouldSuppressEmit(compilerOptions)) { + if ((jsFilePath && host.isEmitBlocked(jsFilePath)) || compilerOptions.noEmit) { emitSkipped = true; return; } @@ -436,7 +436,7 @@ namespace ts { onEmitNode: declarationTransform.emitNodeWithNotification, substituteNode: declarationTransform.substituteNode, }); - const declBlocked = (!!declarationTransform.diagnostics && !!declarationTransform.diagnostics.length) || !!host.isEmitBlocked(declarationFilePath) || !!shouldSuppressEmit(compilerOptions); + const declBlocked = (!!declarationTransform.diagnostics && !!declarationTransform.diagnostics.length) || !!host.isEmitBlocked(declarationFilePath) || !!compilerOptions.noEmit; emitSkipped = emitSkipped || declBlocked; if (!declBlocked || forceDtsEmit) { Debug.assert(declarationTransform.transformed.length === 1, "Should only see one output from the decl transform"); diff --git a/src/compiler/program.ts b/src/compiler/program.ts index df652da3f6a..883b793bd42 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1583,11 +1583,11 @@ namespace ts { function emitWorker(program: Program, sourceFile: SourceFile | undefined, writeFileCallback: WriteFileCallback | undefined, cancellationToken: CancellationToken | undefined, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers, forceDtsEmit?: boolean): EmitResult { let declarationDiagnostics: readonly Diagnostic[] = []; - if (options.listFilesOnly || (!forceDtsEmit && shouldSuppressEmit(options))) { - return { diagnostics: declarationDiagnostics, sourceMaps: undefined, emittedFiles: undefined, emitSkipped: true }; - } - if (!forceDtsEmit) { + if (options.noEmit) { + return { diagnostics: declarationDiagnostics, sourceMaps: undefined, emittedFiles: undefined, emitSkipped: true }; + } + // If the noEmitOnError flag is set, then check if we have any errors so far. If so, // immediately bail out. Note that we pass 'undefined' for 'sourceFile' so that we // get any preEmit diagnostics, not just the ones @@ -2037,9 +2037,7 @@ namespace ts { } function getGlobalDiagnostics(): SortedReadonlyArray { - return !options.listFilesOnly && rootNames.length - ? sortAndDeduplicateDiagnostics(getDiagnosticsProducingTypeChecker().getGlobalDiagnostics().slice()) - : emptyArray as any as SortedReadonlyArray; + return rootNames.length ? sortAndDeduplicateDiagnostics(getDiagnosticsProducingTypeChecker().getGlobalDiagnostics().slice()) : emptyArray as any as SortedReadonlyArray; } function getConfigFileParsingDiagnostics(): readonly Diagnostic[] { @@ -3092,7 +3090,7 @@ namespace ts { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "emitDeclarationOnly", "declaration", "composite"); } - if (shouldSuppressEmit(options)) { + if (options.noEmit) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "emitDeclarationOnly", "noEmit"); } } @@ -3115,7 +3113,7 @@ namespace ts { } // If the emit is enabled make sure that every output file is unique and not overwriting any of the input files - if (!shouldSuppressEmit(options) && !options.suppressOutputPathCheck) { + if (!options.noEmit && !options.suppressOutputPathCheck) { const emitHost = getEmitHost(); const emitFilesSeen = createMap(); forEachEmittedFile(emitHost, (emitFileNames) => { @@ -3184,7 +3182,7 @@ namespace ts { } function verifyProjectReferences() { - const buildInfoPath = !shouldSuppressEmit(options) && !options.suppressOutputPathCheck ? getTsBuildInfoEmitOutputFilePath(options) : undefined; + const buildInfoPath = !options.noEmit && !options.suppressOutputPathCheck ? getTsBuildInfoEmitOutputFilePath(options) : undefined; forEachProjectReference(projectReferences, resolvedProjectReferences, (resolvedRef, index, parent) => { const ref = (parent ? parent.commandLine.projectReferences : projectReferences)![index]; const parentFile = parent && parent.sourceFile as JsonSourceFile; @@ -3325,7 +3323,7 @@ namespace ts { } function isEmittedFile(file: string): boolean { - if (shouldSuppressEmit(options)) { + if (options.noEmit) { return false; } diff --git a/src/compiler/tsbuild.ts b/src/compiler/tsbuild.ts index dd590e357a4..1924be4df89 100644 --- a/src/compiler/tsbuild.ts +++ b/src/compiler/tsbuild.ts @@ -167,7 +167,6 @@ namespace ts { /*@internal*/ preserveWatchOutput?: boolean; /*@internal*/ listEmittedFiles?: boolean; /*@internal*/ listFiles?: boolean; - /*@internal*/ listFilesOnly?: boolean; /*@internal*/ pretty?: boolean; incremental?: boolean; @@ -1924,7 +1923,7 @@ namespace ts { } function isOutputFile(state: SolutionBuilderState, fileName: string, configFile: ParsedCommandLine) { - if (shouldSuppressEmit(configFile.options)) return false; + if (configFile.options.noEmit) return false; // ts or tsx files are not output if (!fileExtensionIs(fileName, Extension.Dts) && diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 4d14b6b7e0c..a841007d9d5 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -7619,14 +7619,6 @@ namespace ts { return option.strictFlag ? getStrictOptionValue(options, option.name as StrictOptionName) : options[option.name]; } - export function shouldSuppressEmit(options: CompilerOptions): boolean { - return !!options.noEmit || !!options.listFilesOnly; - } - - export function shouldListFiles(options: CompilerOptions): boolean { - return !!options.listFiles || !!options.listFilesOnly; - } - export function hasZeroOrOneAsteriskCharacter(str: string): boolean { let seenAsterisk = false; for (let i = 0; i < str.length; i++) { @@ -8347,8 +8339,7 @@ namespace ts { // If skipLibCheck is enabled, skip reporting errors if file is a declaration file. // If skipDefaultLibCheck is enabled, skip reporting errors if file contains a // '/// ' directive. - return options.listFilesOnly || - (options.skipLibCheck && sourceFile.isDeclarationFile || + return (options.skipLibCheck && sourceFile.isDeclarationFile || options.skipDefaultLibCheck && sourceFile.hasNoDefaultLib) || host.isSourceOfProjectReferenceRedirect(sourceFile.fileName); } diff --git a/src/compiler/watch.ts b/src/compiler/watch.ts index acbf4ff162a..63b194c2077 100644 --- a/src/compiler/watch.ts +++ b/src/compiler/watch.ts @@ -129,7 +129,7 @@ namespace ts { } export function listFiles(program: ProgramToEmitFilesAndReportErrors, writeFileName: (s: string) => void) { - if (shouldListFiles(program.getCompilerOptions())) { + if (program.getCompilerOptions().listFiles || program.getCompilerOptions().listFilesOnly) { forEach(program.getSourceFiles(), file => { writeFileName(file.fileName); }); @@ -149,6 +149,8 @@ namespace ts { emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers ) { + const isListFilesOnly = !!program.getCompilerOptions().listFilesOnly; + // First get and report any syntactic errors. const diagnostics = program.getConfigFileParsingDiagnostics().slice(); const configFileParsingDiagnosticsLength = diagnostics.length; @@ -158,15 +160,20 @@ namespace ts { // semantic errors. if (diagnostics.length === configFileParsingDiagnosticsLength) { addRange(diagnostics, program.getOptionsDiagnostics(cancellationToken)); - addRange(diagnostics, program.getGlobalDiagnostics(cancellationToken)); - if (diagnostics.length === configFileParsingDiagnosticsLength) { - addRange(diagnostics, program.getSemanticDiagnostics(/*sourceFile*/ undefined, cancellationToken)); + if (!isListFilesOnly) { + addRange(diagnostics, program.getGlobalDiagnostics(cancellationToken)); + + if (diagnostics.length === configFileParsingDiagnosticsLength) { + addRange(diagnostics, program.getSemanticDiagnostics(/*sourceFile*/ undefined, cancellationToken)); + } } } // Emit and report any errors we ran into. - const emitResult = program.emit(/*targetSourceFile*/ undefined, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers); + const emitResult = isListFilesOnly + ? { emitSkipped: true, diagnostics: emptyArray } + : program.emit(/*targetSourceFile*/ undefined, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers); const { emittedFiles, diagnostics: emitDiagnostics } = emitResult; addRange(diagnostics, emitDiagnostics);