feat(ivy): track compilation scope dependencies for components (#30238)
To support skipping analysis of a file containing a component we need to know that none of the declarations that might affect its ngtsc compilation have not changed. The files that we need to check are those that contain classes from the `CompilationScope` of the component. These classes are already tracked in the `LocalModuleScopeRegistry`. This commit modifies the `IvyCompilation` class to record the files that are in each declared class's `CompilationScope` via a new method, `recordNgModuleScopeDependencies()`, that is called after all the handlers have been "resolved". Further, if analysis is skipped for a declared class, then we need to recover the analysis from the previous compilation run. To support this, the `IncrementalState` class has been updated to expose the `MetadataReader` and `MetadataRegistry` interfaces. This is included in the `metaRegistry` object to capture these analyses, and also in the `localMetaReader` as a fallback to use if the current compilation analysis was skipped. PR Close #30238
This commit is contained in:

committed by
Alex Rickabaugh

parent
0a0b4c1d8f
commit
411524d341
@ -8,7 +8,10 @@ ts_library(
|
||||
"src/**/*.ts",
|
||||
]),
|
||||
deps = [
|
||||
"//packages/compiler-cli/src/ngtsc/imports",
|
||||
"//packages/compiler-cli/src/ngtsc/metadata",
|
||||
"//packages/compiler-cli/src/ngtsc/partial_evaluator",
|
||||
"//packages/compiler-cli/src/ngtsc/reflection",
|
||||
"@npm//typescript",
|
||||
],
|
||||
)
|
||||
|
@ -7,12 +7,15 @@
|
||||
*/
|
||||
|
||||
import * as ts from 'typescript';
|
||||
import {Reference} from '../../imports';
|
||||
import {DirectiveMeta, MetadataReader, MetadataRegistry, NgModuleMeta, PipeMeta} from '../../metadata';
|
||||
import {DependencyTracker} from '../../partial_evaluator';
|
||||
import {ClassDeclaration} from '../../reflection';
|
||||
|
||||
/**
|
||||
* Accumulates state between compilations.
|
||||
*/
|
||||
export class IncrementalState implements DependencyTracker {
|
||||
export class IncrementalState implements DependencyTracker, MetadataReader, MetadataRegistry {
|
||||
private constructor(
|
||||
private unchangedFiles: Set<ts.SourceFile>,
|
||||
private metadata: Map<ts.SourceFile, FileMetadata>) {}
|
||||
@ -85,6 +88,33 @@ export class IncrementalState implements DependencyTracker {
|
||||
metadata.fileDependencies.add(dep);
|
||||
}
|
||||
|
||||
getNgModuleMetadata(ref: Reference<ClassDeclaration>): NgModuleMeta|null {
|
||||
const metadata = this.metadata.get(ref.node.getSourceFile()) || null;
|
||||
return metadata && metadata.ngModuleMeta.get(ref.node) || null;
|
||||
}
|
||||
registerNgModuleMetadata(meta: NgModuleMeta): void {
|
||||
const metadata = this.ensureMetadata(meta.ref.node.getSourceFile());
|
||||
metadata.ngModuleMeta.set(meta.ref.node, meta);
|
||||
}
|
||||
|
||||
getDirectiveMetadata(ref: Reference<ClassDeclaration>): DirectiveMeta|null {
|
||||
const metadata = this.metadata.get(ref.node.getSourceFile()) || null;
|
||||
return metadata && metadata.directiveMeta.get(ref.node) || null;
|
||||
}
|
||||
registerDirectiveMetadata(meta: DirectiveMeta): void {
|
||||
const metadata = this.ensureMetadata(meta.ref.node.getSourceFile());
|
||||
metadata.directiveMeta.set(meta.ref.node, meta);
|
||||
}
|
||||
|
||||
getPipeMetadata(ref: Reference<ClassDeclaration>): PipeMeta|null {
|
||||
const metadata = this.metadata.get(ref.node.getSourceFile()) || null;
|
||||
return metadata && metadata.pipeMeta.get(ref.node) || null;
|
||||
}
|
||||
registerPipeMetadata(meta: PipeMeta): void {
|
||||
const metadata = this.ensureMetadata(meta.ref.node.getSourceFile());
|
||||
metadata.pipeMeta.set(meta.ref.node, meta);
|
||||
}
|
||||
|
||||
private ensureMetadata(sf: ts.SourceFile): FileMetadata {
|
||||
const metadata = this.metadata.get(sf) || new FileMetadata();
|
||||
this.metadata.set(sf, metadata);
|
||||
@ -100,4 +130,7 @@ class FileMetadata {
|
||||
safeToSkipEmitIfUnchanged = false;
|
||||
/** A set of source files that this file depends upon. */
|
||||
fileDependencies = new Set<ts.SourceFile>();
|
||||
directiveMeta = new Map<ClassDeclaration, DirectiveMeta>();
|
||||
ngModuleMeta = new Map<ClassDeclaration, NgModuleMeta>();
|
||||
pipeMeta = new Map<ClassDeclaration, PipeMeta>();
|
||||
}
|
||||
|
Reference in New Issue
Block a user