From 14aa6d090e44e0455d9ff76b202407773e25decc Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Mon, 3 Feb 2020 10:48:05 -0800 Subject: [PATCH] refactor(ivy): compute ignoreFiles for compilation on initialization (#34792) This commit moves the calculation of `ignoreFiles` - the set of files to be ignored by a consumer of the `NgCompiler` API - from its `prepareEmit` operation to its initialization. It's now available as a field on `NgCompiler`. This will allow a consumer to skip gathering diagnostics for `ignoreFiles` as well as skip emit. PR Close #34792 --- .../src/ngtsc/core/src/compiler.ts | 15 ++++++-- .../compiler-cli/src/ngtsc/core/src/host.ts | 24 ++++++++---- packages/compiler-cli/src/ngtsc/program.ts | 37 +++++++++++++++++-- .../src/ngtsc/shims/src/factory_generator.ts | 8 ++-- .../src/ngtsc/shims/src/summary_generator.ts | 6 +-- 5 files changed, 70 insertions(+), 20 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/core/src/compiler.ts b/packages/compiler-cli/src/ngtsc/core/src/compiler.ts index 3d09f22f31..1a292ade54 100644 --- a/packages/compiler-cli/src/ngtsc/core/src/compiler.ts +++ b/packages/compiler-cli/src/ngtsc/core/src/compiler.ts @@ -97,6 +97,8 @@ export class NgCompiler { private resourceManager: HostResourceLoader; private cycleAnalyzer: CycleAnalyzer; readonly incrementalDriver: IncrementalDriver; + readonly ignoreForDiagnostics: Set; + readonly ignoreForEmit: Set; constructor( private host: NgCompilerHost, private options: NgCompilerOptions, @@ -142,6 +144,14 @@ export class NgCompiler { } } setIncrementalDriver(tsProgram, this.incrementalDriver); + + this.ignoreForDiagnostics = new Set([ + this.typeCheckFile, + ...host.factoryFiles.map(fileName => getSourceFileOrError(tsProgram, fileName)), + ...host.summaryFiles.map(fileName => getSourceFileOrError(tsProgram, fileName)), + ]); + + this.ignoreForEmit = new Set([this.typeCheckFile]); } /** @@ -285,7 +295,6 @@ export class NgCompiler { */ prepareEmit(): { transformers: ts.CustomTransformers, - ignoreFiles: Set, } { const compilation = this.ensureAnalyzed(); @@ -321,9 +330,7 @@ export class NgCompiler { } before.push(ivySwitchTransform); - const ignoreFiles = new Set([this.typeCheckFile]); - - return {transformers: {before, afterDeclarations} as ts.CustomTransformers, ignoreFiles}; + return {transformers: {before, afterDeclarations} as ts.CustomTransformers}; } /** diff --git a/packages/compiler-cli/src/ngtsc/core/src/host.ts b/packages/compiler-cli/src/ngtsc/core/src/host.ts index 5cb7a2d855..90c684394c 100644 --- a/packages/compiler-cli/src/ngtsc/core/src/host.ts +++ b/packages/compiler-cli/src/ngtsc/core/src/host.ts @@ -97,17 +97,22 @@ export class NgCompilerHost extends DelegatingCompilerHost implements readonly inputFiles: ReadonlyArray; readonly rootDirs: ReadonlyArray; readonly typeCheckFile: AbsoluteFsPath; + readonly factoryFiles: AbsoluteFsPath[]; + readonly summaryFiles: AbsoluteFsPath[]; constructor( delegate: ExtendedTsCompilerHost, inputFiles: ReadonlyArray, rootDirs: ReadonlyArray, private shims: ShimGenerator[], entryPoint: AbsoluteFsPath|null, typeCheckFile: AbsoluteFsPath, + factoryFiles: AbsoluteFsPath[], summaryFiles: AbsoluteFsPath[], factoryTracker: FactoryTracker|null, diagnostics: ts.Diagnostic[]) { super(delegate); this.factoryTracker = factoryTracker; this.entryPoint = entryPoint; this.typeCheckFile = typeCheckFile; + this.factoryFiles = factoryFiles; + this.summaryFiles = summaryFiles; this.diagnostics = diagnostics; this.inputFiles = inputFiles; this.rootDirs = rootDirs; @@ -136,31 +141,36 @@ export class NgCompilerHost extends DelegatingCompilerHost implements const generators: ShimGenerator[] = []; let summaryGenerator: SummaryGenerator|null = null; + let summaryFiles: AbsoluteFsPath[]; if (shouldGenerateSummaryShims) { // Summary generation. summaryGenerator = SummaryGenerator.forRootFiles(normalizedInputFiles); generators.push(summaryGenerator); + summaryFiles = summaryGenerator.getSummaryFileNames(); + } else { + summaryFiles = []; } let factoryTracker: FactoryTracker|null = null; + let factoryFiles: AbsoluteFsPath[]; if (shouldGenerateFactoryShims) { // Factory generation. const factoryGenerator = FactoryGenerator.forRootFiles(normalizedInputFiles); const factoryFileMap = factoryGenerator.factoryFileMap; - const factoryFileNames = Array.from(factoryFileMap.keys()); - rootFiles.push(...factoryFileNames); + factoryFiles = Array.from(factoryFileMap.keys()); + rootFiles.push(...factoryFiles); generators.push(factoryGenerator); factoryTracker = new FactoryTracker(factoryGenerator); + } else { + factoryFiles = []; } // Done separately to preserve the order of factory files before summary files in rootFiles. // TODO(alxhub): validate that this is necessary. - if (summaryGenerator !== null) { - rootFiles.push(...summaryGenerator.getSummaryFileNames()); - } + rootFiles.push(...summaryFiles); const rootDirs = getRootDirs(delegate, options as ts.CompilerOptions); @@ -203,8 +213,8 @@ export class NgCompilerHost extends DelegatingCompilerHost implements } return new NgCompilerHost( - delegate, rootFiles, rootDirs, generators, entryPoint, typeCheckFile, factoryTracker, - diagnostics); + delegate, rootFiles, rootDirs, generators, entryPoint, typeCheckFile, factoryFiles, + summaryFiles, factoryTracker, diagnostics); } getSourceFile( diff --git a/packages/compiler-cli/src/ngtsc/program.ts b/packages/compiler-cli/src/ngtsc/program.ts index 6a3e22925d..4ed3fb4a85 100644 --- a/packages/compiler-cli/src/ngtsc/program.ts +++ b/packages/compiler-cli/src/ngtsc/program.ts @@ -88,13 +88,43 @@ export class NgtscProgram implements api.Program { getTsSyntacticDiagnostics( sourceFile?: ts.SourceFile|undefined, cancellationToken?: ts.CancellationToken|undefined): readonly ts.Diagnostic[] { - return this.tsProgram.getSyntacticDiagnostics(sourceFile, cancellationToken); + const ignoredFiles = this.compiler.ignoreForDiagnostics; + if (sourceFile !== undefined) { + if (ignoredFiles.has(sourceFile)) { + return []; + } + + return this.tsProgram.getSyntacticDiagnostics(sourceFile, cancellationToken); + } else { + const diagnostics: ts.Diagnostic[] = []; + for (const sf of this.tsProgram.getSourceFiles()) { + if (!ignoredFiles.has(sf)) { + diagnostics.push(...this.tsProgram.getSyntacticDiagnostics(sf, cancellationToken)); + } + } + return diagnostics; + } } getTsSemanticDiagnostics( sourceFile?: ts.SourceFile|undefined, cancellationToken?: ts.CancellationToken|undefined): readonly ts.Diagnostic[] { - return this.tsProgram.getSemanticDiagnostics(sourceFile, cancellationToken); + const ignoredFiles = this.compiler.ignoreForDiagnostics; + if (sourceFile !== undefined) { + if (ignoredFiles.has(sourceFile)) { + return []; + } + + return this.tsProgram.getSemanticDiagnostics(sourceFile, cancellationToken); + } else { + const diagnostics: ts.Diagnostic[] = []; + for (const sf of this.tsProgram.getSourceFiles()) { + if (!ignoredFiles.has(sf)) { + diagnostics.push(...this.tsProgram.getSemanticDiagnostics(sf, cancellationToken)); + } + } + return diagnostics; + } } getNgOptionDiagnostics(cancellationToken?: ts.CancellationToken| @@ -144,7 +174,8 @@ export class NgtscProgram implements api.Program { emitCallback?: api.TsEmitCallback | undefined; mergeEmitResultsCallback?: api.TsMergeEmitResultsCallback | undefined; }|undefined): ts.EmitResult { - const {transformers, ignoreFiles} = this.compiler.prepareEmit(); + const {transformers} = this.compiler.prepareEmit(); + const ignoreFiles = this.compiler.ignoreForEmit; const emitCallback = opts && opts.emitCallback || defaultEmitCallback; const writeFile: ts.WriteFileCallback = diff --git a/packages/compiler-cli/src/ngtsc/shims/src/factory_generator.ts b/packages/compiler-cli/src/ngtsc/shims/src/factory_generator.ts index dcbf28a975..9b76806f24 100644 --- a/packages/compiler-cli/src/ngtsc/shims/src/factory_generator.ts +++ b/packages/compiler-cli/src/ngtsc/shims/src/factory_generator.ts @@ -22,9 +22,11 @@ const STRIP_NG_FACTORY = /(.*)NgFactory$/; * class of an input ts.SourceFile. */ export class FactoryGenerator implements ShimGenerator { - private constructor(private map: Map) {} + private constructor(private map: Map) {} - get factoryFileMap(): Map { return this.map; } + get factoryFileMap(): Map { return this.map; } + + get factoryFileNames(): AbsoluteFsPath[] { return Array.from(this.map.keys()); } recognize(fileName: AbsoluteFsPath): boolean { return this.map.has(fileName); } @@ -101,7 +103,7 @@ export class FactoryGenerator implements ShimGenerator { } static forRootFiles(files: ReadonlyArray): FactoryGenerator { - const map = new Map(); + const map = new Map(); files.filter(sourceFile => isNonDeclarationTsPath(sourceFile)) .forEach( sourceFile => diff --git a/packages/compiler-cli/src/ngtsc/shims/src/summary_generator.ts b/packages/compiler-cli/src/ngtsc/shims/src/summary_generator.ts index 4fde6790c4..144b87eb4a 100644 --- a/packages/compiler-cli/src/ngtsc/shims/src/summary_generator.ts +++ b/packages/compiler-cli/src/ngtsc/shims/src/summary_generator.ts @@ -15,9 +15,9 @@ import {ShimGenerator} from './api'; import {generatedModuleName} from './util'; export class SummaryGenerator implements ShimGenerator { - private constructor(private map: Map) {} + private constructor(private map: Map) {} - getSummaryFileNames(): string[] { return Array.from(this.map.keys()); } + getSummaryFileNames(): AbsoluteFsPath[] { return Array.from(this.map.keys()); } recognize(fileName: AbsoluteFsPath): boolean { return this.map.has(fileName); } @@ -78,7 +78,7 @@ export class SummaryGenerator implements ShimGenerator { } static forRootFiles(files: ReadonlyArray): SummaryGenerator { - const map = new Map(); + const map = new Map(); files.filter(sourceFile => isNonDeclarationTsPath(sourceFile)) .forEach( sourceFile =>