feat(ivy): implement listLazyRoutes() for ngtsc (#27697)
This commit uses the NgModuleRouteAnalyzer introduced previously to implement listLazyRoutes() for NgtscProgram. Currently this implementation is limited to listing routes globally and cannot list routes for a given lazy module. Testing seems to indicate that the CLI uses the global form, but this should be verified. Jira issue: FW-629 PR Close #27697
This commit is contained in:
@ -14,6 +14,7 @@ ts_library(
|
||||
"//packages/compiler-cli/src/ngtsc/imports",
|
||||
"//packages/compiler-cli/src/ngtsc/partial_evaluator",
|
||||
"//packages/compiler-cli/src/ngtsc/reflection",
|
||||
"//packages/compiler-cli/src/ngtsc/routing",
|
||||
"//packages/compiler-cli/src/ngtsc/transform",
|
||||
"//packages/compiler-cli/src/ngtsc/typecheck",
|
||||
"@ngdeps//@types/node",
|
||||
|
@ -13,6 +13,7 @@ import {ErrorCode, FatalDiagnosticError} from '../../diagnostics';
|
||||
import {Reference, ResolvedReference} from '../../imports';
|
||||
import {PartialEvaluator, ResolvedValue} from '../../partial_evaluator';
|
||||
import {Decorator, ReflectionHost, reflectObjectLiteral, typeNodeToValueExpr} from '../../reflection';
|
||||
import {NgModuleRouteAnalyzer} from '../../routing';
|
||||
import {AnalysisOutput, CompileResult, DecoratorHandler} from '../../transform';
|
||||
|
||||
import {generateSetClassMetadataCall} from './metadata';
|
||||
@ -35,7 +36,7 @@ export class NgModuleDecoratorHandler implements DecoratorHandler<NgModuleAnalys
|
||||
constructor(
|
||||
private reflector: ReflectionHost, private evaluator: PartialEvaluator,
|
||||
private scopeRegistry: SelectorScopeRegistry, private referencesRegistry: ReferencesRegistry,
|
||||
private isCore: boolean) {}
|
||||
private isCore: boolean, private routeAnalyzer: NgModuleRouteAnalyzer|null) {}
|
||||
|
||||
detect(node: ts.Declaration, decorators: Decorator[]|null): Decorator|undefined {
|
||||
if (!decorators) {
|
||||
@ -77,18 +78,20 @@ export class NgModuleDecoratorHandler implements DecoratorHandler<NgModuleAnalys
|
||||
declarations = this.resolveTypeList(expr, declarationMeta, 'declarations');
|
||||
}
|
||||
let imports: Reference<ts.Declaration>[] = [];
|
||||
let rawImports: ts.Expression|null = null;
|
||||
if (ngModule.has('imports')) {
|
||||
const expr = ngModule.get('imports') !;
|
||||
rawImports = ngModule.get('imports') !;
|
||||
const importsMeta = this.evaluator.evaluate(
|
||||
expr, ref => this._extractModuleFromModuleWithProvidersFn(ref.node));
|
||||
imports = this.resolveTypeList(expr, importsMeta, 'imports');
|
||||
rawImports, ref => this._extractModuleFromModuleWithProvidersFn(ref.node));
|
||||
imports = this.resolveTypeList(rawImports, importsMeta, 'imports');
|
||||
}
|
||||
let exports: Reference<ts.Declaration>[] = [];
|
||||
let rawExports: ts.Expression|null = null;
|
||||
if (ngModule.has('exports')) {
|
||||
const expr = ngModule.get('exports') !;
|
||||
rawExports = ngModule.get('exports') !;
|
||||
const exportsMeta = this.evaluator.evaluate(
|
||||
expr, ref => this._extractModuleFromModuleWithProvidersFn(ref.node));
|
||||
exports = this.resolveTypeList(expr, exportsMeta, 'exports');
|
||||
rawExports, ref => this._extractModuleFromModuleWithProvidersFn(ref.node));
|
||||
exports = this.resolveTypeList(rawExports, exportsMeta, 'exports');
|
||||
this.referencesRegistry.add(node, ...exports);
|
||||
}
|
||||
let bootstrap: Reference<ts.Declaration>[] = [];
|
||||
@ -123,6 +126,7 @@ export class NgModuleDecoratorHandler implements DecoratorHandler<NgModuleAnalys
|
||||
const providers: Expression = ngModule.has('providers') ?
|
||||
new WrappedNodeExpr(ngModule.get('providers') !) :
|
||||
new LiteralArrayExpr([]);
|
||||
const rawProviders = ngModule.has('providers') ? ngModule.get('providers') ! : null;
|
||||
|
||||
const injectorImports: WrappedNodeExpr<ts.Expression>[] = [];
|
||||
if (ngModule.has('imports')) {
|
||||
@ -132,6 +136,11 @@ export class NgModuleDecoratorHandler implements DecoratorHandler<NgModuleAnalys
|
||||
injectorImports.push(new WrappedNodeExpr(ngModule.get('exports') !));
|
||||
}
|
||||
|
||||
if (this.routeAnalyzer !== null) {
|
||||
this.routeAnalyzer.add(
|
||||
node.getSourceFile(), node.name !.text, rawImports, rawExports, rawProviders);
|
||||
}
|
||||
|
||||
const ngInjectorDef: R3InjectorMetadata = {
|
||||
name: node.name !.text,
|
||||
type: new WrappedNodeExpr(node.name !),
|
||||
|
Reference in New Issue
Block a user