diff --git a/packages/core/src/render3/component.ts b/packages/core/src/render3/component.ts index 427e00ad2c..96146c8335 100644 --- a/packages/core/src/render3/component.ts +++ b/packages/core/src/render3/component.ts @@ -229,7 +229,7 @@ export function createRootComponent( componentDef.contentQueries(RenderFlags.Create, component, rootLView.length - 1); } - const rootTNode = getPreviousOrParentTNode(); + const rootTNode = getPreviousOrParentTNode()!; if (tView.firstCreatePass && (componentDef.hostBindings !== null || componentDef.hostAttrs !== null)) { const elementIndex = rootTNode.index - HEADER_OFFSET; diff --git a/packages/core/src/render3/di_setup.ts b/packages/core/src/render3/di_setup.ts index 1fe5c98b44..b32d02a152 100644 --- a/packages/core/src/render3/di_setup.ts +++ b/packages/core/src/render3/di_setup.ts @@ -76,7 +76,7 @@ function resolveProvider( let token: any = isTypeProvider(provider) ? provider : resolveForwardRef(provider.provide); let providerFactory: () => any = providerToFactory(provider); - const tNode = getPreviousOrParentTNode(); + const tNode = getPreviousOrParentTNode()!; const beginIndex = tNode.providerIndexes & TNodeProviderIndexes.ProvidersStartIndexMask; const endIndex = tNode.directiveStart; const cptViewProvidersCount = diff --git a/packages/core/src/render3/i18n/i18n_parse.ts b/packages/core/src/render3/i18n/i18n_parse.ts index 3794965243..eae35d484a 100644 --- a/packages/core/src/render3/i18n/i18n_parse.ts +++ b/packages/core/src/render3/i18n/i18n_parse.ts @@ -70,7 +70,7 @@ export function i18nStartFirstPass( lView: LView, tView: TView, index: number, message: string, subTemplateIndex?: number) { const startIndex = tView.blueprint.length - HEADER_OFFSET; i18nVarsCount = 0; - const previousOrParentTNode = getPreviousOrParentTNode(); + const previousOrParentTNode = getPreviousOrParentTNode()!; const parentTNode = getIsParent() ? previousOrParentTNode : previousOrParentTNode && previousOrParentTNode.parent; let parentIndex = @@ -212,7 +212,7 @@ export function i18nStartFirstPass( */ export function i18nAttributesFirstPass( lView: LView, tView: TView, index: number, values: string[]) { - const previousElement = getPreviousOrParentTNode(); + const previousElement = getPreviousOrParentTNode()!; const previousElementIndex = previousElement.index - HEADER_OFFSET; const updateOpCodes: I18nUpdateOpCodes = []; if (ngDevMode) { diff --git a/packages/core/src/render3/instructions/di.ts b/packages/core/src/render3/instructions/di.ts index ce010ab126..739b28f977 100644 --- a/packages/core/src/render3/instructions/di.ts +++ b/packages/core/src/render3/instructions/di.ts @@ -59,7 +59,7 @@ export function ɵɵdirectiveInject( * @codeGenApi */ export function ɵɵinjectAttribute(attrNameToInject: string): string|null { - return injectAttributeImpl(getPreviousOrParentTNode(), attrNameToInject); + return injectAttributeImpl(getPreviousOrParentTNode()!, attrNameToInject); } /** diff --git a/packages/core/src/render3/instructions/element.ts b/packages/core/src/render3/instructions/element.ts index 8b12c8dde1..f72ce1155e 100644 --- a/packages/core/src/render3/instructions/element.ts +++ b/packages/core/src/render3/instructions/element.ts @@ -128,7 +128,7 @@ export function ɵɵelementStart( * @codeGenApi */ export function ɵɵelementEnd(): void { - let previousOrParentTNode = getPreviousOrParentTNode(); + let previousOrParentTNode = getPreviousOrParentTNode()!; ngDevMode && assertDefined(previousOrParentTNode, 'No parent node to close.'); if (getIsParent()) { setIsNotParent(); diff --git a/packages/core/src/render3/instructions/element_container.ts b/packages/core/src/render3/instructions/element_container.ts index f21b6c7d96..ad2c6faf7e 100644 --- a/packages/core/src/render3/instructions/element_container.ts +++ b/packages/core/src/render3/instructions/element_container.ts @@ -98,7 +98,7 @@ export function ɵɵelementContainerStart( * @codeGenApi */ export function ɵɵelementContainerEnd(): void { - let previousOrParentTNode = getPreviousOrParentTNode(); + let previousOrParentTNode = getPreviousOrParentTNode()!; const tView = getTView(); if (getIsParent()) { setIsNotParent(); diff --git a/packages/core/src/render3/instructions/listener.ts b/packages/core/src/render3/instructions/listener.ts index 37b8766724..7cd9d931bc 100644 --- a/packages/core/src/render3/instructions/listener.ts +++ b/packages/core/src/render3/instructions/listener.ts @@ -41,7 +41,7 @@ export function ɵɵlistener( eventTargetResolver?: GlobalTargetResolver): typeof ɵɵlistener { const lView = getLView(); const tView = getTView(); - const tNode = getPreviousOrParentTNode(); + const tNode = getPreviousOrParentTNode()!; listenerInternal( tView, lView, lView[RENDERER], tNode, eventName, listenerFn, useCapture, eventTargetResolver); return ɵɵlistener; @@ -71,7 +71,7 @@ export function ɵɵlistener( export function ɵɵsyntheticHostListener( eventName: string, listenerFn: (e?: any) => any, useCapture = false, eventTargetResolver?: GlobalTargetResolver): typeof ɵɵsyntheticHostListener { - const tNode = getPreviousOrParentTNode(); + const tNode = getPreviousOrParentTNode()!; const lView = getLView(); const tView = getTView(); const currentDef = getCurrentDirectiveDef(tView.data); diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index ef8c33973c..1d9d26b507 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -1125,7 +1125,7 @@ function logUnknownPropertyError(propName: string, tNode: TNode): void { * Instantiate a root component. */ export function instantiateRootComponent(tView: TView, lView: LView, def: ComponentDef): T { - const rootTNode = getPreviousOrParentTNode(); + const rootTNode = getPreviousOrParentTNode()!; if (tView.firstCreatePass) { if (def.providersResolver) def.providersResolver(def); generateExpandoInstructionBlock(tView, rootTNode, 1); diff --git a/packages/core/src/render3/query.ts b/packages/core/src/render3/query.ts index 3f135d8633..eb28a08744 100644 --- a/packages/core/src/render3/query.ts +++ b/packages/core/src/render3/query.ts @@ -504,7 +504,7 @@ export function ɵɵcontentQuery( directiveIndex: number, predicate: Type|InjectionToken|string[], descend: boolean, read?: any): void { contentQueryInternal( - getTView(), getLView(), predicate, descend, read, false, getPreviousOrParentTNode(), + getTView(), getLView(), predicate, descend, read, false, getPreviousOrParentTNode()!, directiveIndex); } @@ -524,7 +524,7 @@ export function ɵɵstaticContentQuery( directiveIndex: number, predicate: Type|InjectionToken|string[], descend: boolean, read?: any): void { contentQueryInternal( - getTView(), getLView(), predicate, descend, read, true, getPreviousOrParentTNode(), + getTView(), getLView(), predicate, descend, read, true, getPreviousOrParentTNode()!, directiveIndex); } diff --git a/packages/core/src/render3/state.ts b/packages/core/src/render3/state.ts index 5ef6bc0c88..23a7518312 100644 --- a/packages/core/src/render3/state.ts +++ b/packages/core/src/render3/state.ts @@ -54,8 +54,7 @@ interface LFrame { * * This is used in conjunction with `isParent`. */ - // FIXME(misko): should be `TNode|null` (add comment explaining it.) - previousOrParentTNode: TNode; + previousOrParentTNode: TNode|null; /** * If `isParent` is: @@ -263,7 +262,7 @@ export function ɵɵrestoreView(viewToRestore: OpaqueViewState) { instructionState.lFrame.contextLView = viewToRestore as any as LView; } -export function getPreviousOrParentTNode(): TNode { +export function getPreviousOrParentTNode(): TNode|null { return instructionState.lFrame.previousOrParentTNode; } @@ -441,20 +440,20 @@ function allocLFrame() { function createLFrame(parent: LFrame|null): LFrame { const lFrame: LFrame = { - previousOrParentTNode: null!, // - isParent: true, // - lView: null!, // - tView: null!, // - selectedIndex: 0, // - contextLView: null!, // - elementDepthCount: 0, // - currentNamespace: null, // - currentDirectiveIndex: -1, // - bindingRootIndex: -1, // - bindingIndex: -1, // - currentQueryIndex: 0, // - parent: parent!, // - child: null, // + previousOrParentTNode: null, // + isParent: true, // + lView: null!, // + tView: null!, // + selectedIndex: 0, // + contextLView: null!, // + elementDepthCount: 0, // + currentNamespace: null, // + currentDirectiveIndex: -1, // + bindingRootIndex: -1, // + bindingIndex: -1, // + currentQueryIndex: 0, // + parent: parent!, // + child: null, // }; parent !== null && (parent.child = lFrame); // link the new LFrame for reuse. return lFrame; diff --git a/packages/core/src/render3/view_engine_compatibility.ts b/packages/core/src/render3/view_engine_compatibility.ts index 2695714cc3..61058178c7 100644 --- a/packages/core/src/render3/view_engine_compatibility.ts +++ b/packages/core/src/render3/view_engine_compatibility.ts @@ -43,7 +43,7 @@ import { ViewRef } from './view_ref'; */ export function injectElementRef(ElementRefToken: typeof ViewEngine_ElementRef): ViewEngine_ElementRef { - return createElementRef(ElementRefToken, getPreviousOrParentTNode(), getLView()); + return createElementRef(ElementRefToken, getPreviousOrParentTNode()!, getLView()); } let R3ElementRef: {new (native: RElement|RComment): ViewEngine_ElementRef}; @@ -79,7 +79,7 @@ export function injectTemplateRef( TemplateRefToken: typeof ViewEngine_TemplateRef, ElementRefToken: typeof ViewEngine_ElementRef): ViewEngine_TemplateRef|null { return createTemplateRef( - TemplateRefToken, ElementRefToken, getPreviousOrParentTNode(), getLView()); + TemplateRefToken, ElementRefToken, getPreviousOrParentTNode()!, getLView()); } /** @@ -407,7 +407,7 @@ export function createContainerRef( /** Returns a ChangeDetectorRef (a.k.a. a ViewRef) */ export function injectChangeDetectorRef(isPipe = false): ViewEngine_ChangeDetectorRef { - return createViewRef(getPreviousOrParentTNode(), getLView(), isPipe); + return createViewRef(getPreviousOrParentTNode()!, getLView(), isPipe); } /** @@ -453,7 +453,7 @@ export function injectRenderer2(): Renderer2 { // We need the Renderer to be based on the component that it's being injected into, however since // DI happens before we've entered its view, `getLView` will return the parent view instead. const lView = getLView(); - const tNode = getPreviousOrParentTNode(); + const tNode = getPreviousOrParentTNode()!; const nodeAtIndex = getComponentLViewByIndex(tNode.index, lView); return getOrCreateRenderer2(isLView(nodeAtIndex) ? nodeAtIndex : lView); }