refactor(compiler): consolidate `R3CompiledExpression` (#41080)
There were a number of almost identical interfaces used in the same way throughout the Render3 compiler code. This commit changes the compiler to use the same interface throughout. PR Close #41080
This commit is contained in:
parent
90301f42a9
commit
8a33842cca
|
@ -6,11 +6,11 @@
|
||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {compileComponentFromMetadata, compileDeclareComponentFromMetadata, ConstantPool, CssSelector, DeclarationListEmitMode, DEFAULT_INTERPOLATION_CONFIG, DomElementSchemaRegistry, Expression, ExternalExpr, Identifiers, InterpolationConfig, LexerRange, makeBindingParser, ParsedTemplate, ParseSourceFile, parseTemplate, R3ComponentDef, R3ComponentMetadata, R3FactoryTarget, R3TargetBinder, R3UsedDirectiveMetadata, SelectorMatcher, Statement, TmplAstNode, WrappedNodeExpr} from '@angular/compiler';
|
import {compileComponentFromMetadata, compileDeclareComponentFromMetadata, ConstantPool, CssSelector, DeclarationListEmitMode, DEFAULT_INTERPOLATION_CONFIG, DomElementSchemaRegistry, Expression, ExternalExpr, Identifiers, InterpolationConfig, LexerRange, makeBindingParser, ParsedTemplate, ParseSourceFile, parseTemplate, R3CompiledExpression, R3ComponentMetadata, R3FactoryTarget, R3TargetBinder, R3UsedDirectiveMetadata, SelectorMatcher, Statement, TmplAstNode, WrappedNodeExpr} from '@angular/compiler';
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
import {Cycle, CycleAnalyzer, CycleHandlingStrategy} from '../../cycles';
|
import {Cycle, CycleAnalyzer, CycleHandlingStrategy} from '../../cycles';
|
||||||
import {ErrorCode, FatalDiagnosticError, makeDiagnostic, makeRelatedInformation} from '../../diagnostics';
|
import {ErrorCode, FatalDiagnosticError, makeRelatedInformation} from '../../diagnostics';
|
||||||
import {absoluteFrom, relative} from '../../file_system';
|
import {absoluteFrom, relative} from '../../file_system';
|
||||||
import {DefaultImportRecorder, ImportedFile, ModuleResolver, Reference, ReferenceEmitter} from '../../imports';
|
import {DefaultImportRecorder, ImportedFile, ModuleResolver, Reference, ReferenceEmitter} from '../../imports';
|
||||||
import {DependencyTracker} from '../../incremental/api';
|
import {DependencyTracker} from '../../incremental/api';
|
||||||
|
@ -848,7 +848,7 @@ export class ComponentDecoratorHandler implements
|
||||||
|
|
||||||
private compileComponent(
|
private compileComponent(
|
||||||
analysis: Readonly<ComponentAnalysisData>,
|
analysis: Readonly<ComponentAnalysisData>,
|
||||||
{expression: initializer, type}: R3ComponentDef): CompileResult[] {
|
{expression: initializer, statements, type}: R3CompiledExpression): CompileResult[] {
|
||||||
const factoryRes = compileNgFactoryDefField({
|
const factoryRes = compileNgFactoryDefField({
|
||||||
...analysis.meta,
|
...analysis.meta,
|
||||||
injectFn: Identifiers.directiveInject,
|
injectFn: Identifiers.directiveInject,
|
||||||
|
@ -861,7 +861,7 @@ export class ComponentDecoratorHandler implements
|
||||||
factoryRes, {
|
factoryRes, {
|
||||||
name: 'ɵcmp',
|
name: 'ɵcmp',
|
||||||
initializer,
|
initializer,
|
||||||
statements: [],
|
statements,
|
||||||
type,
|
type,
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
|
@ -6,12 +6,11 @@
|
||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {compileDeclareDirectiveFromMetadata, compileDirectiveFromMetadata, ConstantPool, Expression, ExternalExpr, getSafePropertyAccessString, Identifiers, makeBindingParser, ParsedHostBindings, ParseError, parseHostBindings, R3DependencyMetadata, R3DirectiveDef, R3DirectiveMetadata, R3FactoryTarget, R3QueryMetadata, R3ResolvedDependencyType, Statement, verifyHostBindings, WrappedNodeExpr} from '@angular/compiler';
|
import {compileDeclareDirectiveFromMetadata, compileDirectiveFromMetadata, ConstantPool, Expression, ExternalExpr, getSafePropertyAccessString, Identifiers, makeBindingParser, ParsedHostBindings, ParseError, parseHostBindings, R3CompiledExpression, R3DependencyMetadata, R3DirectiveMetadata, R3FactoryTarget, R3QueryMetadata, R3ResolvedDependencyType, Statement, verifyHostBindings, WrappedNodeExpr} from '@angular/compiler';
|
||||||
import {emitDistinctChangesOnlyDefaultValue} from '@angular/compiler/src/core';
|
import {emitDistinctChangesOnlyDefaultValue} from '@angular/compiler/src/core';
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
import {ErrorCode, FatalDiagnosticError} from '../../diagnostics';
|
import {ErrorCode, FatalDiagnosticError} from '../../diagnostics';
|
||||||
import {absoluteFromSourceFile} from '../../file_system';
|
|
||||||
import {DefaultImportRecorder, Reference} from '../../imports';
|
import {DefaultImportRecorder, Reference} from '../../imports';
|
||||||
import {areTypeParametersEqual, extractSemanticTypeParameters, isArrayEqual, isSetEqual, isSymbolEqual, SemanticDepGraphUpdater, SemanticSymbol, SemanticTypeParameter} from '../../incremental/semantic_graph';
|
import {areTypeParametersEqual, extractSemanticTypeParameters, isArrayEqual, isSetEqual, isSymbolEqual, SemanticDepGraphUpdater, SemanticSymbol, SemanticTypeParameter} from '../../incremental/semantic_graph';
|
||||||
import {BindingPropertyName, ClassPropertyMapping, ClassPropertyName, DirectiveTypeCheckMeta, InjectableClassRegistry, MetadataReader, MetadataRegistry, TemplateGuardMeta} from '../../metadata';
|
import {BindingPropertyName, ClassPropertyMapping, ClassPropertyName, DirectiveTypeCheckMeta, InjectableClassRegistry, MetadataReader, MetadataRegistry, TemplateGuardMeta} from '../../metadata';
|
||||||
|
@ -313,7 +312,7 @@ export class DirectiveDecoratorHandler implements
|
||||||
|
|
||||||
private compileDirective(
|
private compileDirective(
|
||||||
analysis: Readonly<DirectiveHandlerData>,
|
analysis: Readonly<DirectiveHandlerData>,
|
||||||
{expression: initializer, type}: R3DirectiveDef): CompileResult[] {
|
{expression: initializer, statements, type}: R3CompiledExpression): CompileResult[] {
|
||||||
const factoryRes = compileNgFactoryDefField({
|
const factoryRes = compileNgFactoryDefField({
|
||||||
...analysis.meta,
|
...analysis.meta,
|
||||||
injectFn: Identifiers.directiveInject,
|
injectFn: Identifiers.directiveInject,
|
||||||
|
@ -326,7 +325,7 @@ export class DirectiveDecoratorHandler implements
|
||||||
factoryRes, {
|
factoryRes, {
|
||||||
name: 'ɵdir',
|
name: 'ɵdir',
|
||||||
initializer,
|
initializer,
|
||||||
statements: [],
|
statements,
|
||||||
type,
|
type,
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
|
@ -12,5 +12,5 @@ import {CompileResult} from '../../transform';
|
||||||
|
|
||||||
export function compileNgFactoryDefField(metadata: R3FactoryMetadata): CompileResult {
|
export function compileNgFactoryDefField(metadata: R3FactoryMetadata): CompileResult {
|
||||||
const res = compileFactoryFunction(metadata);
|
const res = compileFactoryFunction(metadata);
|
||||||
return {name: 'ɵfac', initializer: res.factory, statements: res.statements, type: res.type};
|
return {name: 'ɵfac', initializer: res.expression, statements: res.statements, type: res.type};
|
||||||
}
|
}
|
||||||
|
|
|
@ -457,7 +457,7 @@ export class NgModuleDecoratorHandler implements
|
||||||
const ngInjectorDef =
|
const ngInjectorDef =
|
||||||
compileInjector({...inj, imports: [...inj.imports, ...resolution.injectorImports]});
|
compileInjector({...inj, imports: [...inj.imports, ...resolution.injectorImports]});
|
||||||
const ngModuleDef = compileNgModule(mod);
|
const ngModuleDef = compileNgModule(mod);
|
||||||
const ngModuleStatements = ngModuleDef.additionalStatements;
|
const ngModuleStatements = ngModuleDef.statements;
|
||||||
if (metadataStmt !== null) {
|
if (metadataStmt !== null) {
|
||||||
ngModuleStatements.push(metadataStmt);
|
ngModuleStatements.push(metadataStmt);
|
||||||
}
|
}
|
||||||
|
@ -497,7 +497,7 @@ export class NgModuleDecoratorHandler implements
|
||||||
{
|
{
|
||||||
name: 'ɵinj',
|
name: 'ɵinj',
|
||||||
initializer: ngInjectorDef.expression,
|
initializer: ngInjectorDef.expression,
|
||||||
statements: [],
|
statements: ngInjectorDef.statements,
|
||||||
type: ngInjectorDef.type,
|
type: ngInjectorDef.type,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {compileDeclarePipeFromMetadata, compilePipeFromMetadata, Identifiers, R3FactoryTarget, R3PipeDef, R3PipeMetadata, Statement, WrappedNodeExpr} from '@angular/compiler';
|
import {compileDeclarePipeFromMetadata, compilePipeFromMetadata, Identifiers, R3CompiledExpression, R3FactoryTarget, R3PipeMetadata, Statement, WrappedNodeExpr} from '@angular/compiler';
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
import {ErrorCode, FatalDiagnosticError} from '../../diagnostics';
|
import {ErrorCode, FatalDiagnosticError} from '../../diagnostics';
|
||||||
|
@ -170,7 +170,7 @@ export class PipeDecoratorHandler implements
|
||||||
return this.compilePipe(analysis, res);
|
return this.compilePipe(analysis, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
private compilePipe(analysis: Readonly<PipeHandlerData>, def: R3PipeDef) {
|
private compilePipe(analysis: Readonly<PipeHandlerData>, def: R3CompiledExpression) {
|
||||||
const factoryRes = compileNgFactoryDefField({
|
const factoryRes = compileNgFactoryDefField({
|
||||||
...analysis.meta,
|
...analysis.meta,
|
||||||
injectFn: Identifiers.directiveInject,
|
injectFn: Identifiers.directiveInject,
|
||||||
|
@ -183,7 +183,7 @@ export class PipeDecoratorHandler implements
|
||||||
factoryRes, {
|
factoryRes, {
|
||||||
name: 'ɵpipe',
|
name: 'ɵpipe',
|
||||||
initializer: def.expression,
|
initializer: def.expression,
|
||||||
statements: [],
|
statements: def.statements,
|
||||||
type: def.type,
|
type: def.type,
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
|
@ -101,7 +101,7 @@ export {R3DependencyMetadata, R3ResolvedDependencyType, compileFactoryFunction,
|
||||||
export {compileInjector, compileNgModule, R3InjectorMetadata, R3NgModuleMetadata} from './render3/r3_module_compiler';
|
export {compileInjector, compileNgModule, R3InjectorMetadata, R3NgModuleMetadata} from './render3/r3_module_compiler';
|
||||||
export {compilePipeFromMetadata, R3PipeMetadata} from './render3/r3_pipe_compiler';
|
export {compilePipeFromMetadata, R3PipeMetadata} from './render3/r3_pipe_compiler';
|
||||||
export {makeBindingParser, ParsedTemplate, parseTemplate, ParseTemplateOptions} from './render3/view/template';
|
export {makeBindingParser, ParsedTemplate, parseTemplate, ParseTemplateOptions} from './render3/view/template';
|
||||||
export {R3Reference, devOnlyGuardedExpression, getSafePropertyAccessString} from './render3/util';
|
export {R3CompiledExpression, R3Reference, devOnlyGuardedExpression, getSafePropertyAccessString} from './render3/util';
|
||||||
export {compileComponentFromMetadata, compileDirectiveFromMetadata, parseHostBindings, ParsedHostBindings, verifyHostBindings} from './render3/view/compiler';
|
export {compileComponentFromMetadata, compileDirectiveFromMetadata, parseHostBindings, ParsedHostBindings, verifyHostBindings} from './render3/view/compiler';
|
||||||
export {compileDeclareComponentFromMetadata} from './render3/partial/component';
|
export {compileDeclareComponentFromMetadata} from './render3/partial/component';
|
||||||
export {compileDeclareDirectiveFromMetadata} from './render3/partial/directive';
|
export {compileDeclareDirectiveFromMetadata} from './render3/partial/directive';
|
||||||
|
|
|
@ -32,7 +32,7 @@ export interface R3InjectableMetadata {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function compileInjectable(meta: R3InjectableMetadata): InjectableDef {
|
export function compileInjectable(meta: R3InjectableMetadata): InjectableDef {
|
||||||
let result: {factory: o.Expression, statements: o.Statement[]}|null = null;
|
let result: {expression: o.Expression, statements: o.Statement[]}|null = null;
|
||||||
|
|
||||||
const factoryMeta: R3FactoryMetadata = {
|
const factoryMeta: R3FactoryMetadata = {
|
||||||
name: meta.name,
|
name: meta.name,
|
||||||
|
@ -83,7 +83,7 @@ export function compileInjectable(meta: R3InjectableMetadata): InjectableDef {
|
||||||
} else {
|
} else {
|
||||||
result = {
|
result = {
|
||||||
statements: [],
|
statements: [],
|
||||||
factory: o.fn([], [new o.ReturnStatement(meta.useFactory.callFn([]))])
|
expression: o.fn([], [new o.ReturnStatement(meta.useFactory.callFn([]))])
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
} else if (meta.useValue !== undefined) {
|
} else if (meta.useValue !== undefined) {
|
||||||
|
@ -110,7 +110,7 @@ export function compileInjectable(meta: R3InjectableMetadata): InjectableDef {
|
||||||
const injectableProps =
|
const injectableProps =
|
||||||
new DefinitionMap<{token: o.Expression, factory: o.Expression, providedIn: o.Expression}>();
|
new DefinitionMap<{token: o.Expression, factory: o.Expression, providedIn: o.Expression}>();
|
||||||
injectableProps.set('token', token);
|
injectableProps.set('token', token);
|
||||||
injectableProps.set('factory', result.factory);
|
injectableProps.set('factory', result.expression);
|
||||||
|
|
||||||
// Only generate providedIn property if it has a non-null value
|
// Only generate providedIn property if it has a non-null value
|
||||||
if ((meta.providedIn as o.LiteralExpr).value !== null) {
|
if ((meta.providedIn as o.LiteralExpr).value !== null) {
|
||||||
|
@ -135,7 +135,7 @@ function delegateToFactory(type: o.WrappedNodeExpr<any>, internalType: o.Wrapped
|
||||||
// If types are the same, we can generate `factory: type.ɵfac`
|
// If types are the same, we can generate `factory: type.ɵfac`
|
||||||
// If types are different, we have to generate a wrapper function to ensure
|
// If types are different, we have to generate a wrapper function to ensure
|
||||||
// the internal type has been resolved (`factory: function(t) { return type.ɵfac(t); }`)
|
// the internal type has been resolved (`factory: function(t) { return type.ɵfac(t); }`)
|
||||||
factory: type.node === internalType.node ?
|
expression: type.node === internalType.node ?
|
||||||
internalType.prop('ɵfac') :
|
internalType.prop('ɵfac') :
|
||||||
o.fn([new o.FnParam('t', o.DYNAMIC_TYPE)], [new o.ReturnStatement(internalType.callMethod(
|
o.fn([new o.FnParam('t', o.DYNAMIC_TYPE)], [new o.ReturnStatement(internalType.callMethod(
|
||||||
'ɵfac', [o.variable('t')]))])
|
'ɵfac', [o.variable('t')]))])
|
||||||
|
|
|
@ -196,7 +196,7 @@ export class CompilerFacadeImpl implements CompilerFacade {
|
||||||
target: meta.target,
|
target: meta.target,
|
||||||
});
|
});
|
||||||
return this.jitExpression(
|
return this.jitExpression(
|
||||||
factoryRes.factory, angularCoreEnv, sourceMapUrl, factoryRes.statements);
|
factoryRes.expression, angularCoreEnv, sourceMapUrl, factoryRes.statements);
|
||||||
}
|
}
|
||||||
|
|
||||||
createParseSourceSpan(kind: string, typeName: string, sourceUrl: string): ParseSourceSpan {
|
createParseSourceSpan(kind: string, typeName: string, sourceUrl: string): ParseSourceSpan {
|
||||||
|
|
|
@ -10,7 +10,8 @@ import {DEFAULT_INTERPOLATION_CONFIG} from '../../ml_parser/interpolation_config
|
||||||
import * as o from '../../output/output_ast';
|
import * as o from '../../output/output_ast';
|
||||||
import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../parse_util';
|
import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../parse_util';
|
||||||
import {Identifiers as R3} from '../r3_identifiers';
|
import {Identifiers as R3} from '../r3_identifiers';
|
||||||
import {DeclarationListEmitMode, R3ComponentDef, R3ComponentMetadata, R3UsedDirectiveMetadata} from '../view/api';
|
import {R3CompiledExpression} from '../util';
|
||||||
|
import {DeclarationListEmitMode, R3ComponentMetadata, R3UsedDirectiveMetadata} from '../view/api';
|
||||||
import {createComponentType} from '../view/compiler';
|
import {createComponentType} from '../view/compiler';
|
||||||
import {ParsedTemplate} from '../view/template';
|
import {ParsedTemplate} from '../view/template';
|
||||||
import {DefinitionMap} from '../view/util';
|
import {DefinitionMap} from '../view/util';
|
||||||
|
@ -24,13 +25,13 @@ import {toOptionalLiteralArray} from './util';
|
||||||
* Compile a component declaration defined by the `R3ComponentMetadata`.
|
* Compile a component declaration defined by the `R3ComponentMetadata`.
|
||||||
*/
|
*/
|
||||||
export function compileDeclareComponentFromMetadata(
|
export function compileDeclareComponentFromMetadata(
|
||||||
meta: R3ComponentMetadata, template: ParsedTemplate): R3ComponentDef {
|
meta: R3ComponentMetadata, template: ParsedTemplate): R3CompiledExpression {
|
||||||
const definitionMap = createComponentDefinitionMap(meta, template);
|
const definitionMap = createComponentDefinitionMap(meta, template);
|
||||||
|
|
||||||
const expression = o.importExpr(R3.declareComponent).callFn([definitionMap.toLiteralMap()]);
|
const expression = o.importExpr(R3.declareComponent).callFn([definitionMap.toLiteralMap()]);
|
||||||
const type = createComponentType(meta);
|
const type = createComponentType(meta);
|
||||||
|
|
||||||
return {expression, type};
|
return {expression, type, statements: []};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
*/
|
*/
|
||||||
import * as o from '../../output/output_ast';
|
import * as o from '../../output/output_ast';
|
||||||
import {Identifiers as R3} from '../r3_identifiers';
|
import {Identifiers as R3} from '../r3_identifiers';
|
||||||
import {R3DirectiveDef, R3DirectiveMetadata, R3HostMetadata, R3QueryMetadata} from '../view/api';
|
import {R3CompiledExpression} from '../util';
|
||||||
|
import {R3DirectiveMetadata, R3HostMetadata, R3QueryMetadata} from '../view/api';
|
||||||
import {createDirectiveType} from '../view/compiler';
|
import {createDirectiveType} from '../view/compiler';
|
||||||
import {asLiteral, conditionallyCreateMapObjectLiteral, DefinitionMap} from '../view/util';
|
import {asLiteral, conditionallyCreateMapObjectLiteral, DefinitionMap} from '../view/util';
|
||||||
import {R3DeclareDirectiveMetadata, R3DeclareQueryMetadata} from './api';
|
import {R3DeclareDirectiveMetadata, R3DeclareQueryMetadata} from './api';
|
||||||
|
@ -17,13 +18,14 @@ import {toOptionalLiteralMap} from './util';
|
||||||
/**
|
/**
|
||||||
* Compile a directive declaration defined by the `R3DirectiveMetadata`.
|
* Compile a directive declaration defined by the `R3DirectiveMetadata`.
|
||||||
*/
|
*/
|
||||||
export function compileDeclareDirectiveFromMetadata(meta: R3DirectiveMetadata): R3DirectiveDef {
|
export function compileDeclareDirectiveFromMetadata(meta: R3DirectiveMetadata):
|
||||||
|
R3CompiledExpression {
|
||||||
const definitionMap = createDirectiveDefinitionMap(meta);
|
const definitionMap = createDirectiveDefinitionMap(meta);
|
||||||
|
|
||||||
const expression = o.importExpr(R3.declareDirective).callFn([definitionMap.toLiteralMap()]);
|
const expression = o.importExpr(R3.declareDirective).callFn([definitionMap.toLiteralMap()]);
|
||||||
const type = createDirectiveType(meta);
|
const type = createDirectiveType(meta);
|
||||||
|
|
||||||
return {expression, type};
|
return {expression, type, statements: []};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
import * as o from '../../output/output_ast';
|
import * as o from '../../output/output_ast';
|
||||||
import {Identifiers as R3} from '../r3_identifiers';
|
import {Identifiers as R3} from '../r3_identifiers';
|
||||||
import {createPipeType, R3PipeMetadata} from '../r3_pipe_compiler';
|
import {createPipeType, R3PipeMetadata} from '../r3_pipe_compiler';
|
||||||
import {R3PipeDef} from '../view/api';
|
import {R3CompiledExpression} from '../util';
|
||||||
import {DefinitionMap} from '../view/util';
|
import {DefinitionMap} from '../view/util';
|
||||||
import {R3DeclarePipeMetadata} from './api';
|
import {R3DeclarePipeMetadata} from './api';
|
||||||
|
|
||||||
|
@ -16,13 +16,13 @@ import {R3DeclarePipeMetadata} from './api';
|
||||||
/**
|
/**
|
||||||
* Compile a Pipe declaration defined by the `R3PipeMetadata`.
|
* Compile a Pipe declaration defined by the `R3PipeMetadata`.
|
||||||
*/
|
*/
|
||||||
export function compileDeclarePipeFromMetadata(meta: R3PipeMetadata): R3PipeDef {
|
export function compileDeclarePipeFromMetadata(meta: R3PipeMetadata): R3CompiledExpression {
|
||||||
const definitionMap = createPipeDefinitionMap(meta);
|
const definitionMap = createPipeDefinitionMap(meta);
|
||||||
|
|
||||||
const expression = o.importExpr(R3.declarePipe).callFn([definitionMap.toLiteralMap()]);
|
const expression = o.importExpr(R3.declarePipe).callFn([definitionMap.toLiteralMap()]);
|
||||||
const type = createPipeType(meta);
|
const type = createPipeType(meta);
|
||||||
|
|
||||||
return {expression, type};
|
return {expression, type, statements: []};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -15,7 +15,7 @@ import * as o from '../output/output_ast';
|
||||||
import {Identifiers as R3} from '../render3/r3_identifiers';
|
import {Identifiers as R3} from '../render3/r3_identifiers';
|
||||||
import {OutputContext} from '../util';
|
import {OutputContext} from '../util';
|
||||||
|
|
||||||
import {R3Reference, typeWithParameters} from './util';
|
import {R3CompiledExpression, R3Reference, typeWithParameters} from './util';
|
||||||
import {unsupported} from './view/util';
|
import {unsupported} from './view/util';
|
||||||
|
|
||||||
|
|
||||||
|
@ -169,16 +169,10 @@ export interface R3DependencyMetadata {
|
||||||
skipSelf: boolean;
|
skipSelf: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface R3FactoryFn {
|
|
||||||
factory: o.Expression;
|
|
||||||
statements: o.Statement[];
|
|
||||||
type: o.ExpressionType;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a factory function expression for the given `R3FactoryMetadata`.
|
* Construct a factory function expression for the given `R3FactoryMetadata`.
|
||||||
*/
|
*/
|
||||||
export function compileFactoryFunction(meta: R3FactoryMetadata): R3FactoryFn {
|
export function compileFactoryFunction(meta: R3FactoryMetadata): R3CompiledExpression {
|
||||||
const t = o.variable('t');
|
const t = o.variable('t');
|
||||||
const statements: o.Statement[] = [];
|
const statements: o.Statement[] = [];
|
||||||
let ctorDepsType: o.Type = o.NONE_TYPE;
|
let ctorDepsType: o.Type = o.NONE_TYPE;
|
||||||
|
@ -258,7 +252,7 @@ export function compileFactoryFunction(meta: R3FactoryMetadata): R3FactoryFn {
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
factory: o.fn(
|
expression: o.fn(
|
||||||
[new o.FnParam('t', o.DYNAMIC_TYPE)], body, o.INFERRED_TYPE, undefined,
|
[new o.FnParam('t', o.DYNAMIC_TYPE)], body, o.INFERRED_TYPE, undefined,
|
||||||
`${meta.name}_Factory`),
|
`${meta.name}_Factory`),
|
||||||
statements,
|
statements,
|
||||||
|
|
|
@ -9,15 +9,9 @@
|
||||||
import * as o from '../output/output_ast';
|
import * as o from '../output/output_ast';
|
||||||
|
|
||||||
import {Identifiers as R3} from './r3_identifiers';
|
import {Identifiers as R3} from './r3_identifiers';
|
||||||
import {jitOnlyGuardedExpression, R3Reference} from './util';
|
import {jitOnlyGuardedExpression, R3CompiledExpression, R3Reference} from './util';
|
||||||
import {DefinitionMap} from './view/util';
|
import {DefinitionMap} from './view/util';
|
||||||
|
|
||||||
export interface R3NgModuleDef {
|
|
||||||
expression: o.Expression;
|
|
||||||
type: o.Type;
|
|
||||||
additionalStatements: o.Statement[];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Metadata required by the module compiler to generate a module def (`ɵmod`) for a type.
|
* Metadata required by the module compiler to generate a module def (`ɵmod`) for a type.
|
||||||
*/
|
*/
|
||||||
|
@ -126,7 +120,7 @@ interface R3NgModuleDefMap {
|
||||||
/**
|
/**
|
||||||
* Construct an `R3NgModuleDef` for the given `R3NgModuleMetadata`.
|
* Construct an `R3NgModuleDef` for the given `R3NgModuleMetadata`.
|
||||||
*/
|
*/
|
||||||
export function compileNgModule(meta: R3NgModuleMetadata): R3NgModuleDef {
|
export function compileNgModule(meta: R3NgModuleMetadata): R3CompiledExpression {
|
||||||
const {
|
const {
|
||||||
internalType,
|
internalType,
|
||||||
type: moduleType,
|
type: moduleType,
|
||||||
|
@ -140,7 +134,7 @@ export function compileNgModule(meta: R3NgModuleMetadata): R3NgModuleDef {
|
||||||
id
|
id
|
||||||
} = meta;
|
} = meta;
|
||||||
|
|
||||||
const additionalStatements: o.Statement[] = [];
|
const statements: o.Statement[] = [];
|
||||||
const definitionMap = new DefinitionMap<R3NgModuleDefMap>();
|
const definitionMap = new DefinitionMap<R3NgModuleDefMap>();
|
||||||
definitionMap.set('type', internalType);
|
definitionMap.set('type', internalType);
|
||||||
|
|
||||||
|
@ -170,7 +164,7 @@ export function compileNgModule(meta: R3NgModuleMetadata): R3NgModuleDef {
|
||||||
else {
|
else {
|
||||||
const setNgModuleScopeCall = generateSetNgModuleScopeCall(meta);
|
const setNgModuleScopeCall = generateSetNgModuleScopeCall(meta);
|
||||||
if (setNgModuleScopeCall !== null) {
|
if (setNgModuleScopeCall !== null) {
|
||||||
additionalStatements.push(setNgModuleScopeCall);
|
statements.push(setNgModuleScopeCall);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -190,7 +184,7 @@ export function compileNgModule(meta: R3NgModuleMetadata): R3NgModuleDef {
|
||||||
]));
|
]));
|
||||||
|
|
||||||
|
|
||||||
return {expression, type, additionalStatements};
|
return {expression, type, statements};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -242,11 +236,6 @@ function generateSetNgModuleScopeCall(meta: R3NgModuleMetadata): o.Statement|nul
|
||||||
return iifeCall.toStmt();
|
return iifeCall.toStmt();
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface R3InjectorDef {
|
|
||||||
expression: o.Expression;
|
|
||||||
type: o.Type;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface R3InjectorMetadata {
|
export interface R3InjectorMetadata {
|
||||||
name: string;
|
name: string;
|
||||||
type: R3Reference;
|
type: R3Reference;
|
||||||
|
@ -255,7 +244,7 @@ export interface R3InjectorMetadata {
|
||||||
imports: o.Expression[];
|
imports: o.Expression[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export function compileInjector(meta: R3InjectorMetadata): R3InjectorDef {
|
export function compileInjector(meta: R3InjectorMetadata): R3CompiledExpression {
|
||||||
const definitionMap = new DefinitionMap<{providers: o.Expression, imports: o.Expression}>();
|
const definitionMap = new DefinitionMap<{providers: o.Expression, imports: o.Expression}>();
|
||||||
|
|
||||||
if (meta.providers !== null) {
|
if (meta.providers !== null) {
|
||||||
|
@ -270,7 +259,7 @@ export function compileInjector(meta: R3InjectorMetadata): R3InjectorDef {
|
||||||
o.importExpr(R3.defineInjector).callFn([definitionMap.toLiteralMap()], undefined, true);
|
o.importExpr(R3.defineInjector).callFn([definitionMap.toLiteralMap()], undefined, true);
|
||||||
const type =
|
const type =
|
||||||
new o.ExpressionType(o.importExpr(R3.InjectorDef, [new o.ExpressionType(meta.type.type)]));
|
new o.ExpressionType(o.importExpr(R3.InjectorDef, [new o.ExpressionType(meta.type.type)]));
|
||||||
return {expression, type};
|
return {expression, type, statements: []};
|
||||||
}
|
}
|
||||||
|
|
||||||
function tupleTypeOf(exp: R3Reference[]): o.Type {
|
function tupleTypeOf(exp: R3Reference[]): o.Type {
|
||||||
|
|
|
@ -9,8 +9,7 @@ import * as o from '../output/output_ast';
|
||||||
|
|
||||||
import {R3DependencyMetadata} from './r3_factory';
|
import {R3DependencyMetadata} from './r3_factory';
|
||||||
import {Identifiers as R3} from './r3_identifiers';
|
import {Identifiers as R3} from './r3_identifiers';
|
||||||
import {R3Reference, typeWithParameters} from './util';
|
import {R3CompiledExpression, R3Reference, typeWithParameters} from './util';
|
||||||
import {R3PipeDef} from './view/api';
|
|
||||||
|
|
||||||
export interface R3PipeMetadata {
|
export interface R3PipeMetadata {
|
||||||
/**
|
/**
|
||||||
|
@ -53,7 +52,7 @@ export interface R3PipeMetadata {
|
||||||
pure: boolean;
|
pure: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function compilePipeFromMetadata(metadata: R3PipeMetadata): R3PipeDef {
|
export function compilePipeFromMetadata(metadata: R3PipeMetadata): R3CompiledExpression {
|
||||||
const definitionMapValues: {key: string, quoted: boolean, value: o.Expression}[] = [];
|
const definitionMapValues: {key: string, quoted: boolean, value: o.Expression}[] = [];
|
||||||
|
|
||||||
// e.g. `name: 'myPipe'`
|
// e.g. `name: 'myPipe'`
|
||||||
|
@ -69,7 +68,7 @@ export function compilePipeFromMetadata(metadata: R3PipeMetadata): R3PipeDef {
|
||||||
o.importExpr(R3.definePipe).callFn([o.literalMap(definitionMapValues)], undefined, true);
|
o.importExpr(R3.definePipe).callFn([o.literalMap(definitionMapValues)], undefined, true);
|
||||||
const type = createPipeType(metadata);
|
const type = createPipeType(metadata);
|
||||||
|
|
||||||
return {expression, type};
|
return {expression, type, statements: []};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function createPipeType(metadata: R3PipeMetadata): o.Type {
|
export function createPipeType(metadata: R3PipeMetadata): o.Type {
|
||||||
|
|
|
@ -25,6 +25,15 @@ export interface R3Reference {
|
||||||
type: o.Expression;
|
type: o.Expression;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result of compilation of a render3 code unit, e.g. component, directive, pipe, etc.
|
||||||
|
*/
|
||||||
|
export interface R3CompiledExpression {
|
||||||
|
expression: o.Expression;
|
||||||
|
type: o.Type;
|
||||||
|
statements: o.Statement[];
|
||||||
|
}
|
||||||
|
|
||||||
const ANIMATE_SYMBOL_PREFIX = '@';
|
const ANIMATE_SYMBOL_PREFIX = '@';
|
||||||
export function prepareSyntheticPropertyName(name: string) {
|
export function prepareSyntheticPropertyName(name: string) {
|
||||||
return `${ANIMATE_SYMBOL_PREFIX}${name}`;
|
return `${ANIMATE_SYMBOL_PREFIX}${name}`;
|
||||||
|
|
|
@ -338,30 +338,6 @@ export interface R3QueryMetadata {
|
||||||
static: boolean;
|
static: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Output of render3 directive compilation.
|
|
||||||
*/
|
|
||||||
export interface R3DirectiveDef {
|
|
||||||
expression: o.Expression;
|
|
||||||
type: o.Type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Output of render3 component compilation.
|
|
||||||
*/
|
|
||||||
export interface R3ComponentDef {
|
|
||||||
expression: o.Expression;
|
|
||||||
type: o.Type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Output of render3 pipe compilation.
|
|
||||||
*/
|
|
||||||
export interface R3PipeDef {
|
|
||||||
expression: o.Expression;
|
|
||||||
type: o.Type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mappings indicating how the class interacts with its
|
* Mappings indicating how the class interacts with its
|
||||||
* host element (host bindings, listeners, etc).
|
* host element (host bindings, listeners, etc).
|
||||||
|
|
|
@ -20,9 +20,9 @@ import {BindingParser} from '../../template_parser/binding_parser';
|
||||||
import {error} from '../../util';
|
import {error} from '../../util';
|
||||||
import {BoundEvent} from '../r3_ast';
|
import {BoundEvent} from '../r3_ast';
|
||||||
import {Identifiers as R3} from '../r3_identifiers';
|
import {Identifiers as R3} from '../r3_identifiers';
|
||||||
import {prepareSyntheticListenerFunctionName, prepareSyntheticPropertyName, typeWithParameters} from '../util';
|
import {prepareSyntheticListenerFunctionName, prepareSyntheticPropertyName, R3CompiledExpression, typeWithParameters} from '../util';
|
||||||
|
|
||||||
import {DeclarationListEmitMode, R3ComponentDef, R3ComponentMetadata, R3DirectiveDef, R3DirectiveMetadata, R3HostMetadata, R3QueryMetadata} from './api';
|
import {DeclarationListEmitMode, R3ComponentMetadata, R3DirectiveMetadata, R3HostMetadata, R3QueryMetadata} from './api';
|
||||||
import {MIN_STYLING_BINDING_SLOTS_REQUIRED, StylingBuilder, StylingInstructionCall} from './styling_builder';
|
import {MIN_STYLING_BINDING_SLOTS_REQUIRED, StylingBuilder, StylingInstructionCall} from './styling_builder';
|
||||||
import {BindingScope, makeBindingParser, prepareEventListenerParameters, renderFlagCheckIfStmt, resolveSanitizationFn, TemplateDefinitionBuilder, ValueConverter} from './template';
|
import {BindingScope, makeBindingParser, prepareEventListenerParameters, renderFlagCheckIfStmt, resolveSanitizationFn, TemplateDefinitionBuilder, ValueConverter} from './template';
|
||||||
import {asLiteral, chainedInstruction, conditionallyCreateMapObjectLiteral, CONTEXT_NAME, DefinitionMap, getQueryPredicate, RENDER_FLAGS, TEMPORARY_NAME, temporaryAllocator} from './util';
|
import {asLiteral, chainedInstruction, conditionallyCreateMapObjectLiteral, CONTEXT_NAME, DefinitionMap, getQueryPredicate, RENDER_FLAGS, TEMPORARY_NAME, temporaryAllocator} from './util';
|
||||||
|
@ -113,14 +113,14 @@ function addFeatures(definitionMap: DefinitionMap, meta: R3DirectiveMetadata|R3C
|
||||||
*/
|
*/
|
||||||
export function compileDirectiveFromMetadata(
|
export function compileDirectiveFromMetadata(
|
||||||
meta: R3DirectiveMetadata, constantPool: ConstantPool,
|
meta: R3DirectiveMetadata, constantPool: ConstantPool,
|
||||||
bindingParser: BindingParser): R3DirectiveDef {
|
bindingParser: BindingParser): R3CompiledExpression {
|
||||||
const definitionMap = baseDirectiveFields(meta, constantPool, bindingParser);
|
const definitionMap = baseDirectiveFields(meta, constantPool, bindingParser);
|
||||||
addFeatures(definitionMap, meta);
|
addFeatures(definitionMap, meta);
|
||||||
const expression =
|
const expression =
|
||||||
o.importExpr(R3.defineDirective).callFn([definitionMap.toLiteralMap()], undefined, true);
|
o.importExpr(R3.defineDirective).callFn([definitionMap.toLiteralMap()], undefined, true);
|
||||||
const type = createDirectiveType(meta);
|
const type = createDirectiveType(meta);
|
||||||
|
|
||||||
return {expression, type};
|
return {expression, type, statements: []};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -128,7 +128,7 @@ export function compileDirectiveFromMetadata(
|
||||||
*/
|
*/
|
||||||
export function compileComponentFromMetadata(
|
export function compileComponentFromMetadata(
|
||||||
meta: R3ComponentMetadata, constantPool: ConstantPool,
|
meta: R3ComponentMetadata, constantPool: ConstantPool,
|
||||||
bindingParser: BindingParser): R3ComponentDef {
|
bindingParser: BindingParser): R3CompiledExpression {
|
||||||
const definitionMap = baseDirectiveFields(meta, constantPool, bindingParser);
|
const definitionMap = baseDirectiveFields(meta, constantPool, bindingParser);
|
||||||
addFeatures(definitionMap, meta);
|
addFeatures(definitionMap, meta);
|
||||||
|
|
||||||
|
@ -256,7 +256,7 @@ export function compileComponentFromMetadata(
|
||||||
o.importExpr(R3.defineComponent).callFn([definitionMap.toLiteralMap()], undefined, true);
|
o.importExpr(R3.defineComponent).callFn([definitionMap.toLiteralMap()], undefined, true);
|
||||||
const type = createComponentType(meta);
|
const type = createComponentType(meta);
|
||||||
|
|
||||||
return {expression, type};
|
return {expression, type, statements: []};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue