From 7bfeac746e717d02e062fe4a65c008060b8b662c Mon Sep 17 00:00:00 2001 From: Chuck Jazdzewski Date: Tue, 24 Oct 2017 12:52:14 -0700 Subject: [PATCH] fix(compiler-cli): only use error collector when needed. (#19912) The error collector changes behavior of the metadata resolver in ways that haven't been fully hardened. This changes limits its use to the lazy route detection and the language service. Issue: #19906 PR Close #19912 --- packages/compiler-cli/src/ngtools_api.ts | 2 +- packages/compiler-cli/src/transformers/api.ts | 3 +++ .../compiler-cli/src/transformers/program.ts | 17 +++++++++-------- packages/compiler-cli/test/ngc_spec.ts | 7 ++----- .../test/transformers/program_spec.ts | 6 +++--- packages/compiler/src/aot/compiler_factory.ts | 2 +- 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/packages/compiler-cli/src/ngtools_api.ts b/packages/compiler-cli/src/ngtools_api.ts index 2ef6dc0374..d08f6a226e 100644 --- a/packages/compiler-cli/src/ngtools_api.ts +++ b/packages/compiler-cli/src/ngtools_api.ts @@ -89,7 +89,7 @@ export class NgTools_InternalApi_NG_2 { // as we only needed this to support Angular CLI 1.5.0 rc.* const ngProgram = createProgram({ rootNames: options.program.getRootFileNames(), - options: options.angularCompilerOptions, + options: {...options.angularCompilerOptions, collectAllErrors: true}, host: options.host }); const lazyRoutes = ngProgram.listLazyRoutes(options.entryModule); diff --git a/packages/compiler-cli/src/transformers/api.ts b/packages/compiler-cli/src/transformers/api.ts index befe24da20..f57fcaffbd 100644 --- a/packages/compiler-cli/src/transformers/api.ts +++ b/packages/compiler-cli/src/transformers/api.ts @@ -150,6 +150,9 @@ export interface CompilerOptions extends ts.CompilerOptions { * in JIT mode. This is off by default. */ enableSummariesForJit?: boolean; + + /** @internal */ + collectAllErrors?: boolean; } export interface CompilerHost extends ts.CompilerHost { diff --git a/packages/compiler-cli/src/transformers/program.ts b/packages/compiler-cli/src/transformers/program.ts index ae253b2876..6d4c0f8db6 100644 --- a/packages/compiler-cli/src/transformers/program.ts +++ b/packages/compiler-cli/src/transformers/program.ts @@ -422,14 +422,15 @@ class AngularCompilerProgram implements Program { this.oldProgramLibrarySummaries); const aotOptions = getAotCompilerOptions(this.options); this._structuralDiagnostics = []; - const errorCollector = (err: any) => { - this._structuralDiagnostics !.push({ - messageText: err.toString(), - category: ts.DiagnosticCategory.Error, - source: SOURCE, - code: DEFAULT_ERROR_CODE - }); - }; + const errorCollector = + (this.options.collectAllErrors || this.options.fullTemplateTypeCheck) ? (err: any) => { + this._structuralDiagnostics !.push({ + messageText: err.toString(), + category: ts.DiagnosticCategory.Error, + source: SOURCE, + code: DEFAULT_ERROR_CODE + }); + } : undefined; this._compiler = createAotCompiler(this._hostAdapter, aotOptions, errorCollector).compiler; } diff --git a/packages/compiler-cli/test/ngc_spec.ts b/packages/compiler-cli/test/ngc_spec.ts index 68aa809ad9..7882cb80de 100644 --- a/packages/compiler-cli/test/ngc_spec.ts +++ b/packages/compiler-cli/test/ngc_spec.ts @@ -1424,11 +1424,8 @@ describe('ngc transformer command-line', () => { const messages: string[] = []; const exitCode = main(['-p', path.join(basePath, 'src/tsconfig.json')], message => messages.push(message)); - expect(exitCode).toBe(1, 'Compile was expected to fail'); - expect(messages).toEqual([ - 'Error: Error: Error encountered resolving symbol values statically. Tagged template expressions are not supported in metadata (position 3:27 in the original .ts file)\n' + - 'Error: No template specified for component TestComponent\n' - ]); + expect(exitCode).toBe(2, 'Compile was expected to fail'); + expect(messages[0]).toContain(['Tagged template expressions are not supported in metadata']); }); }); }); diff --git a/packages/compiler-cli/test/transformers/program_spec.ts b/packages/compiler-cli/test/transformers/program_spec.ts index 3a9f314840..b74a49c3d9 100644 --- a/packages/compiler-cli/test/transformers/program_spec.ts +++ b/packages/compiler-cli/test/transformers/program_spec.ts @@ -578,8 +578,8 @@ describe('ng program', () => { }); } - function createProgram(rootNames: string[]) { - const options = testSupport.createCompilerOptions(); + function createProgram(rootNames: string[], overrideOptions: ng.CompilerOptions = {}) { + const options = testSupport.createCompilerOptions(overrideOptions); const host = ng.createCompilerHost({options}); const program = ng.createProgram( {rootNames: rootNames.map(p => path.resolve(testSupport.basePath, p)), options, host}); @@ -821,7 +821,7 @@ describe('ng program', () => { export class ChildModule {} `, }); - const program = createProgram(['src/main.ts']).program; + const program = createProgram(['src/main.ts'], {collectAllErrors: true}).program; expect(normalizeRoutes(program.listLazyRoutes('src/main#MainModule'))).toEqual([{ module: {name: 'MainModule', filePath: path.resolve(testSupport.basePath, 'src/main.ts')}, referencedModule: diff --git a/packages/compiler/src/aot/compiler_factory.ts b/packages/compiler/src/aot/compiler_factory.ts index 2bfd4b91df..20dd4a941b 100644 --- a/packages/compiler/src/aot/compiler_factory.ts +++ b/packages/compiler/src/aot/compiler_factory.ts @@ -54,7 +54,7 @@ export function createAotUrlResolver(host: { */ export function createAotCompiler( compilerHost: AotCompilerHost, options: AotCompilerOptions, - errorCollector: (error: any, type?: any) => + errorCollector?: (error: any, type?: any) => void): {compiler: AotCompiler, reflector: StaticReflector} { let translations: string = options.translations || '';