From 3fd8948b4a04dc504be3d4dd751a5554673423bb Mon Sep 17 00:00:00 2001 From: Paul Draper Date: Sat, 23 Apr 2022 22:21:39 -0600 Subject: [PATCH] fix(core): Resolve forwardRef declarations for jit (#46334) Fix forwardRef() usage for declarations for jit. Resolves #45741. PR Close #46334 --- packages/core/src/render3/jit/module.ts | 1 + packages/core/test/render3/ivy/jit_spec.ts | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/core/src/render3/jit/module.ts b/packages/core/src/render3/jit/module.ts index ac350122e61..eda127ef5c6 100644 --- a/packages/core/src/render3/jit/module.ts +++ b/packages/core/src/render3/jit/module.ts @@ -466,6 +466,7 @@ function setScopeOnDeclaredComponents(moduleType: Type, ngModule: NgModule) const transitiveScopes = transitiveScopesFor(moduleType); declarations.forEach(declaration => { + declaration = resolveForwardRef(declaration); if (declaration.hasOwnProperty(NG_COMP_DEF)) { // A `ɵcmp` field exists - go ahead and patch the component directly. const component = declaration as Type& {ɵcmp: ComponentDef}; diff --git a/packages/core/test/render3/ivy/jit_spec.ts b/packages/core/test/render3/ivy/jit_spec.ts index 74eb1a6aeeb..097daf078fb 100644 --- a/packages/core/test/render3/ivy/jit_spec.ts +++ b/packages/core/test/render3/ivy/jit_spec.ts @@ -7,7 +7,7 @@ */ import 'reflect-metadata'; -import {Component, ContentChild, ContentChildren, Directive, ElementRef, getNgModuleById, HostBinding, HostListener, Input, NgModule, Pipe, QueryList, ViewChild, ViewChildren, ɵNgModuleDef as NgModuleDef, ɵɵngDeclareComponent as ngDeclareComponent} from '@angular/core'; +import {Component, ContentChild, ContentChildren, Directive, ElementRef, forwardRef, getNgModuleById, HostBinding, HostListener, Input, NgModule, Pipe, QueryList, ViewChild, ViewChildren, ɵNgModuleDef as NgModuleDef, ɵɵngDeclareComponent as ngDeclareComponent} from '@angular/core'; import {Injectable} from '@angular/core/src/di/injectable'; import {setCurrentInjector, ɵɵinject} from '@angular/core/src/di/injector_compatibility'; import {ɵɵdefineInjectable, ɵɵInjectorDef} from '@angular/core/src/di/interface/defs'; @@ -226,6 +226,25 @@ describe('render3 jit', () => { expect(moduleDef.declarations[0]).toBe(Cmp); }); + it('compiles a module with forwardRef', () => { + @NgModule({ + declarations: [forwardRef(() => Cmp)], + }) + class Module { + } + + @Component({ + template: 'foo', + selector: 'foo', + }) + class Cmp { + } + + const componentDef: ComponentDef = (Cmp as any).ɵcmp; + expect(componentDef).toBeDefined(); + expect(componentDef.schemas).toBeInstanceOf(Array); + }); + it('compiles a module with an id and registers it correctly', () => { @NgModule({ id: 'test',