diff --git a/packages/core/src/render3/jit/directive.ts b/packages/core/src/render3/jit/directive.ts index 89e2696718..11c28ecfc2 100644 --- a/packages/core/src/render3/jit/directive.ts +++ b/packages/core/src/render3/jit/directive.ts @@ -7,6 +7,7 @@ */ import {ComponentType} from '..'; +import {resolveForwardRef} from '../../di/forward_ref'; import {Query} from '../../metadata/di'; import {Component, Directive} from '../../metadata/directives'; import {componentNeedsResolution, maybeQueueResolutionOfComponentResources} from '../../metadata/resource_loading'; @@ -155,7 +156,7 @@ function directiveMetadata(type: Type, metadata: Directive): R3DirectiveMet } function convertToR3QueryPredicate(selector: any): any|string[] { - return typeof selector === 'string' ? splitByComma(selector) : selector; + return typeof selector === 'string' ? splitByComma(selector) : resolveForwardRef(selector); } export function convertToR3QueryMetadata(propertyName: string, ann: Query): R3QueryMetadataFacade { diff --git a/packages/core/src/render3/jit/module.ts b/packages/core/src/render3/jit/module.ts index dd87c0f867..cab7946fd2 100644 --- a/packages/core/src/render3/jit/module.ts +++ b/packages/core/src/render3/jit/module.ts @@ -107,10 +107,12 @@ export function compileNgModuleDefs(moduleType: NgModuleType, ngModule: NgModule ngModuleDef = getCompilerFacade().compileNgModule( angularCoreEnv, `ng://${moduleType.name}/ngModuleDef.js`, { type: moduleType, - bootstrap: flatten(ngModule.bootstrap || EMPTY_ARRAY), - declarations: declarations, - imports: flatten(ngModule.imports || EMPTY_ARRAY).map(expandModuleWithProviders), - exports: flatten(ngModule.exports || EMPTY_ARRAY).map(expandModuleWithProviders), + bootstrap: flatten(ngModule.bootstrap || EMPTY_ARRAY, resolveForwardRef), + declarations: declarations.map(resolveForwardRef), + imports: flatten(ngModule.imports || EMPTY_ARRAY, resolveForwardRef) + .map(expandModuleWithProviders), + exports: flatten(ngModule.exports || EMPTY_ARRAY, resolveForwardRef) + .map(expandModuleWithProviders), emitInline: true, }); } @@ -132,8 +134,8 @@ export function compileNgModuleDefs(moduleType: NgModuleType, ngModule: NgModule deps: reflectDependencies(moduleType), providers: ngModule.providers || EMPTY_ARRAY, imports: [ - ngModule.imports || EMPTY_ARRAY, - ngModule.exports || EMPTY_ARRAY, + (ngModule.imports || EMPTY_ARRAY).map(resolveForwardRef), + (ngModule.exports || EMPTY_ARRAY).map(resolveForwardRef), ], }; ngInjectorDef = getCompilerFacade().compileInjector( @@ -154,8 +156,8 @@ function verifySemanticsOfNgModuleDef(moduleType: NgModuleType): void { const errors: string[] = []; ngModuleDef.declarations.forEach(verifyDeclarationsHaveDefinitions); const combinedDeclarations: Type[] = [ - ...ngModuleDef.declarations, // - ...flatten(ngModuleDef.imports.map(computeCombinedExports)), + ...ngModuleDef.declarations.map(resolveForwardRef), // + ...flatten(ngModuleDef.imports.map(computeCombinedExports), resolveForwardRef), ]; ngModuleDef.exports.forEach(verifyExportsAreDeclaredOrReExported); ngModuleDef.declarations.forEach(verifyDeclarationIsUnique); diff --git a/packages/core/test/forward_ref_integration_spec.ts b/packages/core/test/forward_ref_integration_spec.ts index 1389642298..e8ae122a84 100644 --- a/packages/core/test/forward_ref_integration_spec.ts +++ b/packages/core/test/forward_ref_integration_spec.ts @@ -10,19 +10,16 @@ import {CommonModule} from '@angular/common'; import {Component, ContentChildren, Directive, Inject, NO_ERRORS_SCHEMA, NgModule, QueryList, asNativeElements, forwardRef} from '@angular/core'; import {TestBed} from '@angular/core/testing'; import {expect} from '@angular/platform-browser/testing/src/matchers'; -import {fixmeIvy} from '@angular/private/testing'; describe('forwardRef integration', function() { beforeEach(() => { TestBed.configureTestingModule({imports: [Module], declarations: [App]}); }); - fixmeIvy('FW-756: Pipes and directives from imported modules are not taken into account') - .it('should instantiate components which are declared using forwardRef', () => { - const a = - TestBed.configureTestingModule({schemas: [NO_ERRORS_SCHEMA]}).createComponent(App); - a.detectChanges(); - expect(asNativeElements(a.debugElement.children)).toHaveText('frame(lock)'); - expect(TestBed.get(ModuleFrame)).toBeDefined(); - }); + it('should instantiate components which are declared using forwardRef', () => { + const a = TestBed.configureTestingModule({schemas: [NO_ERRORS_SCHEMA]}).createComponent(App); + a.detectChanges(); + expect(asNativeElements(a.debugElement.children)).toHaveText('frame(lock)'); + expect(TestBed.get(ModuleFrame)).toBeDefined(); + }); }); @NgModule({ diff --git a/packages/core/testing/src/r3_test_bed.ts b/packages/core/testing/src/r3_test_bed.ts index 115609747e..309d27a1d7 100644 --- a/packages/core/testing/src/r3_test_bed.ts +++ b/packages/core/testing/src/r3_test_bed.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {ApplicationInitStatus, Component, Directive, Injector, NgModule, NgZone, Pipe, PlatformRef, Provider, SchemaMetadata, Type, ɵInjectableDef as InjectableDef, ɵNgModuleDef as NgModuleDef, ɵNgModuleTransitiveScopes as NgModuleTransitiveScopes, ɵNgModuleType as NgModuleType, ɵRender3ComponentFactory as ComponentFactory, ɵRender3NgModuleRef as NgModuleRef, ɵcompileComponent as compileComponent, ɵcompileDirective as compileDirective, ɵcompileNgModuleDefs as compileNgModuleDefs, ɵcompilePipe as compilePipe, ɵgetInjectableDef as getInjectableDef, ɵpatchComponentDefWithScope as patchComponentDefWithScope, ɵresetCompiledComponents as resetCompiledComponents, ɵstringify as stringify} from '@angular/core'; +import {ApplicationInitStatus, Component, Directive, Injector, NgModule, NgZone, Pipe, PlatformRef, Provider, SchemaMetadata, Type, resolveForwardRef, ɵInjectableDef as InjectableDef, ɵNgModuleDef as NgModuleDef, ɵNgModuleTransitiveScopes as NgModuleTransitiveScopes, ɵNgModuleType as NgModuleType, ɵRender3ComponentFactory as ComponentFactory, ɵRender3NgModuleRef as NgModuleRef, ɵcompileComponent as compileComponent, ɵcompileDirective as compileDirective, ɵcompileNgModuleDefs as compileNgModuleDefs, ɵcompilePipe as compilePipe, ɵgetInjectableDef as getInjectableDef, ɵpatchComponentDefWithScope as patchComponentDefWithScope, ɵresetCompiledComponents as resetCompiledComponents, ɵstringify as stringify} from '@angular/core'; import {ComponentFixture} from './component_fixture'; import {MetadataOverride} from './metadata_override'; @@ -493,7 +493,8 @@ export class TestBedRender3 implements Injector, TestBed { const metadata = this._getMetaWithOverrides(ngModule); compileNgModuleDefs(moduleType, metadata); - const declarations: Type[] = flatten(ngModule.declarations || EMPTY_ARRAY); + const declarations: Type[] = + flatten(ngModule.declarations || EMPTY_ARRAY, resolveForwardRef); const compiledComponents: Type[] = []; // Compile the components, directives and pipes declared by this module