fix(ivy): resolve forwardRefs correctly in TestBed (JIT) (#27737)

Forward refs in some places (like imports/export/providers/viewProviders/queries) were not resolved before passing to compilation phase. Now we resolve missing refs before invoking compile function.

PR Close #27737
This commit is contained in:
Andrew Kushnir
2018-12-18 13:36:19 -08:00
committed by Ben Lesh
parent 1dc95c41eb
commit a9790018df
4 changed files with 21 additions and 20 deletions

View File

@ -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<any>, 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 {

View File

@ -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<any>[] = [
...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);