From 5b16ce9302059c4a213c2f8f7946874d2fb6eb34 Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Thu, 2 Nov 2017 14:49:38 -0700 Subject: [PATCH] fix(compiler-cli): don't report emit diagnostics when --noEmitOnError is off (#20063) --- packages/compiler-cli/index.ts | 2 ++ packages/compiler-cli/src/transformers/program.ts | 14 ++++++++++---- .../compiler-cli/test/transformers/program_spec.ts | 13 +++++++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/compiler-cli/index.ts b/packages/compiler-cli/index.ts index a4c9e99f77..c7fe86a9f6 100644 --- a/packages/compiler-cli/index.ts +++ b/packages/compiler-cli/index.ts @@ -22,3 +22,5 @@ export * from './src/perform_compile'; // and usages in G3 are changed to `CompilerOptions`. export {CompilerOptions as AngularCompilerOptions} from './src/transformers/api'; export {NgTools_InternalApi_NG_2 as __NGTOOLS_PRIVATE_API_2} from './src/ngtools_api'; + +export {ngToTsDiagnostic} from './src/transformers/util'; diff --git a/packages/compiler-cli/src/transformers/program.ts b/packages/compiler-cli/src/transformers/program.ts index 7f102a65f0..97e1ab0ae0 100644 --- a/packages/compiler-cli/src/transformers/program.ts +++ b/packages/compiler-cli/src/transformers/program.ts @@ -300,10 +300,16 @@ class AngularCompilerProgram implements Program { } } this.emittedSourceFiles = emittedSourceFiles; - // translate the diagnostics in the emitResult as well. - const translatedEmitDiags = translateDiagnostics(this.hostAdapter, emitResult.diagnostics); - emitResult.diagnostics = translatedEmitDiags.ts.concat( - this.structuralDiagnostics.concat(translatedEmitDiags.ng).map(ngToTsDiagnostic)); + + // Match behavior of tsc: only produce emit diagnostics if it would block + // emit. If noEmitOnError is false, the emit will happen in spite of any + // errors, so we should not report them. + if (this.options.noEmitOnError === true) { + // translate the diagnostics in the emitResult as well. + const translatedEmitDiags = translateDiagnostics(this.hostAdapter, emitResult.diagnostics); + emitResult.diagnostics = translatedEmitDiags.ts.concat( + this.structuralDiagnostics.concat(translatedEmitDiags.ng).map(ngToTsDiagnostic)); + } if (!outSrcMapping.length) { // if no files were emitted by TypeScript, also don't emit .json files diff --git a/packages/compiler-cli/test/transformers/program_spec.ts b/packages/compiler-cli/test/transformers/program_spec.ts index ea0dec37bb..757e2dbf46 100644 --- a/packages/compiler-cli/test/transformers/program_spec.ts +++ b/packages/compiler-cli/test/transformers/program_spec.ts @@ -893,6 +893,19 @@ describe('ng program', () => { `src/main.html(1,1): error TS100: Property 'nonExistent' does not exist on type 'MyComp'.`); }); + it('should not report emit errors with noEmitOnError=false', () => { + testSupport.writeFiles({ + 'src/main.ts': ` + @NgModule() + ` + }); + const options = testSupport.createCompilerOptions({noEmitOnError: false}); + const host = ng.createCompilerHost({options}); + const program1 = ng.createProgram( + {rootNames: [path.resolve(testSupport.basePath, 'src/main.ts')], options, host}); + expect(program1.emit().diagnostics.length).toBe(0); + }); + describe('errors', () => { const fileWithStructuralError = ` import {NgModule} from '@angular/core';