From 0b47902ad7dc244076afcf9f2e27aea9a885fc99 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Fri, 20 Apr 2018 08:52:07 -0700 Subject: [PATCH] refactor(ivy): move core code to core.ts (#23476) PR Close #23476 --- packages/compiler/src/core.ts | 66 ++++++++++++++ .../src/render3/r3_view_compiler_local.ts | 86 +++---------------- 2 files changed, 76 insertions(+), 76 deletions(-) diff --git a/packages/compiler/src/core.ts b/packages/compiler/src/core.ts index 2f4241e0c9..6f6580fd10 100644 --- a/packages/compiler/src/core.ts +++ b/packages/compiler/src/core.ts @@ -12,6 +12,8 @@ // This is important to prevent a build cycle, as @angular/core needs to // be compiled with the compiler. +import {CssSelector} from './selector'; + export interface Inject { token: any; } export const createInject = makeMetadataFactory('Inject', (token: any) => ({token})); export const createInjectionToken = makeMetadataFactory( @@ -295,3 +297,67 @@ export interface Route { children?: Route[]; 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); +} diff --git a/packages/compiler/src/render3/r3_view_compiler_local.ts b/packages/compiler/src/render3/r3_view_compiler_local.ts index a3c9d78d72..cab255e72e 100644 --- a/packages/compiler/src/render3/r3_view_compiler_local.ts +++ b/packages/compiler/src/render3/r3_view_compiler_local.ts @@ -10,7 +10,7 @@ import {CompileDiDependencyMetadata, CompileDirectiveMetadata, CompileQueryMetad import {CompileReflector} from '../compile_reflector'; import {BindingForm, BuiltinFunctionCall, LocalResolver, convertActionBinding, convertPropertyBinding} from '../compiler_util/expression_converter'; 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 {Identifiers} from '../identifiers'; import {LifecycleHooks} from '../lifecycle_reflector'; @@ -440,7 +440,7 @@ class TemplateDefinitionBuilder implements t.Visitor, LocalResolver { // Only selectors with a non-default value are generated 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 const parsed = this.outputCtx.constantPool.getConstLiteral(asLiteral(r3Selectors), true); const unParsed = @@ -883,7 +883,7 @@ export function createFactory( token.identifier != null ? outputCtx.importExpr(tokenRef) : o.literal(tokenRef); const directiveInjectArgs = [tokenValue]; const flags = extractFlags(dependency); - if (flags != InjectFlags.Default) { + if (flags != core.InjectFlags.Default) { // Append flag information if other than default. directiveInjectArgs.push(o.literal(flags)); } @@ -921,19 +921,19 @@ export function createFactory( type.reference.name ? `${type.reference.name}_Factory` : null); } -function extractFlags(dependency: CompileDiDependencyMetadata): InjectFlags { - let flags = InjectFlags.Default; +function extractFlags(dependency: CompileDiDependencyMetadata): core.InjectFlags { + let flags = core.InjectFlags.Default; if (dependency.isHost) { - flags |= InjectFlags.Host; + flags |= core.InjectFlags.Host; } if (dependency.isOptional) { - flags |= InjectFlags.Optional; + flags |= core.InjectFlags.Optional; } if (dependency.isSelf) { - flags |= InjectFlags.Self; + flags |= core.InjectFlags.Self; } if (dependency.isSkipSelf) { - flags |= InjectFlags.SkipSelf; + flags |= core.InjectFlags.SkipSelf; } if (dependency.isValue) { 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 function createDirectiveSelector(selector: string): o.Expression { - return asLiteral(parseSelectorToR3Selector(selector)); + return asLiteral(core.parseSelectorToR3Selector(selector)); } function createHostAttributesArray( @@ -1106,72 +1106,6 @@ function invalid(arg: o.Expression | o.Statement | t.Node): never { `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 { if (Array.isArray(value)) { return o.literalArr(value.map(asLiteral));