refactor(compiler): make OutputAst
contain the moduleName, not the filePath (#16832).
The goal of this change is to simplify the emitters, as we will soon create a new one to emit TypeScript nodes directly.
This commit is contained in:

committed by
Chuck Jazdzewski

parent
3b28c75d1f
commit
6123b9c0c6
@ -13,8 +13,9 @@ import {Identifiers, createIdentifier, createIdentifierToken, resolveIdentifier}
|
||||
import * as o from '../output/output_ast';
|
||||
import {convertValueToOutputAst} from '../output/value_util';
|
||||
import {ProviderAst, ProviderAstType} from '../template_parser/template_ast';
|
||||
import {OutputContext} from '../util';
|
||||
|
||||
export function providerDef(providerAst: ProviderAst): {
|
||||
export function providerDef(ctx: OutputContext, providerAst: ProviderAst): {
|
||||
providerExpr: o.Expression,
|
||||
flags: NodeFlags,
|
||||
depsExpr: o.Expression,
|
||||
@ -36,16 +37,17 @@ export function providerDef(providerAst: ProviderAst): {
|
||||
}
|
||||
});
|
||||
const {providerExpr, flags: providerFlags, depsExpr} = providerAst.multiProvider ?
|
||||
multiProviderDef(flags, providerAst.providers) :
|
||||
singleProviderDef(flags, providerAst.providerType, providerAst.providers[0]);
|
||||
multiProviderDef(ctx, flags, providerAst.providers) :
|
||||
singleProviderDef(ctx, flags, providerAst.providerType, providerAst.providers[0]);
|
||||
return {
|
||||
providerExpr,
|
||||
flags: providerFlags, depsExpr,
|
||||
tokenExpr: tokenExpr(providerAst.token),
|
||||
tokenExpr: tokenExpr(ctx, providerAst.token),
|
||||
};
|
||||
}
|
||||
|
||||
function multiProviderDef(flags: NodeFlags, providers: CompileProviderMetadata[]):
|
||||
function multiProviderDef(
|
||||
ctx: OutputContext, flags: NodeFlags, providers: CompileProviderMetadata[]):
|
||||
{providerExpr: o.Expression, flags: NodeFlags, depsExpr: o.Expression} {
|
||||
const allDepDefs: o.Expression[] = [];
|
||||
const allParams: o.FnParam[] = [];
|
||||
@ -53,15 +55,15 @@ function multiProviderDef(flags: NodeFlags, providers: CompileProviderMetadata[]
|
||||
let expr: o.Expression;
|
||||
if (provider.useClass) {
|
||||
const depExprs = convertDeps(providerIndex, provider.deps || provider.useClass.diDeps);
|
||||
expr = o.importExpr(provider.useClass).instantiate(depExprs);
|
||||
expr = ctx.importExpr(provider.useClass.reference).instantiate(depExprs);
|
||||
} else if (provider.useFactory) {
|
||||
const depExprs = convertDeps(providerIndex, provider.deps || provider.useFactory.diDeps);
|
||||
expr = o.importExpr(provider.useFactory).callFn(depExprs);
|
||||
expr = ctx.importExpr(provider.useFactory.reference).callFn(depExprs);
|
||||
} else if (provider.useExisting) {
|
||||
const depExprs = convertDeps(providerIndex, [{token: provider.useExisting}]);
|
||||
expr = depExprs[0];
|
||||
} else {
|
||||
expr = convertValueToOutputAst(provider.useValue);
|
||||
expr = convertValueToOutputAst(ctx, provider.useValue);
|
||||
}
|
||||
return expr;
|
||||
});
|
||||
@ -77,28 +79,29 @@ function multiProviderDef(flags: NodeFlags, providers: CompileProviderMetadata[]
|
||||
return deps.map((dep, depIndex) => {
|
||||
const paramName = `p${providerIndex}_${depIndex}`;
|
||||
allParams.push(new o.FnParam(paramName, o.DYNAMIC_TYPE));
|
||||
allDepDefs.push(depDef(dep));
|
||||
allDepDefs.push(depDef(ctx, dep));
|
||||
return o.variable(paramName);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function singleProviderDef(
|
||||
flags: NodeFlags, providerType: ProviderAstType, providerMeta: CompileProviderMetadata):
|
||||
ctx: OutputContext, flags: NodeFlags, providerType: ProviderAstType,
|
||||
providerMeta: CompileProviderMetadata):
|
||||
{providerExpr: o.Expression, flags: NodeFlags, depsExpr: o.Expression} {
|
||||
let providerExpr: o.Expression;
|
||||
let deps: CompileDiDependencyMetadata[];
|
||||
if (providerType === ProviderAstType.Directive || providerType === ProviderAstType.Component) {
|
||||
providerExpr = o.importExpr(providerMeta.useClass !);
|
||||
providerExpr = ctx.importExpr(providerMeta.useClass !.reference);
|
||||
flags |= NodeFlags.TypeDirective;
|
||||
deps = providerMeta.deps || providerMeta.useClass !.diDeps;
|
||||
} else {
|
||||
if (providerMeta.useClass) {
|
||||
providerExpr = o.importExpr(providerMeta.useClass);
|
||||
providerExpr = ctx.importExpr(providerMeta.useClass.reference);
|
||||
flags |= NodeFlags.TypeClassProvider;
|
||||
deps = providerMeta.deps || providerMeta.useClass.diDeps;
|
||||
} else if (providerMeta.useFactory) {
|
||||
providerExpr = o.importExpr(providerMeta.useFactory);
|
||||
providerExpr = ctx.importExpr(providerMeta.useFactory.reference);
|
||||
flags |= NodeFlags.TypeFactoryProvider;
|
||||
deps = providerMeta.deps || providerMeta.useFactory.diDeps;
|
||||
} else if (providerMeta.useExisting) {
|
||||
@ -106,23 +109,24 @@ function singleProviderDef(
|
||||
flags |= NodeFlags.TypeUseExistingProvider;
|
||||
deps = [{token: providerMeta.useExisting}];
|
||||
} else {
|
||||
providerExpr = convertValueToOutputAst(providerMeta.useValue);
|
||||
providerExpr = convertValueToOutputAst(ctx, providerMeta.useValue);
|
||||
flags |= NodeFlags.TypeValueProvider;
|
||||
deps = [];
|
||||
}
|
||||
}
|
||||
const depsExpr = o.literalArr(deps.map(dep => depDef(dep)));
|
||||
const depsExpr = o.literalArr(deps.map(dep => depDef(ctx, dep)));
|
||||
return {providerExpr, flags, depsExpr};
|
||||
}
|
||||
|
||||
function tokenExpr(tokenMeta: CompileTokenMetadata): o.Expression {
|
||||
return tokenMeta.identifier ? o.importExpr(tokenMeta.identifier) : o.literal(tokenMeta.value);
|
||||
function tokenExpr(ctx: OutputContext, tokenMeta: CompileTokenMetadata): o.Expression {
|
||||
return tokenMeta.identifier ? ctx.importExpr(tokenMeta.identifier.reference) :
|
||||
o.literal(tokenMeta.value);
|
||||
}
|
||||
|
||||
export function depDef(dep: CompileDiDependencyMetadata): o.Expression {
|
||||
export function depDef(ctx: OutputContext, dep: CompileDiDependencyMetadata): o.Expression {
|
||||
// Note: the following fields have already been normalized out by provider_analyzer:
|
||||
// - isAttribute, isSelf, isHost
|
||||
const expr = dep.isValue ? convertValueToOutputAst(dep.value) : tokenExpr(dep.token !);
|
||||
const expr = dep.isValue ? convertValueToOutputAst(ctx, dep.value) : tokenExpr(ctx, dep.token !);
|
||||
let flags = DepFlags.None;
|
||||
if (dep.isSkipSelf) {
|
||||
flags |= DepFlags.SkipSelf;
|
||||
@ -168,14 +172,14 @@ export function lifecycleHookToNodeFlag(lifecycleHook: LifecycleHooks): NodeFlag
|
||||
}
|
||||
|
||||
export function componentFactoryResolverProviderDef(
|
||||
flags: NodeFlags, entryComponents: CompileEntryComponentMetadata[]): {
|
||||
ctx: OutputContext, flags: NodeFlags, entryComponents: CompileEntryComponentMetadata[]): {
|
||||
providerExpr: o.Expression,
|
||||
flags: NodeFlags,
|
||||
depsExpr: o.Expression,
|
||||
tokenExpr: o.Expression
|
||||
} {
|
||||
const entryComponentFactories = entryComponents.map(
|
||||
(entryComponent) => o.importExpr({reference: entryComponent.componentFactory}));
|
||||
const entryComponentFactories =
|
||||
entryComponents.map((entryComponent) => ctx.importExpr(entryComponent.componentFactory));
|
||||
const token = createIdentifierToken(Identifiers.ComponentFactoryResolver);
|
||||
const classMeta = {
|
||||
diDeps: [
|
||||
@ -187,10 +191,10 @@ export function componentFactoryResolverProviderDef(
|
||||
reference: resolveIdentifier(Identifiers.CodegenComponentFactoryResolver)
|
||||
};
|
||||
const {providerExpr, flags: providerFlags, depsExpr} =
|
||||
singleProviderDef(flags, ProviderAstType.PrivateService, {
|
||||
singleProviderDef(ctx, flags, ProviderAstType.PrivateService, {
|
||||
token,
|
||||
multi: false,
|
||||
useClass: classMeta,
|
||||
});
|
||||
return {providerExpr, flags: providerFlags, depsExpr, tokenExpr: tokenExpr(token)};
|
||||
return {providerExpr, flags: providerFlags, depsExpr, tokenExpr: tokenExpr(ctx, token)};
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ import {convertValueToOutputAst} from '../output/value_util';
|
||||
import {ParseSourceSpan} from '../parse_util';
|
||||
import {ElementSchemaRegistry} from '../schema/element_schema_registry';
|
||||
import {AttrAst, BoundDirectivePropertyAst, BoundElementPropertyAst, BoundEventAst, BoundTextAst, DirectiveAst, ElementAst, EmbeddedTemplateAst, NgContentAst, PropertyBindingType, ProviderAst, ProviderAstType, QueryMatch, ReferenceAst, TemplateAst, TemplateAstVisitor, TextAst, VariableAst, templateVisitAll} from '../template_parser/template_ast';
|
||||
import {OutputContext} from '../util';
|
||||
|
||||
import {componentFactoryResolverProviderDef, depDef, lifecycleHookToNodeFlag, providerDef} from './provider_compiler';
|
||||
|
||||
@ -29,9 +30,7 @@ const IMPLICIT_TEMPLATE_VAR = '\$implicit';
|
||||
const NG_CONTAINER_TAG = 'ng-container';
|
||||
|
||||
export class ViewCompileResult {
|
||||
constructor(
|
||||
public statements: o.Statement[], public viewClassVar: string,
|
||||
public rendererTypeVar: string) {}
|
||||
constructor(public viewClassVar: string, public rendererTypeVar: string) {}
|
||||
}
|
||||
|
||||
@CompilerInjectable()
|
||||
@ -40,49 +39,47 @@ export class ViewCompiler {
|
||||
private _genConfigNext: CompilerConfig, private _schemaRegistry: ElementSchemaRegistry) {}
|
||||
|
||||
compileComponent(
|
||||
component: CompileDirectiveMetadata, template: TemplateAst[], styles: o.Expression,
|
||||
usedPipes: CompilePipeSummary[]): ViewCompileResult {
|
||||
outputCtx: OutputContext, component: CompileDirectiveMetadata, template: TemplateAst[],
|
||||
styles: o.Expression, usedPipes: CompilePipeSummary[]): ViewCompileResult {
|
||||
let embeddedViewCount = 0;
|
||||
const staticQueryIds = findStaticQueryIds(template);
|
||||
|
||||
const statements: o.Statement[] = [];
|
||||
|
||||
let renderComponentVarName: string = undefined !;
|
||||
if (!component.isHost) {
|
||||
const template = component.template !;
|
||||
const customRenderData: o.LiteralMapEntry[] = [];
|
||||
if (template.animations && template.animations.length) {
|
||||
customRenderData.push(
|
||||
new o.LiteralMapEntry('animation', convertValueToOutputAst(template.animations), true));
|
||||
customRenderData.push(new o.LiteralMapEntry(
|
||||
'animation', convertValueToOutputAst(outputCtx, template.animations), true));
|
||||
}
|
||||
|
||||
const renderComponentVar = o.variable(rendererTypeName(component.type.reference));
|
||||
renderComponentVarName = renderComponentVar.name !;
|
||||
statements.push(
|
||||
outputCtx.statements.push(
|
||||
renderComponentVar
|
||||
.set(o.importExpr(createIdentifier(Identifiers.createRendererType2))
|
||||
.callFn([new o.LiteralMapExpr([
|
||||
new o.LiteralMapEntry('encapsulation', o.literal(template.encapsulation)),
|
||||
new o.LiteralMapEntry('styles', styles),
|
||||
new o.LiteralMapEntry('data', new o.LiteralMapExpr(customRenderData))
|
||||
])]))
|
||||
.set(o.importExpr(Identifiers.createRendererType2).callFn([new o.LiteralMapExpr([
|
||||
new o.LiteralMapEntry('encapsulation', o.literal(template.encapsulation)),
|
||||
new o.LiteralMapEntry('styles', styles),
|
||||
new o.LiteralMapEntry('data', new o.LiteralMapExpr(customRenderData))
|
||||
])]))
|
||||
.toDeclStmt(
|
||||
o.importType(createIdentifier(Identifiers.RendererType2)),
|
||||
[o.StmtModifier.Final]));
|
||||
o.importType(Identifiers.RendererType2),
|
||||
[o.StmtModifier.Final, o.StmtModifier.Exported]));
|
||||
}
|
||||
|
||||
const viewBuilderFactory = (parent: ViewBuilder | null): ViewBuilder => {
|
||||
const embeddedViewIndex = embeddedViewCount++;
|
||||
return new ViewBuilder(
|
||||
parent, component, embeddedViewIndex, usedPipes, staticQueryIds, viewBuilderFactory);
|
||||
outputCtx, parent, component, embeddedViewIndex, usedPipes, staticQueryIds,
|
||||
viewBuilderFactory);
|
||||
};
|
||||
|
||||
const visitor = viewBuilderFactory(null);
|
||||
visitor.visitAll([], template);
|
||||
|
||||
statements.push(...visitor.build());
|
||||
outputCtx.statements.push(...visitor.build());
|
||||
|
||||
return new ViewCompileResult(statements, visitor.viewName, renderComponentVarName);
|
||||
return new ViewCompileResult(visitor.viewName, renderComponentVarName);
|
||||
}
|
||||
}
|
||||
|
||||
@ -119,15 +116,17 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
private children: ViewBuilder[] = [];
|
||||
|
||||
constructor(
|
||||
private parent: ViewBuilder|null, private component: CompileDirectiveMetadata,
|
||||
private embeddedViewIndex: number, private usedPipes: CompilePipeSummary[],
|
||||
private outputCtx: OutputContext, private parent: ViewBuilder|null,
|
||||
private component: CompileDirectiveMetadata, private embeddedViewIndex: number,
|
||||
private usedPipes: CompilePipeSummary[],
|
||||
private staticQueryIds: Map<TemplateAst, StaticAndDynamicQueryIds>,
|
||||
private viewBuilderFactory: ViewBuilderFactory) {
|
||||
// TODO(tbosch): The old view compiler used to use an `any` type
|
||||
// for the context in any embedded view. We keep this behaivor for now
|
||||
// to be able to introduce the new view compiler without too many errors.
|
||||
this.compType =
|
||||
this.embeddedViewIndex > 0 ? o.DYNAMIC_TYPE : o.importType(this.component.type) !;
|
||||
this.compType = this.embeddedViewIndex > 0 ?
|
||||
o.DYNAMIC_TYPE :
|
||||
o.expressionType(outputCtx.importExpr(this.component.type.reference)) !;
|
||||
}
|
||||
|
||||
get viewName(): string {
|
||||
@ -156,7 +155,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
this.nodes.push(() => ({
|
||||
sourceSpan: null,
|
||||
nodeFlags: flags,
|
||||
nodeDef: o.importExpr(createIdentifier(Identifiers.queryDef)).callFn([
|
||||
nodeDef: o.importExpr(Identifiers.queryDef).callFn([
|
||||
o.literal(flags), o.literal(queryId),
|
||||
new o.LiteralMapExpr(
|
||||
[new o.LiteralMapEntry(query.propertyName, o.literal(bindingType))])
|
||||
@ -170,7 +169,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
this.nodes.push(() => ({
|
||||
sourceSpan: null,
|
||||
nodeFlags: NodeFlags.TypeElement,
|
||||
nodeDef: o.importExpr(createIdentifier(Identifiers.anchorDef)).callFn([
|
||||
nodeDef: o.importExpr(Identifiers.anchorDef).callFn([
|
||||
o.literal(NodeFlags.None), o.NULL_EXPR, o.NULL_EXPR, o.literal(0)
|
||||
])
|
||||
}));
|
||||
@ -193,13 +192,14 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
}
|
||||
const viewFactory = new o.DeclareFunctionStmt(
|
||||
this.viewName, [new o.FnParam(LOG_VAR.name !)],
|
||||
[new o.ReturnStatement(o.importExpr(createIdentifier(Identifiers.viewDef)).callFn([
|
||||
[new o.ReturnStatement(o.importExpr(Identifiers.viewDef).callFn([
|
||||
o.literal(viewFlags),
|
||||
o.literalArr(nodeDefExprs),
|
||||
updateDirectivesFn,
|
||||
updateRendererFn,
|
||||
]))],
|
||||
o.importType(createIdentifier(Identifiers.ViewDefinition)));
|
||||
o.importType(Identifiers.ViewDefinition),
|
||||
this.embeddedViewIndex === 0 ? [o.StmtModifier.Exported] : []);
|
||||
|
||||
targetStatements.push(viewFactory);
|
||||
return targetStatements;
|
||||
@ -229,7 +229,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
this.nodes.push(() => ({
|
||||
sourceSpan: ast.sourceSpan,
|
||||
nodeFlags: NodeFlags.TypeNgContent,
|
||||
nodeDef: o.importExpr(createIdentifier(Identifiers.ngContentDef)).callFn([
|
||||
nodeDef: o.importExpr(Identifiers.ngContentDef).callFn([
|
||||
o.literal(ast.ngContentIndex), o.literal(ast.index)
|
||||
])
|
||||
}));
|
||||
@ -240,7 +240,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
this.nodes.push(() => ({
|
||||
sourceSpan: ast.sourceSpan,
|
||||
nodeFlags: NodeFlags.TypeText,
|
||||
nodeDef: o.importExpr(createIdentifier(Identifiers.textDef)).callFn([
|
||||
nodeDef: o.importExpr(Identifiers.textDef).callFn([
|
||||
o.literal(ast.ngContentIndex), o.literalArr([o.literal(ast.value)])
|
||||
])
|
||||
}));
|
||||
@ -262,7 +262,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
this.nodes[nodeIndex] = () => ({
|
||||
sourceSpan: ast.sourceSpan,
|
||||
nodeFlags: NodeFlags.TypeText,
|
||||
nodeDef: o.importExpr(createIdentifier(Identifiers.textDef)).callFn([
|
||||
nodeDef: o.importExpr(Identifiers.textDef).callFn([
|
||||
o.literal(ast.ngContentIndex), o.literalArr(inter.strings.map(s => o.literal(s)))
|
||||
]),
|
||||
updateRenderer: updateRendererExpressions
|
||||
@ -289,7 +289,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
this.nodes[nodeIndex] = () => ({
|
||||
sourceSpan: ast.sourceSpan,
|
||||
nodeFlags: NodeFlags.TypeElement | flags,
|
||||
nodeDef: o.importExpr(createIdentifier(Identifiers.anchorDef)).callFn([
|
||||
nodeDef: o.importExpr(Identifiers.anchorDef).callFn([
|
||||
o.literal(flags),
|
||||
queryMatchesExpr,
|
||||
o.literal(ast.ngContentIndex),
|
||||
@ -343,11 +343,11 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
const childCount = this.nodes.length - nodeIndex - 1;
|
||||
|
||||
const compAst = ast.directives.find(dirAst => dirAst.directive.isComponent);
|
||||
let compRendererType = o.NULL_EXPR;
|
||||
let compView = o.NULL_EXPR;
|
||||
let compRendererType = o.NULL_EXPR as o.Expression;
|
||||
let compView = o.NULL_EXPR as o.Expression;
|
||||
if (compAst) {
|
||||
compView = o.importExpr({reference: compAst.directive.componentViewType});
|
||||
compRendererType = o.importExpr({reference: compAst.directive.rendererType});
|
||||
compView = this.outputCtx.importExpr(compAst.directive.componentViewType);
|
||||
compRendererType = this.outputCtx.importExpr(compAst.directive.rendererType);
|
||||
}
|
||||
|
||||
// elementDef(
|
||||
@ -361,7 +361,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
this.nodes[nodeIndex] = () => ({
|
||||
sourceSpan: ast.sourceSpan,
|
||||
nodeFlags: NodeFlags.TypeElement | flags,
|
||||
nodeDef: o.importExpr(createIdentifier(Identifiers.elementDef)).callFn([
|
||||
nodeDef: o.importExpr(Identifiers.elementDef).callFn([
|
||||
o.literal(flags),
|
||||
queryMatchesExpr,
|
||||
o.literal(ast.ngContentIndex),
|
||||
@ -492,7 +492,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
this.nodes.push(() => ({
|
||||
sourceSpan: dirAst.sourceSpan,
|
||||
nodeFlags: flags,
|
||||
nodeDef: o.importExpr(createIdentifier(Identifiers.queryDef)).callFn([
|
||||
nodeDef: o.importExpr(Identifiers.queryDef).callFn([
|
||||
o.literal(flags), o.literal(queryId),
|
||||
new o.LiteralMapExpr(
|
||||
[new o.LiteralMapEntry(query.propertyName, o.literal(bindingType))])
|
||||
@ -548,9 +548,8 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
}));
|
||||
}
|
||||
|
||||
const dirContextExpr = o.importExpr(createIdentifier(Identifiers.nodeValue)).callFn([
|
||||
VIEW_VAR, o.literal(nodeIndex)
|
||||
]);
|
||||
const dirContextExpr =
|
||||
o.importExpr(Identifiers.nodeValue).callFn([VIEW_VAR, o.literal(nodeIndex)]);
|
||||
const hostBindings = dirAst.hostProperties.map((inputAst) => ({
|
||||
context: dirContextExpr,
|
||||
dirAst,
|
||||
@ -570,7 +569,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
this.nodes[nodeIndex] = () => ({
|
||||
sourceSpan: dirAst.sourceSpan,
|
||||
nodeFlags: NodeFlags.TypeDirective | flags,
|
||||
nodeDef: o.importExpr(createIdentifier(Identifiers.directiveDef)).callFn([
|
||||
nodeDef: o.importExpr(Identifiers.directiveDef).callFn([
|
||||
o.literal(flags), queryMatchExprs.length ? o.literalArr(queryMatchExprs) : o.NULL_EXPR,
|
||||
o.literal(childCount), providerExpr, depsExpr,
|
||||
inputDefs.length ? new o.LiteralMapExpr(inputDefs) : o.NULL_EXPR,
|
||||
@ -591,7 +590,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
const componentDirMeta = directives.find(dirAst => dirAst.directive.isComponent);
|
||||
if (componentDirMeta && componentDirMeta.directive.entryComponents.length) {
|
||||
const {providerExpr, depsExpr, flags, tokenExpr} = componentFactoryResolverProviderDef(
|
||||
NodeFlags.PrivateProvider, componentDirMeta.directive.entryComponents);
|
||||
this.outputCtx, NodeFlags.PrivateProvider, componentDirMeta.directive.entryComponents);
|
||||
this._addProviderNode({
|
||||
providerExpr,
|
||||
depsExpr,
|
||||
@ -619,7 +618,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
() => ({
|
||||
sourceSpan: data.sourceSpan,
|
||||
nodeFlags: data.flags,
|
||||
nodeDef: o.importExpr(createIdentifier(Identifiers.providerDef)).callFn([
|
||||
nodeDef: o.importExpr(Identifiers.providerDef).callFn([
|
||||
o.literal(data.flags),
|
||||
data.queryMatchExprs.length ? o.literalArr(data.queryMatchExprs) : o.NULL_EXPR,
|
||||
data.tokenExpr, data.providerExpr, data.depsExpr
|
||||
@ -644,7 +643,8 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
o.literalArr([o.literal(match.queryId), o.literal(QueryValueType.Provider)]));
|
||||
}
|
||||
});
|
||||
const {providerExpr, depsExpr, flags: providerFlags, tokenExpr} = providerDef(providerAst);
|
||||
const {providerExpr, depsExpr, flags: providerFlags, tokenExpr} =
|
||||
providerDef(this.outputCtx, providerAst);
|
||||
return {
|
||||
flags: flags | providerFlags,
|
||||
queryMatchExprs,
|
||||
@ -665,9 +665,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
// check references
|
||||
const refNodeIndex = currBuilder.refNodeIndices[name];
|
||||
if (refNodeIndex != null) {
|
||||
return o.importExpr(createIdentifier(Identifiers.nodeValue)).callFn([
|
||||
currViewExpr, o.literal(refNodeIndex)
|
||||
]);
|
||||
return o.importExpr(Identifiers.nodeValue).callFn([currViewExpr, o.literal(refNodeIndex)]);
|
||||
}
|
||||
|
||||
// check variables
|
||||
@ -682,25 +680,23 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
|
||||
createLiteralArrayConverter(sourceSpan: ParseSourceSpan, argCount: number): BuiltinConverter {
|
||||
if (argCount === 0) {
|
||||
const valueExpr = o.importExpr(createIdentifier(Identifiers.EMPTY_ARRAY));
|
||||
const valueExpr = o.importExpr(Identifiers.EMPTY_ARRAY);
|
||||
return () => valueExpr;
|
||||
}
|
||||
|
||||
const nodeIndex = this.nodes.length;
|
||||
// pureArrayDef(argCount: number): NodeDef;
|
||||
this.nodes.push(
|
||||
() => ({
|
||||
sourceSpan,
|
||||
nodeFlags: NodeFlags.TypePureArray,
|
||||
nodeDef:
|
||||
o.importExpr(createIdentifier(Identifiers.pureArrayDef)).callFn([o.literal(argCount)])
|
||||
}));
|
||||
this.nodes.push(() => ({
|
||||
sourceSpan,
|
||||
nodeFlags: NodeFlags.TypePureArray,
|
||||
nodeDef: o.importExpr(Identifiers.pureArrayDef).callFn([o.literal(argCount)])
|
||||
}));
|
||||
|
||||
return (args: o.Expression[]) => callCheckStmt(nodeIndex, args);
|
||||
}
|
||||
createLiteralMapConverter(sourceSpan: ParseSourceSpan, keys: string[]): BuiltinConverter {
|
||||
if (keys.length === 0) {
|
||||
const valueExpr = o.importExpr(createIdentifier(Identifiers.EMPTY_MAP));
|
||||
const valueExpr = o.importExpr(Identifiers.EMPTY_MAP);
|
||||
return () => valueExpr;
|
||||
}
|
||||
|
||||
@ -709,8 +705,8 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
this.nodes.push(() => ({
|
||||
sourceSpan,
|
||||
nodeFlags: NodeFlags.TypePureObject,
|
||||
nodeDef: o.importExpr(createIdentifier(Identifiers.pureObjectDef))
|
||||
.callFn([o.literalArr(keys.map(key => o.literal(key)))])
|
||||
nodeDef: o.importExpr(Identifiers.pureObjectDef).callFn([o.literalArr(
|
||||
keys.map(key => o.literal(key)))])
|
||||
}));
|
||||
|
||||
return (args: o.Expression[]) => callCheckStmt(nodeIndex, args);
|
||||
@ -724,8 +720,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
this.nodes.push(() => ({
|
||||
sourceSpan: expression.sourceSpan,
|
||||
nodeFlags: NodeFlags.TypePurePipe,
|
||||
nodeDef: o.importExpr(createIdentifier(Identifiers.purePipeDef))
|
||||
.callFn([o.literal(argCount)])
|
||||
nodeDef: o.importExpr(Identifiers.purePipeDef).callFn([o.literal(argCount)])
|
||||
}));
|
||||
|
||||
// find underlying pipe in the component view
|
||||
@ -737,18 +732,15 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
}
|
||||
const pipeNodeIndex = compBuilder.purePipeNodeIndices[name];
|
||||
const pipeValueExpr: o.Expression =
|
||||
o.importExpr(createIdentifier(Identifiers.nodeValue)).callFn([
|
||||
compViewExpr, o.literal(pipeNodeIndex)
|
||||
]);
|
||||
o.importExpr(Identifiers.nodeValue).callFn([compViewExpr, o.literal(pipeNodeIndex)]);
|
||||
|
||||
return (args: o.Expression[]) => callUnwrapValue(
|
||||
expression.nodeIndex, expression.bindingIndex,
|
||||
callCheckStmt(nodeIndex, [pipeValueExpr].concat(args)));
|
||||
} else {
|
||||
const nodeIndex = this._createPipe(expression.sourceSpan, pipe);
|
||||
const nodeValueExpr = o.importExpr(createIdentifier(Identifiers.nodeValue)).callFn([
|
||||
VIEW_VAR, o.literal(nodeIndex)
|
||||
]);
|
||||
const nodeValueExpr =
|
||||
o.importExpr(Identifiers.nodeValue).callFn([VIEW_VAR, o.literal(nodeIndex)]);
|
||||
|
||||
return (args: o.Expression[]) => callUnwrapValue(
|
||||
expression.nodeIndex, expression.bindingIndex,
|
||||
@ -766,16 +758,17 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
}
|
||||
});
|
||||
|
||||
const depExprs = pipe.type.diDeps.map(depDef);
|
||||
const depExprs = pipe.type.diDeps.map((diDep) => depDef(this.outputCtx, diDep));
|
||||
// function pipeDef(
|
||||
// flags: NodeFlags, ctor: any, deps: ([DepFlags, any] | any)[]): NodeDef
|
||||
this.nodes.push(() => ({
|
||||
sourceSpan,
|
||||
nodeFlags: NodeFlags.TypePipe,
|
||||
nodeDef: o.importExpr(createIdentifier(Identifiers.pipeDef)).callFn([
|
||||
o.literal(flags), o.importExpr(pipe.type), o.literalArr(depExprs)
|
||||
])
|
||||
}));
|
||||
this.nodes.push(
|
||||
() => ({
|
||||
sourceSpan,
|
||||
nodeFlags: NodeFlags.TypePipe,
|
||||
nodeDef: o.importExpr(Identifiers.pipeDef).callFn([
|
||||
o.literal(flags), this.outputCtx.importExpr(pipe.type.reference), o.literalArr(depExprs)
|
||||
])
|
||||
}));
|
||||
return nodeIndex;
|
||||
}
|
||||
|
||||
@ -984,7 +977,7 @@ function callCheckStmt(nodeIndex: number, exprs: o.Expression[]): o.Expression {
|
||||
}
|
||||
|
||||
function callUnwrapValue(nodeIndex: number, bindingIdx: number, expr: o.Expression): o.Expression {
|
||||
return o.importExpr(createIdentifier(Identifiers.unwrapValue)).callFn([
|
||||
return o.importExpr(Identifiers.unwrapValue).callFn([
|
||||
VIEW_VAR, o.literal(nodeIndex), o.literal(bindingIdx), expr
|
||||
]);
|
||||
}
|
||||
|
Reference in New Issue
Block a user