Skip to content

Commit 838a610

Browse files
rkirovMatias Niemelä
authored andcommitted
fix(compiler): don't typecheck all inputs (#22899)
ngc knows to filter out d.ts inputs, but the logic accidentally depended on whether it had a previous Program lying around. Fixing that logic puts ngc on the fast code path, but in that code path it must be able to merge tsickle EmitResults, so we need to plumb the tsickle.mergeEmitResults function through all the intervening APIs. The bulk of this change is that plumbing. PR Close #22899
1 parent f461f43 commit 838a610

File tree

4 files changed

+36
-18
lines changed

4 files changed

+36
-18
lines changed

packages/bazel/src/ngc-wrapped/index.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,12 @@ export function compile({allowNonHermeticReads, allDepsCompiledWithBazel = true,
238238
gatherDiagnostics = (program) =>
239239
gatherDiagnosticsForInputsOnly(compilerOpts, bazelOpts, program);
240240
}
241-
const {diagnostics, emitResult, program} = ng.performCompilation(
242-
{rootNames: files, options: compilerOpts, host: ngHost, emitCallback, gatherDiagnostics});
241+
const {diagnostics, emitResult, program} = ng.performCompilation({
242+
rootNames: files,
243+
options: compilerOpts,
244+
host: ngHost, emitCallback,
245+
mergeEmitResultsCallback: tsickle.mergeEmitResults, gatherDiagnostics
246+
});
243247
const tsickleEmitResult = emitResult as tsickle.EmitResult;
244248
let externs = '/** @externs */\n';
245249
if (!diagnostics.length) {

packages/compiler-cli/src/perform_compile.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,13 +186,15 @@ export function exitCodeFromResult(diags: Diagnostics | undefined): number {
186186
}
187187

188188
export function performCompilation({rootNames, options, host, oldProgram, emitCallback,
189+
mergeEmitResultsCallback,
189190
gatherDiagnostics = defaultGatherDiagnostics,
190191
customTransformers, emitFlags = api.EmitFlags.Default}: {
191192
rootNames: string[],
192193
options: api.CompilerOptions,
193194
host?: api.CompilerHost,
194195
oldProgram?: api.Program,
195196
emitCallback?: api.TsEmitCallback,
197+
mergeEmitResultsCallback?: api.TsMergeEmitResultsCallback,
196198
gatherDiagnostics?: (program: api.Program) => Diagnostics,
197199
customTransformers?: api.CustomTransformers,
198200
emitFlags?: api.EmitFlags
@@ -216,7 +218,8 @@ export function performCompilation({rootNames, options, host, oldProgram, emitCa
216218
}
217219

218220
if (!hasErrors(allDiagnostics)) {
219-
emitResult = program !.emit({emitCallback, customTransformers, emitFlags});
221+
emitResult =
222+
program !.emit({emitCallback, mergeEmitResultsCallback, customTransformers, emitFlags});
220223
allDiagnostics.push(...emitResult.diagnostics);
221224
return {diagnostics: allDiagnostics, program, emitResult};
222225
}

packages/compiler-cli/src/transformers/api.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ export interface TsEmitArguments {
260260
}
261261

262262
export interface TsEmitCallback { (args: TsEmitArguments): ts.EmitResult; }
263+
export interface TsMergeEmitResultsCallback { (results: ts.EmitResult[]): ts.EmitResult; }
263264

264265
/**
265266
* @internal
@@ -353,11 +354,13 @@ export interface Program {
353354
*
354355
* Angular structural information is required to emit files.
355356
*/
356-
emit({emitFlags, cancellationToken, customTransformers, emitCallback}?: {
357+
emit({emitFlags, cancellationToken, customTransformers, emitCallback,
358+
mergeEmitResultsCallback}?: {
357359
emitFlags?: EmitFlags,
358360
cancellationToken?: ts.CancellationToken,
359361
customTransformers?: CustomTransformers,
360-
emitCallback?: TsEmitCallback
362+
emitCallback?: TsEmitCallback,
363+
mergeEmitResultsCallback?: TsMergeEmitResultsCallback
361364
}): ts.EmitResult;
362365

363366
/**

packages/compiler-cli/src/transformers/program.ts

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import * as ts from 'typescript';
1515
import {TypeCheckHost, translateDiagnostics} from '../diagnostics/translate_diagnostics';
1616
import {MetadataCollector, ModuleMetadata, createBundleIndexHost} from '../metadata/index';
1717

18-
import {CompilerHost, CompilerOptions, CustomTransformers, DEFAULT_ERROR_CODE, Diagnostic, DiagnosticMessageChain, EmitFlags, LazyRoute, LibrarySummary, Program, SOURCE, TsEmitArguments, TsEmitCallback} from './api';
18+
import {CompilerHost, CompilerOptions, CustomTransformers, DEFAULT_ERROR_CODE, Diagnostic, DiagnosticMessageChain, EmitFlags, LazyRoute, LibrarySummary, Program, SOURCE, TsEmitArguments, TsEmitCallback, TsMergeEmitResultsCallback} from './api';
1919
import {CodeGenerator, TsCompilerAotCompilerTypeCheckHostAdapter, getOriginalReferences} from './compiler_host';
2020
import {InlineResourcesMetadataTransformer, getInlineResourcesTransformFactory} from './inline_resources';
2121
import {LowerMetadataTransform, getExpressionLoweringTransformFactory} from './lower_expressions';
@@ -270,7 +270,8 @@ class AngularCompilerProgram implements Program {
270270
emitFlags?: EmitFlags,
271271
cancellationToken?: ts.CancellationToken,
272272
customTransformers?: CustomTransformers,
273-
emitCallback?: TsEmitCallback
273+
emitCallback?: TsEmitCallback,
274+
mergeEmitResultsCallback?: TsMergeEmitResultsCallback,
274275
} = {}): ts.EmitResult {
275276
return this.options.enableIvy === true ? this._emitRender3(parameters) :
276277
this._emitRender2(parameters);
@@ -281,12 +282,15 @@ class AngularCompilerProgram implements Program {
281282
}
282283

283284
private _emitRender3(
284-
{emitFlags = EmitFlags.Default, cancellationToken, customTransformers,
285-
emitCallback = defaultEmitCallback}: {
285+
{
286+
emitFlags = EmitFlags.Default, cancellationToken, customTransformers,
287+
emitCallback = defaultEmitCallback, mergeEmitResultsCallback = mergeEmitResults,
288+
}: {
286289
emitFlags?: EmitFlags,
287290
cancellationToken?: ts.CancellationToken,
288291
customTransformers?: CustomTransformers,
289-
emitCallback?: TsEmitCallback
292+
emitCallback?: TsEmitCallback,
293+
mergeEmitResultsCallback?: TsMergeEmitResultsCallback,
290294
} = {}): ts.EmitResult {
291295
const emitStart = Date.now();
292296
if ((emitFlags & (EmitFlags.JS | EmitFlags.DTS | EmitFlags.Metadata | EmitFlags.Codegen)) ===
@@ -328,12 +332,15 @@ class AngularCompilerProgram implements Program {
328332
}
329333

330334
private _emitRender2(
331-
{emitFlags = EmitFlags.Default, cancellationToken, customTransformers,
332-
emitCallback = defaultEmitCallback}: {
335+
{
336+
emitFlags = EmitFlags.Default, cancellationToken, customTransformers,
337+
emitCallback = defaultEmitCallback, mergeEmitResultsCallback = mergeEmitResults,
338+
}: {
333339
emitFlags?: EmitFlags,
334340
cancellationToken?: ts.CancellationToken,
335341
customTransformers?: CustomTransformers,
336-
emitCallback?: TsEmitCallback
342+
emitCallback?: TsEmitCallback,
343+
mergeEmitResultsCallback?: TsMergeEmitResultsCallback,
337344
} = {}): ts.EmitResult {
338345
const emitStart = Date.now();
339346
if (emitFlags & EmitFlags.I18nBundle) {
@@ -416,7 +423,7 @@ class AngularCompilerProgram implements Program {
416423
(sourceFilesToEmit.length + genTsFiles.length) < MAX_FILE_COUNT_FOR_SINGLE_FILE_EMIT) {
417424
const fileNamesToEmit =
418425
[...sourceFilesToEmit.map(sf => sf.fileName), ...genTsFiles.map(gf => gf.genFileUrl)];
419-
emitResult = mergeEmitResults(
426+
emitResult = mergeEmitResultsCallback(
420427
fileNamesToEmit.map((fileName) => emitResult = emitCallback({
421428
program: this.tsProgram,
422429
host: this.host,
@@ -777,11 +784,12 @@ class AngularCompilerProgram implements Program {
777784
private getSourceFilesForEmit(): ts.SourceFile[]|undefined {
778785
// TODO(tbosch): if one of the files contains a `const enum`
779786
// always emit all files -> return undefined!
780-
let sourceFilesToEmit: ts.SourceFile[]|undefined;
787+
let sourceFilesToEmit = this.tsProgram.getSourceFiles().filter(
788+
sf => { return !sf.isDeclarationFile && !GENERATED_FILES.test(sf.fileName); });
781789
if (this.oldProgramEmittedSourceFiles) {
782-
sourceFilesToEmit = this.tsProgram.getSourceFiles().filter(sf => {
790+
sourceFilesToEmit = sourceFilesToEmit.filter(sf => {
783791
const oldFile = this.oldProgramEmittedSourceFiles !.get(sf.fileName);
784-
return !sf.isDeclarationFile && !GENERATED_FILES.test(sf.fileName) && sf !== oldFile;
792+
return sf !== oldFile;
785793
});
786794
}
787795
return sourceFilesToEmit;
@@ -1020,7 +1028,7 @@ function mergeEmitResults(emitResults: ts.EmitResult[]): ts.EmitResult {
10201028
for (const er of emitResults) {
10211029
diagnostics.push(...er.diagnostics);
10221030
emitSkipped = emitSkipped || er.emitSkipped;
1023-
emittedFiles.push(...er.emittedFiles);
1031+
emittedFiles.push(...(er.emittedFiles || []));
10241032
}
10251033
return {diagnostics, emitSkipped, emittedFiles};
10261034
}

0 commit comments

Comments
 (0)