Skip to content

Commit 1123b31

Browse files
refactor(core): consolidate TNode creation checks (angular#61563)
This change de-duplicates code executed during TNode creation and reponsible for asserting a TNode index. PR Close angular#61563
1 parent a5a18ae commit 1123b31

5 files changed

Lines changed: 34 additions & 33 deletions

File tree

packages/core/src/render3/assert.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,14 @@
77
*/
88

99
import {RuntimeError, RuntimeErrorCode} from '../errors';
10-
import {assertDefined, assertEqual, assertNumber, throwError} from '../util/assert';
10+
import {
11+
assertDefined,
12+
assertEqual,
13+
assertIndexInRange,
14+
assertLessThan,
15+
assertNumber,
16+
throwError,
17+
} from '../util/assert';
1118

1219
import {getComponentDef, getNgModuleDef} from './def_getters';
1320
import {LContainer} from './interfaces/container';
@@ -34,6 +41,16 @@ export function assertTNodeForLView(tNode: TNode, lView: LView) {
3441
assertTNodeForTView(tNode, lView[TVIEW]);
3542
}
3643

44+
export function assertTNodeCreationIndex(lView: LView, index: number) {
45+
const adjustedIndex = index + HEADER_OFFSET;
46+
assertIndexInRange(lView, adjustedIndex);
47+
assertLessThan(
48+
adjustedIndex,
49+
lView[TVIEW].bindingStartIndex,
50+
'TNodes should be created before any bindings',
51+
);
52+
}
53+
3754
export function assertTNodeForTView(tNode: TNode, tView: TView) {
3855
assertTNode(tNode);
3956
const tData = tView.data;

packages/core/src/render3/instructions/element.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,17 @@ import {
2323
markRNodeAsSkippedByHydration,
2424
setSegmentHead,
2525
} from '../../hydration/utils';
26-
import {assertDefined, assertEqual} from '../../util/assert';
26+
import {assertDefined} from '../../util/assert';
27+
import {assertTNodeCreationIndex} from '../assert';
2728
import {clearElementContents, createElementNode} from '../dom_node_manipulation';
2829
import {hasClassInput, hasStyleInput, TNode, TNodeType} from '../interfaces/node';
2930
import {RElement} from '../interfaces/renderer_dom';
30-
import {isComponentHost, isDirectiveHost} from '../interfaces/type_checks';
31-
import {HYDRATION, LView, RENDERER, TView} from '../interfaces/view';
31+
import {isComponentHost} from '../interfaces/type_checks';
32+
import {HYDRATION, LView, RENDERER, TVIEW, TView} from '../interfaces/view';
3233
import {assertTNodeType} from '../node_assert';
3334
import {
3435
decreaseElementDepthCount,
3536
enterSkipHydrationBlock,
36-
getBindingIndex,
3737
getBindingsEnabled,
3838
getCurrentTNode,
3939
getLView,
@@ -70,13 +70,9 @@ export function ɵɵelementStart(
7070
localRefsIndex?: number,
7171
): typeof ɵɵelementStart {
7272
const lView = getLView();
73-
const tView = getTView();
74-
ngDevMode &&
75-
assertEqual(
76-
getBindingIndex(),
77-
tView.bindingStartIndex,
78-
'elements should be created before any bindings',
79-
);
73+
74+
ngDevMode && assertTNodeCreationIndex(lView, index);
75+
8076
const tNode = elementLikeStartShared(
8177
lView,
8278
index,
@@ -88,7 +84,7 @@ export function ɵɵelementStart(
8884
localRefsIndex,
8985
);
9086

91-
if (ngDevMode && tView.firstCreatePass) {
87+
if (ngDevMode && lView[TVIEW].firstCreatePass) {
9288
validateElementIsKnown(lView, tNode);
9389
}
9490

packages/core/src/render3/instructions/element_container.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ import {
1313
markRNodeAsClaimedByHydration,
1414
setSegmentHead,
1515
} from '../../hydration/utils';
16-
import {assertDefined, assertEqual, assertNumber} from '../../util/assert';
16+
import {assertDefined, assertEqual, assertLessThan, assertNumber} from '../../util/assert';
17+
import {assertTNodeCreationIndex} from '../assert';
1718
import {createCommentNode} from '../dom_node_manipulation';
1819
import {TNode, TNodeType} from '../interfaces/node';
1920
import {RComment} from '../interfaces/renderer_dom';
20-
import {HYDRATION, LView, RENDERER, TView} from '../interfaces/view';
21+
import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TVIEW, TView} from '../interfaces/view';
2122
import {assertTNodeType} from '../node_assert';
2223
import {
2324
getBindingIndex,
@@ -50,13 +51,7 @@ export function ɵɵelementContainerStart(
5051
localRefsIndex?: number,
5152
): typeof ɵɵelementContainerStart {
5253
const lView = getLView();
53-
const tView = getTView();
54-
ngDevMode &&
55-
assertEqual(
56-
getBindingIndex(),
57-
tView.bindingStartIndex,
58-
'element containers should be created before any bindings',
59-
);
54+
ngDevMode && assertTNodeCreationIndex(lView, index);
6055
elementLikeStartShared(
6156
lView,
6257
index,

packages/core/src/render3/instructions/shared.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,6 @@ export function elementLikeStartShared(
583583
localRefsIndex: number | undefined,
584584
) {
585585
const adjustedIndex = HEADER_OFFSET + index;
586-
ngDevMode && assertIndexInRange(lView, adjustedIndex);
587586

588587
const tView = lView[TVIEW];
589588
const tNode = tView.firstCreatePass

packages/core/src/render3/instructions/text.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
import {validateMatchingNode} from '../../hydration/error_handling';
99
import {locateNextRNode} from '../../hydration/node_lookup_utils';
1010
import {canHydrateNode, markRNodeAsClaimedByHydration} from '../../hydration/utils';
11-
import {assertEqual, assertIndexInRange} from '../../util/assert';
11+
import {assertIndexInRange} from '../../util/assert';
12+
import {assertTNodeCreationIndex} from '../assert';
13+
import {createTextNode} from '../dom_node_manipulation';
1214
import {TElementNode, TNode, TNodeType} from '../interfaces/node';
1315
import {RText} from '../interfaces/renderer_dom';
1416
import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view';
1517
import {appendChild} from '../node_manipulation';
16-
import {createTextNode} from '../dom_node_manipulation';
1718
import {
18-
getBindingIndex,
1919
getLView,
2020
getTView,
2121
lastNodeWasCreated,
@@ -37,13 +37,7 @@ export function ɵɵtext(index: number, value: string = ''): void {
3737
const tView = getTView();
3838
const adjustedIndex = index + HEADER_OFFSET;
3939

40-
ngDevMode &&
41-
assertEqual(
42-
getBindingIndex(),
43-
tView.bindingStartIndex,
44-
'text nodes should be created before any bindings',
45-
);
46-
ngDevMode && assertIndexInRange(lView, adjustedIndex);
40+
ngDevMode && assertTNodeCreationIndex(lView, index);
4741

4842
const tNode = tView.firstCreatePass
4943
? getOrCreateTNode(tView, adjustedIndex, TNodeType.Text, value, null)

0 commit comments

Comments
 (0)