From 11fd654cf997f6d031c7437fcb4c0b6e0862264e Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 9 Sep 2019 16:16:57 -0700 Subject: [PATCH] Separate emitOnlyDtsFiles and forcing dts emit (for builder signature detection where we want it irrespective of settings) --- src/compiler/builderState.ts | 13 ++++++++++--- src/compiler/emitter.ts | 21 ++++++++++++++------- src/compiler/program.ts | 10 ++++++---- src/compiler/types.ts | 2 ++ 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/compiler/builderState.ts b/src/compiler/builderState.ts index 9d2c55b5610..d1a9b2f5d59 100644 --- a/src/compiler/builderState.ts +++ b/src/compiler/builderState.ts @@ -15,9 +15,9 @@ namespace ts { /*@internal*/ namespace ts { export function getFileEmitOutput(program: Program, sourceFile: SourceFile, emitOnlyDtsFiles: boolean, - cancellationToken?: CancellationToken, customTransformers?: CustomTransformers): EmitOutput { + cancellationToken?: CancellationToken, customTransformers?: CustomTransformers, forceDtsEmit?: boolean): EmitOutput { const outputFiles: OutputFile[] = []; - const emitResult = program.emit(sourceFile, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers); + const emitResult = program.emit(sourceFile, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers, forceDtsEmit); return { outputFiles, emitSkipped: emitResult.emitSkipped, exportedModulesFromDeclarationEmit: emitResult.exportedModulesFromDeclarationEmit }; function writeFile(fileName: string, text: string, writeByteOrderMark: boolean) { @@ -344,7 +344,14 @@ namespace ts.BuilderState { } } else { - const emitOutput = getFileEmitOutput(programOfThisState, sourceFile, /*emitOnlyDtsFiles*/ true, cancellationToken); + const emitOutput = getFileEmitOutput( + programOfThisState, + sourceFile, + /*emitOnlyDtsFiles*/ true, + cancellationToken, + /*customTransformers*/ undefined, + /*forceDtsEmit*/ true + ); const firstDts = emitOutput.outputFiles && programOfThisState.getCompilerOptions().declarationMap ? emitOutput.outputFiles.length > 1 ? emitOutput.outputFiles[1] : undefined : diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 57cc47cf0e1..3f396aa2d9b 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -20,7 +20,7 @@ namespace ts { export function forEachEmittedFile( host: EmitHost, action: (emitFileNames: EmitFileNames, sourceFileOrBundle: SourceFile | Bundle | undefined) => T, sourceFilesOrTargetSourceFile?: ReadonlyArray | SourceFile, - emitOnlyDtsFiles = false, + forceDtsEmit = false, onlyBuildInfo?: boolean, includeBuildInfo?: boolean) { const sourceFiles = isArray(sourceFilesOrTargetSourceFile) ? sourceFilesOrTargetSourceFile : getSourceFilesToEmit(host, sourceFilesOrTargetSourceFile); @@ -29,7 +29,7 @@ namespace ts { const prepends = host.getPrependNodes(); if (sourceFiles.length || prepends.length) { const bundle = createBundle(sourceFiles, prepends); - const result = action(getOutputPathsFor(bundle, host, emitOnlyDtsFiles), bundle); + const result = action(getOutputPathsFor(bundle, host, forceDtsEmit), bundle); if (result) { return result; } @@ -38,7 +38,7 @@ namespace ts { else { if (!onlyBuildInfo) { for (const sourceFile of sourceFiles) { - const result = action(getOutputPathsFor(sourceFile, host, emitOnlyDtsFiles), sourceFile); + const result = action(getOutputPathsFor(sourceFile, host, forceDtsEmit), sourceFile); if (result) { return result; } @@ -227,7 +227,7 @@ namespace ts { /*@internal*/ // targetSourceFile is when users only want one file in entire project to be emitted. This is used in compileOnSave feature - export function emitFiles(resolver: EmitResolver, host: EmitHost, targetSourceFile: SourceFile | undefined, { scriptTransformers, declarationTransformers }: EmitTransformers, emitOnlyDtsFiles?: boolean, onlyBuildInfo?: boolean): EmitResult { + export function emitFiles(resolver: EmitResolver, host: EmitHost, targetSourceFile: SourceFile | undefined, { scriptTransformers, declarationTransformers }: EmitTransformers, emitOnlyDtsFiles?: boolean, onlyBuildInfo?: boolean, forceDtsEmit?: boolean): EmitResult { const compilerOptions = host.getCompilerOptions(); const sourceMapDataList: SourceMapEmitResult[] | undefined = (compilerOptions.sourceMap || compilerOptions.inlineSourceMap || getAreDeclarationMapsEnabled(compilerOptions)) ? [] : undefined; const emittedFilesList: string[] | undefined = compilerOptions.listEmittedFiles ? [] : undefined; @@ -241,7 +241,14 @@ namespace ts { // Emit each output file enter(); - forEachEmittedFile(host, emitSourceFileOrBundle, getSourceFilesToEmit(host, targetSourceFile), emitOnlyDtsFiles, onlyBuildInfo, !targetSourceFile); + forEachEmittedFile( + host, + emitSourceFileOrBundle, + getSourceFilesToEmit(host, targetSourceFile), + forceDtsEmit, + onlyBuildInfo, + !targetSourceFile + ); exit(); @@ -400,7 +407,7 @@ namespace ts { }); const declBlocked = (!!declarationTransform.diagnostics && !!declarationTransform.diagnostics.length) || !!host.isEmitBlocked(declarationFilePath) || !!compilerOptions.noEmit; emitSkipped = emitSkipped || declBlocked; - if (!declBlocked || emitOnlyDtsFiles) { + if (!declBlocked || forceDtsEmit) { Debug.assert(declarationTransform.transformed.length === 1, "Should only see one output from the decl transform"); printSourceFileOrBundle( declarationFilePath, @@ -415,7 +422,7 @@ namespace ts { // Explicitly do not passthru either `inline` option } ); - if (emitOnlyDtsFiles && declarationTransform.transformed[0].kind === SyntaxKind.SourceFile) { + if (forceDtsEmit && declarationTransform.transformed[0].kind === SyntaxKind.SourceFile) { const sourceFile = declarationTransform.transformed[0]; exportedModulesFromDeclarationEmit = sourceFile.exportedModulesFromDeclarationEmit; } diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 76c92ad74bb..76cccf79749 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1533,18 +1533,18 @@ namespace ts { return noDiagnosticsTypeChecker || (noDiagnosticsTypeChecker = createTypeChecker(program, /*produceDiagnostics:*/ false)); } - function emit(sourceFile?: SourceFile, writeFileCallback?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, transformers?: CustomTransformers): EmitResult { - return runWithCancellationToken(() => emitWorker(program, sourceFile, writeFileCallback, cancellationToken, emitOnlyDtsFiles, transformers)); + function emit(sourceFile?: SourceFile, writeFileCallback?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, transformers?: CustomTransformers, forceDtsEmit?: boolean): EmitResult { + return runWithCancellationToken(() => emitWorker(program, sourceFile, writeFileCallback, cancellationToken, emitOnlyDtsFiles, transformers, forceDtsEmit)); } function isEmitBlocked(emitFileName: string): boolean { return hasEmitBlockingDiagnostics.has(toPath(emitFileName)); } - function emitWorker(program: Program, sourceFile: SourceFile | undefined, writeFileCallback: WriteFileCallback | undefined, cancellationToken: CancellationToken | undefined, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): EmitResult { + function emitWorker(program: Program, sourceFile: SourceFile | undefined, writeFileCallback: WriteFileCallback | undefined, cancellationToken: CancellationToken | undefined, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers, forceDtsEmit?: boolean): EmitResult { let declarationDiagnostics: ReadonlyArray = []; - if (!emitOnlyDtsFiles) { + if (!forceDtsEmit) { if (options.noEmit) { return { diagnostics: declarationDiagnostics, sourceMaps: undefined, emittedFiles: undefined, emitSkipped: true }; } @@ -1593,6 +1593,8 @@ namespace ts { sourceFile, getTransformers(options, customTransformers, emitOnlyDtsFiles), emitOnlyDtsFiles, + /*onlyBuildInfo*/ false, + forceDtsEmit ); performance.mark("afterEmit"); diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 999a9220412..285f3101727 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -2980,6 +2980,8 @@ namespace ts { * will be invoked when writing the JavaScript and declaration files. */ emit(targetSourceFile?: SourceFile, writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): EmitResult; + /*@internal*/ + emit(targetSourceFile?: SourceFile, writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers, forceDtsEmit?: boolean): EmitResult; // tslint:disable-line unified-signatures getOptionsDiagnostics(cancellationToken?: CancellationToken): ReadonlyArray; getGlobalDiagnostics(cancellationToken?: CancellationToken): ReadonlyArray;