From 6f9881f85f05d1f8a501ed6ada8b0ceb35d224a1 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Wed, 9 Jan 2019 14:54:47 +0100 Subject: [PATCH] refactor(ivy): remove concept of RENDER_PARENT from LContainer (#28011) PR Close #28011 --- packages/core/src/render3/i18n.ts | 3 +-- packages/core/src/render3/instructions.ts | 25 ++++++++----------- .../core/src/render3/interfaces/container.ts | 25 +------------------ .../core/src/render3/node_manipulation.ts | 24 +++--------------- .../src/render3/view_engine_compatibility.ts | 2 +- .../hello_world/bundle.golden_symbols.json | 3 --- .../bundling/todo/bundle.golden_symbols.json | 3 --- 7 files changed, 18 insertions(+), 67 deletions(-) diff --git a/packages/core/src/render3/i18n.ts b/packages/core/src/render3/i18n.ts index 7455ab11df..9d27b4b402 100644 --- a/packages/core/src/render3/i18n.ts +++ b/packages/core/src/render3/i18n.ts @@ -12,7 +12,7 @@ import {_sanitizeUrl, sanitizeSrcset} from '../sanitization/url_sanitizer'; import {assertDefined, assertEqual, assertGreaterThan} from './assert'; import {attachPatchData} from './context_discovery'; import {allocExpando, createNodeAtIndex, elementAttribute, load, textBinding} from './instructions'; -import {LContainer, NATIVE, RENDER_PARENT} from './interfaces/container'; +import {LContainer, NATIVE} from './interfaces/container'; import {COMMENT_MARKER, ELEMENT_MARKER, I18nMutateOpCode, I18nMutateOpCodes, I18nUpdateOpCode, I18nUpdateOpCodes, IcuType, TI18n, TIcu} from './interfaces/i18n'; import {TElementNode, TIcuContainerNode, TNode, TNodeType} from './interfaces/node'; import {RComment, RElement} from './interfaces/renderer'; @@ -795,7 +795,6 @@ function removeNode(index: number, viewData: LView) { if (removedPhTNode.type !== TNodeType.Container) { removeChild(removedPhTNode, lContainer[NATIVE], viewData); } - lContainer[RENDER_PARENT] = null; } } diff --git a/packages/core/src/render3/instructions.ts b/packages/core/src/render3/instructions.ts index f3ee6ac4c5..f349113b9d 100644 --- a/packages/core/src/render3/instructions.ts +++ b/packages/core/src/render3/instructions.ts @@ -33,7 +33,7 @@ import {GlobalTargetResolver, ProceduralRenderer3, RComment, RElement, RText, Re import {SanitizerFn} from './interfaces/sanitization'; import {BINDING_INDEX, CLEANUP, CONTAINER_INDEX, CONTENT_QUERIES, CONTEXT, DECLARATION_VIEW, FLAGS, HEADER_OFFSET, HOST, HOST_NODE, INJECTOR, LView, LViewFlags, NEXT, OpaqueViewState, PARENT, QUERIES, RENDERER, RENDERER_FACTORY, RootContext, RootContextFlags, SANITIZER, TAIL, TVIEW, TView} from './interfaces/view'; import {assertNodeOfPossibleTypes, assertNodeType} from './node_assert'; -import {appendChild, appendProjectedNode, createTextNode, getLViewChild, getRenderParent, insertView, removeView} from './node_manipulation'; +import {appendChild, appendProjectedNode, createTextNode, getLViewChild, insertView, removeView} from './node_manipulation'; import {isNodeMatchingSelectorList, matchingSelectorIndex} from './node_selector_matcher'; import {decreaseElementDepthCount, enterView, getBindingsEnabled, getCheckNoChangesMode, getContextLView, getCurrentDirectiveDef, getElementDepthCount, getFirstTemplatePass, getIsParent, getLView, getPreviousOrParentTNode, increaseElementDepthCount, isCreationMode, leaveView, nextContextImpl, resetComponentState, setBindingRoot, setCheckNoChangesMode, setCurrentDirectiveDef, setFirstTemplatePass, setIsParent, setPreviousOrParentTNode} from './state'; import {getInitialClassNameValue, initializeStaticContext as initializeStaticStylingContext, patchContextWithStaticAttrs, renderInitialStylesAndClasses, renderStyling, updateClassProp as updateElementClassProp, updateContextWithBindings, updateStyleProp as updateElementStyleProp, updateStylingMap} from './styling/class_and_style_bindings'; @@ -1862,18 +1862,16 @@ function generateInitialInputs( * @returns LContainer */ export function createLContainer( - hostNative: RElement | RComment, - hostTNode: TElementNode | TContainerNode | TElementContainerNode, currentView: LView, - native: RComment, isForViewContainerRef?: boolean): LContainer { + hostNative: RElement | RComment, currentView: LView, native: RComment, + isForViewContainerRef?: boolean): LContainer { return [ - isForViewContainerRef ? -1 : 0, // active index - [], // views - currentView, // parent - null, // next - null, // queries - hostNative, // host native - native, // native - getRenderParent(hostTNode, currentView) // renderParent + isForViewContainerRef ? -1 : 0, // active index + [], // views + currentView, // parent + null, // next + null, // queries + hostNative, // host native + native, // native ]; } @@ -1946,8 +1944,7 @@ function containerInternal( const comment = lView[RENDERER].createComment(ngDevMode ? 'container' : ''); ngDevMode && ngDevMode.rendererCreateComment++; const tNode = createNodeAtIndex(index, TNodeType.Container, comment, tagName, attrs); - const lContainer = lView[adjustedIndex] = - createLContainer(lView[adjustedIndex], tNode, lView, comment); + const lContainer = lView[adjustedIndex] = createLContainer(lView[adjustedIndex], lView, comment); appendChild(comment, tNode, lView); diff --git a/packages/core/src/render3/interfaces/container.ts b/packages/core/src/render3/interfaces/container.ts index a8378c2c9c..5978bb6e69 100644 --- a/packages/core/src/render3/interfaces/container.ts +++ b/packages/core/src/render3/interfaces/container.ts @@ -22,7 +22,6 @@ export const VIEWS = 1; // PARENT, NEXT, QUERIES, and HOST are indices 2, 3, 4, and 5. // As we already have these constants in LView, we don't need to re-create them. export const NATIVE = 6; -export const RENDER_PARENT = 7; // Because interfaces in TS/JS cannot be instanceof-checked this means that we // need to rely on predictable characteristics of data-structures to check if they // are what we expect for them to be. The `LContainer` interface code below has a @@ -30,7 +29,7 @@ export const RENDER_PARENT = 7; // below we can predictably gaurantee that we are dealing with an `LContainer` array. // This value MUST be kept up to date with the length of the `LContainer` array // interface below so that runtime type checking can work. -export const LCONTAINER_LENGTH = 8; +export const LCONTAINER_LENGTH = 7; /** * The state associated with a container. @@ -90,28 +89,6 @@ export interface LContainer extends Array { /** The comment element that serves as an anchor for this LContainer. */ [NATIVE]: RComment; - - /** - * Parent Element which will contain the location where all of the views will be - * inserted into to. - * - * If `renderParent` is `null` it is headless. This means that it is contained - * in another view which in turn is contained in another container and - * therefore it does not yet have its own parent. - * - * If `renderParent` is not `null` then it may be: - * - same as `tContainerNode.parent` in which case it is just a normal container. - * - different from `tContainerNode.parent` in which case it has been re-projected. - * In other words `tContainerNode.parent` is logical parent where as - * `tContainerNode.projectedParent` is render parent. - * - * When views are inserted into `LContainer` then `renderParent` is: - * - `null`, we are in a view, keep going up a hierarchy until actual - * `renderParent` is found. - * - not `null`, then use the `projectedParent.native` as the `RElement` to insert - * views into. - */ - [RENDER_PARENT]: RElement|null; } // Note: This hack is necessary so we don't erroneously get a circular dependency diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index 8c36b0d41d..0214e460d9 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -8,7 +8,7 @@ import {attachPatchData} from './context_discovery'; import {callHooks} from './hooks'; -import {LContainer, NATIVE, RENDER_PARENT, VIEWS, unusedValueExportToPlacateAjd as unused1} from './interfaces/container'; +import {LContainer, NATIVE, VIEWS, unusedValueExportToPlacateAjd as unused1} from './interfaces/container'; import {TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeFlags, TNodeType, TViewNode, unusedValueExportToPlacateAjd as unused2} from './interfaces/node'; import {unusedValueExportToPlacateAjd as unused3} from './interfaces/projection'; import {ProceduralRenderer3, RComment, RElement, RNode, RText, Renderer3, isProceduralRenderer, unusedValueExportToPlacateAjd as unused4} from './interfaces/renderer'; @@ -111,8 +111,6 @@ function walkTNodeTree( const lContainer = currentView ![tNode.index] as LContainer; executeNodeAction(action, renderer, renderParent, lContainer[NATIVE], beforeNode); - if (renderParent) lContainer[RENDER_PARENT] = renderParent; - if (lContainer[VIEWS].length) { currentView = lContainer[VIEWS][0]; nextTNode = currentView[TVIEW].node; @@ -487,7 +485,7 @@ function executeOnDestroys(view: LView): void { } } -export function getRenderParent(tNode: TNode, currentView: LView): RElement|null { +function getRenderParent(tNode: TNode, currentView: LView): RElement|null { if (canInsertNativeNode(tNode, currentView)) { // If we are asked for a render parent of the root component we need to do low-level DOM // operation as LTree doesn't exist above the topmost host node. We might need to find a render @@ -527,17 +525,7 @@ function canInsertNativeChildOfElement(tNode: TElementNode): boolean { * the container itself has its render parent determined. */ function canInsertNativeChildOfView(viewTNode: TViewNode, view: LView): boolean { - // Because we are inserting into a `View` the `View` may be disconnected. - const container = getLContainer(viewTNode, view) !; - if (container == null || container[RENDER_PARENT] == null) { - // The `View` is not inserted into a `Container` or the parent `Container` - // itself is disconnected. So we have to delay. - return false; - } - - // The parent `Container` is in inserted state, so we can eagerly insert into - // this location. - return true; + return getContainerRenderParent(viewTNode, view) != null; } /** @@ -558,7 +546,7 @@ function canInsertNativeChildOfView(viewTNode: TViewNode, view: LView): boolean * @param currentView Current LView being processed. * @return boolean Whether the node should be inserted now (or delayed until later). */ -export function canInsertNativeNode(tNode: TNode, currentView: LView): boolean { +function canInsertNativeNode(tNode: TNode, currentView: LView): boolean { // Nodes of the top-most view can be inserted eagerly if (isRootView(currentView)) { return true; @@ -723,8 +711,6 @@ export function appendProjectedNode( // logical container of the content projected views attachPatchData(native, projectionView); - const renderParent = getRenderParent(tProjectionNode, currentView); - const nodeOrContainer = projectionView[projectedTNode.index]; if (projectedTNode.type === TNodeType.Container) { // The node we are adding is a container and we are adding it to an element which @@ -732,7 +718,6 @@ export function appendProjectedNode( // Alternatively a container is projected at the root of a component's template // and can't be re-projected (as not content of any component). // Assign the final projection location in those cases. - nodeOrContainer[RENDER_PARENT] = renderParent; const views = nodeOrContainer[VIEWS]; for (let i = 0; i < views.length; i++) { addRemoveViewFromContainer(views[i], true, nodeOrContainer[NATIVE]); @@ -747,7 +732,6 @@ export function appendProjectedNode( } if (isLContainer(nodeOrContainer)) { - nodeOrContainer[RENDER_PARENT] = renderParent; appendChild(nodeOrContainer[NATIVE], tProjectionNode, currentView); } } diff --git a/packages/core/src/render3/view_engine_compatibility.ts b/packages/core/src/render3/view_engine_compatibility.ts index 038e11fbed..700188433f 100644 --- a/packages/core/src/render3/view_engine_compatibility.ts +++ b/packages/core/src/render3/view_engine_compatibility.ts @@ -317,7 +317,7 @@ export function createContainerRef( } hostView[hostTNode.index] = lContainer = - createLContainer(slotValue, hostTNode, hostView, commentNode, true); + createLContainer(slotValue, hostView, commentNode, true); addToViewTree(hostView, hostTNode.index as number, lContainer); } diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index 6cb2fd1fed..d86b3bb48e 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -110,9 +110,6 @@ { "name": "RENDERER_FACTORY" }, - { - "name": "RENDER_PARENT" - }, { "name": "SANITIZER" }, diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 2b31d126af..c2beaf4e8b 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -179,9 +179,6 @@ { "name": "RENDERER_FACTORY" }, - { - "name": "RENDER_PARENT" - }, { "name": "RecordViewTuple" },