parent
4662878a1f
commit
0b47902ad7
|
@ -12,6 +12,8 @@
|
||||||
// This is important to prevent a build cycle, as @angular/core needs to
|
// This is important to prevent a build cycle, as @angular/core needs to
|
||||||
// be compiled with the compiler.
|
// be compiled with the compiler.
|
||||||
|
|
||||||
|
import {CssSelector} from './selector';
|
||||||
|
|
||||||
export interface Inject { token: any; }
|
export interface Inject { token: any; }
|
||||||
export const createInject = makeMetadataFactory<Inject>('Inject', (token: any) => ({token}));
|
export const createInject = makeMetadataFactory<Inject>('Inject', (token: any) => ({token}));
|
||||||
export const createInjectionToken = makeMetadataFactory<object>(
|
export const createInjectionToken = makeMetadataFactory<object>(
|
||||||
|
@ -295,3 +297,67 @@ export interface Route {
|
||||||
children?: Route[];
|
children?: Route[];
|
||||||
loadChildren?: string|Type|any;
|
loadChildren?: string|Type|any;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flags used to generate R3-style CSS Selectors. They are pasted from
|
||||||
|
* core/src/render3/projection.ts because they cannot be referenced directly.
|
||||||
|
*/
|
||||||
|
export const enum SelectorFlags {
|
||||||
|
/** Indicates this is the beginning of a new negative selector */
|
||||||
|
NOT = 0b0001,
|
||||||
|
|
||||||
|
/** Mode for matching attributes */
|
||||||
|
ATTRIBUTE = 0b0010,
|
||||||
|
|
||||||
|
/** Mode for matching tag names */
|
||||||
|
ELEMENT = 0b0100,
|
||||||
|
|
||||||
|
/** Mode for matching class names */
|
||||||
|
CLASS = 0b1000,
|
||||||
|
}
|
||||||
|
|
||||||
|
// These are a copy the CSS types from core/src/render3/interfaces/projection.ts
|
||||||
|
// They are duplicated here as they cannot be directly referenced from core.
|
||||||
|
export type R3CssSelector = (string | SelectorFlags)[];
|
||||||
|
export type R3CssSelectorList = R3CssSelector[];
|
||||||
|
|
||||||
|
function parserSelectorToSimpleSelector(selector: CssSelector): R3CssSelector {
|
||||||
|
const classes = selector.classNames && selector.classNames.length ?
|
||||||
|
[SelectorFlags.CLASS, ...selector.classNames] :
|
||||||
|
[];
|
||||||
|
const elementName = selector.element && selector.element !== '*' ? selector.element : '';
|
||||||
|
return [elementName, ...selector.attrs, ...classes];
|
||||||
|
}
|
||||||
|
|
||||||
|
function parserSelectorToNegativeSelector(selector: CssSelector): R3CssSelector {
|
||||||
|
const classes = selector.classNames && selector.classNames.length ?
|
||||||
|
[SelectorFlags.CLASS, ...selector.classNames] :
|
||||||
|
[];
|
||||||
|
|
||||||
|
if (selector.element) {
|
||||||
|
return [
|
||||||
|
SelectorFlags.NOT | SelectorFlags.ELEMENT, selector.element, ...selector.attrs, ...classes
|
||||||
|
];
|
||||||
|
} else if (selector.attrs.length) {
|
||||||
|
return [SelectorFlags.NOT | SelectorFlags.ATTRIBUTE, ...selector.attrs, ...classes];
|
||||||
|
} else {
|
||||||
|
return selector.classNames && selector.classNames.length ?
|
||||||
|
[SelectorFlags.NOT | SelectorFlags.CLASS, ...selector.classNames] :
|
||||||
|
[];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parserSelectorToR3Selector(selector: CssSelector): R3CssSelector {
|
||||||
|
const positive = parserSelectorToSimpleSelector(selector);
|
||||||
|
|
||||||
|
const negative: R3CssSelectorList = selector.notSelectors && selector.notSelectors.length ?
|
||||||
|
selector.notSelectors.map(notSelector => parserSelectorToNegativeSelector(notSelector)) :
|
||||||
|
[];
|
||||||
|
|
||||||
|
return positive.concat(...negative);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function parseSelectorToR3Selector(selector: string): R3CssSelectorList {
|
||||||
|
const selectors = CssSelector.parse(selector);
|
||||||
|
return selectors.map(parserSelectorToR3Selector);
|
||||||
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ import {CompileDiDependencyMetadata, CompileDirectiveMetadata, CompileQueryMetad
|
||||||
import {CompileReflector} from '../compile_reflector';
|
import {CompileReflector} from '../compile_reflector';
|
||||||
import {BindingForm, BuiltinFunctionCall, LocalResolver, convertActionBinding, convertPropertyBinding} from '../compiler_util/expression_converter';
|
import {BindingForm, BuiltinFunctionCall, LocalResolver, convertActionBinding, convertPropertyBinding} from '../compiler_util/expression_converter';
|
||||||
import {ConstantPool, DefinitionKind} from '../constant_pool';
|
import {ConstantPool, DefinitionKind} from '../constant_pool';
|
||||||
import {InjectFlags} from '../core';
|
import * as core from '../core';
|
||||||
import {AST, AstMemoryEfficientTransformer, BindingPipe, FunctionCall, ImplicitReceiver, LiteralArray, LiteralMap, LiteralPrimitive, PropertyRead} from '../expression_parser/ast';
|
import {AST, AstMemoryEfficientTransformer, BindingPipe, FunctionCall, ImplicitReceiver, LiteralArray, LiteralMap, LiteralPrimitive, PropertyRead} from '../expression_parser/ast';
|
||||||
import {Identifiers} from '../identifiers';
|
import {Identifiers} from '../identifiers';
|
||||||
import {LifecycleHooks} from '../lifecycle_reflector';
|
import {LifecycleHooks} from '../lifecycle_reflector';
|
||||||
|
@ -440,7 +440,7 @@ class TemplateDefinitionBuilder implements t.Visitor<void>, LocalResolver {
|
||||||
|
|
||||||
// Only selectors with a non-default value are generated
|
// Only selectors with a non-default value are generated
|
||||||
if (ngContentSelectors.length > 1) {
|
if (ngContentSelectors.length > 1) {
|
||||||
const r3Selectors = ngContentSelectors.map(s => parseSelectorToR3Selector(s));
|
const r3Selectors = ngContentSelectors.map(s => core.parseSelectorToR3Selector(s));
|
||||||
// `projectionDef` needs both the parsed and raw value of the selectors
|
// `projectionDef` needs both the parsed and raw value of the selectors
|
||||||
const parsed = this.outputCtx.constantPool.getConstLiteral(asLiteral(r3Selectors), true);
|
const parsed = this.outputCtx.constantPool.getConstLiteral(asLiteral(r3Selectors), true);
|
||||||
const unParsed =
|
const unParsed =
|
||||||
|
@ -883,7 +883,7 @@ export function createFactory(
|
||||||
token.identifier != null ? outputCtx.importExpr(tokenRef) : o.literal(tokenRef);
|
token.identifier != null ? outputCtx.importExpr(tokenRef) : o.literal(tokenRef);
|
||||||
const directiveInjectArgs = [tokenValue];
|
const directiveInjectArgs = [tokenValue];
|
||||||
const flags = extractFlags(dependency);
|
const flags = extractFlags(dependency);
|
||||||
if (flags != InjectFlags.Default) {
|
if (flags != core.InjectFlags.Default) {
|
||||||
// Append flag information if other than default.
|
// Append flag information if other than default.
|
||||||
directiveInjectArgs.push(o.literal(flags));
|
directiveInjectArgs.push(o.literal(flags));
|
||||||
}
|
}
|
||||||
|
@ -921,19 +921,19 @@ export function createFactory(
|
||||||
type.reference.name ? `${type.reference.name}_Factory` : null);
|
type.reference.name ? `${type.reference.name}_Factory` : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
function extractFlags(dependency: CompileDiDependencyMetadata): InjectFlags {
|
function extractFlags(dependency: CompileDiDependencyMetadata): core.InjectFlags {
|
||||||
let flags = InjectFlags.Default;
|
let flags = core.InjectFlags.Default;
|
||||||
if (dependency.isHost) {
|
if (dependency.isHost) {
|
||||||
flags |= InjectFlags.Host;
|
flags |= core.InjectFlags.Host;
|
||||||
}
|
}
|
||||||
if (dependency.isOptional) {
|
if (dependency.isOptional) {
|
||||||
flags |= InjectFlags.Optional;
|
flags |= core.InjectFlags.Optional;
|
||||||
}
|
}
|
||||||
if (dependency.isSelf) {
|
if (dependency.isSelf) {
|
||||||
flags |= InjectFlags.Self;
|
flags |= core.InjectFlags.Self;
|
||||||
}
|
}
|
||||||
if (dependency.isSkipSelf) {
|
if (dependency.isSkipSelf) {
|
||||||
flags |= InjectFlags.SkipSelf;
|
flags |= core.InjectFlags.SkipSelf;
|
||||||
}
|
}
|
||||||
if (dependency.isValue) {
|
if (dependency.isValue) {
|
||||||
unsupported('value dependencies');
|
unsupported('value dependencies');
|
||||||
|
@ -953,7 +953,7 @@ function trimTrailingNulls(parameters: o.Expression[]): o.Expression[] {
|
||||||
|
|
||||||
// Turn a directive selector into an R3-compatible selector for directive def
|
// Turn a directive selector into an R3-compatible selector for directive def
|
||||||
function createDirectiveSelector(selector: string): o.Expression {
|
function createDirectiveSelector(selector: string): o.Expression {
|
||||||
return asLiteral(parseSelectorToR3Selector(selector));
|
return asLiteral(core.parseSelectorToR3Selector(selector));
|
||||||
}
|
}
|
||||||
|
|
||||||
function createHostAttributesArray(
|
function createHostAttributesArray(
|
||||||
|
@ -1106,72 +1106,6 @@ function invalid<T>(arg: o.Expression | o.Statement | t.Node): never {
|
||||||
`Invalid state: Visitor ${this.constructor.name} doesn't handle ${o.constructor.name}`);
|
`Invalid state: Visitor ${this.constructor.name} doesn't handle ${o.constructor.name}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Flags used to generate R3-style CSS Selectors. They are pasted from
|
|
||||||
* core/src/render3/projection.ts because they cannot be referenced directly.
|
|
||||||
*/
|
|
||||||
// TODO(vicb): move to ../core
|
|
||||||
const enum SelectorFlags {
|
|
||||||
/** Indicates this is the beginning of a new negative selector */
|
|
||||||
NOT = 0b0001,
|
|
||||||
|
|
||||||
/** Mode for matching attributes */
|
|
||||||
ATTRIBUTE = 0b0010,
|
|
||||||
|
|
||||||
/** Mode for matching tag names */
|
|
||||||
ELEMENT = 0b0100,
|
|
||||||
|
|
||||||
/** Mode for matching class names */
|
|
||||||
CLASS = 0b1000,
|
|
||||||
}
|
|
||||||
|
|
||||||
// These are a copy the CSS types from core/src/render3/interfaces/projection.ts
|
|
||||||
// They are duplicated here as they cannot be directly referenced from core.
|
|
||||||
// TODO(vicb): move to ../core
|
|
||||||
type R3CssSelector = (string | SelectorFlags)[];
|
|
||||||
type R3CssSelectorList = R3CssSelector[];
|
|
||||||
|
|
||||||
function parserSelectorToSimpleSelector(selector: CssSelector): R3CssSelector {
|
|
||||||
const classes = selector.classNames && selector.classNames.length ?
|
|
||||||
[SelectorFlags.CLASS, ...selector.classNames] :
|
|
||||||
[];
|
|
||||||
const elementName = selector.element && selector.element !== '*' ? selector.element : '';
|
|
||||||
return [elementName, ...selector.attrs, ...classes];
|
|
||||||
}
|
|
||||||
|
|
||||||
function parserSelectorToNegativeSelector(selector: CssSelector): R3CssSelector {
|
|
||||||
const classes = selector.classNames && selector.classNames.length ?
|
|
||||||
[SelectorFlags.CLASS, ...selector.classNames] :
|
|
||||||
[];
|
|
||||||
|
|
||||||
if (selector.element) {
|
|
||||||
return [
|
|
||||||
SelectorFlags.NOT | SelectorFlags.ELEMENT, selector.element, ...selector.attrs, ...classes
|
|
||||||
];
|
|
||||||
} else if (selector.attrs.length) {
|
|
||||||
return [SelectorFlags.NOT | SelectorFlags.ATTRIBUTE, ...selector.attrs, ...classes];
|
|
||||||
} else {
|
|
||||||
return selector.classNames && selector.classNames.length ?
|
|
||||||
[SelectorFlags.NOT | SelectorFlags.CLASS, ...selector.classNames] :
|
|
||||||
[];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function parserSelectorToR3Selector(selector: CssSelector): R3CssSelector {
|
|
||||||
const positive = parserSelectorToSimpleSelector(selector);
|
|
||||||
|
|
||||||
const negative: R3CssSelectorList = selector.notSelectors && selector.notSelectors.length ?
|
|
||||||
selector.notSelectors.map(notSelector => parserSelectorToNegativeSelector(notSelector)) :
|
|
||||||
[];
|
|
||||||
|
|
||||||
return positive.concat(...negative);
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseSelectorToR3Selector(selector: string): R3CssSelectorList {
|
|
||||||
const selectors = CssSelector.parse(selector);
|
|
||||||
return selectors.map(parserSelectorToR3Selector);
|
|
||||||
}
|
|
||||||
|
|
||||||
function asLiteral(value: any): o.Expression {
|
function asLiteral(value: any): o.Expression {
|
||||||
if (Array.isArray(value)) {
|
if (Array.isArray(value)) {
|
||||||
return o.literalArr(value.map(asLiteral));
|
return o.literalArr(value.map(asLiteral));
|
||||||
|
|
Loading…
Reference in New Issue