Skip to content

Commit 802397d

Browse files
pkozlowski-opensourcealxhub
authored andcommitted
refactor(core): reuse element end first creation pass (#59843)
Reuse element end first creation pass in ComponentRef impl. PR Close #59843
1 parent 724885b commit 802397d

File tree

14 files changed

+28
-13
lines changed

14 files changed

+28
-13
lines changed

packages/core/src/render3/component_ref.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ import {executeContentQueries} from './queries/query_execution';
7979
import {enterView, leaveView} from './state';
8080
import {debugStringifyTypeForError, stringifyForError} from './util/stringify_utils';
8181
import {getComponentLViewByIndex, getTNode} from './util/view_utils';
82-
import {elementStartFirstCreatePass} from './view/elements';
82+
import {elementEndFirstCreatePass, elementStartFirstCreatePass} from './view/elements';
8383
import {ViewRef} from './view_ref';
8484

8585
export class ComponentFactoryResolver extends AbstractComponentFactoryResolver {
@@ -346,6 +346,8 @@ export class ComponentFactory<T> extends AbstractComponentFactory<T> {
346346
0,
347347
);
348348

349+
// ---- element instruction
350+
349351
// TODO(crisbeto): in practice `hostRNode` should always be defined, but there are some
350352
// tests where the renderer is mocked out and `undefined` is returned. We should update the
351353
// tests so that this check can be removed.
@@ -358,8 +360,7 @@ export class ComponentFactory<T> extends AbstractComponentFactory<T> {
358360
createDirectivesInstances(rootTView, rootLView, hostTNode);
359361
executeContentQueries(rootTView, hostTNode, rootLView);
360362

361-
// TODO(pk): code / logic duplication with the elementEnd and similar instructions
362-
registerPostOrderHooks(rootTView, hostTNode);
363+
elementEndFirstCreatePass(rootTView, hostTNode);
363364

364365
if (projectableNodes !== undefined) {
365366
projectNodes(hostTNode, this.ngContentSelectors, projectableNodes);

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ import {
6161
setCurrentTNodeAsNotParent,
6262
wasLastNodeCreated,
6363
} from '../state';
64-
import {elementStartFirstCreatePass} from '../view/elements';
64+
import {elementEndFirstCreatePass, elementStartFirstCreatePass} from '../view/elements';
6565

6666
import {validateElementIsKnown} from './element_validation';
6767
import {setDirectiveInputsWhichShadowsStyling} from './property';
@@ -182,10 +182,7 @@ export function ɵɵelementEnd(): typeof ɵɵelementEnd {
182182

183183
const tView = getTView();
184184
if (tView.firstCreatePass) {
185-
registerPostOrderHooks(tView, currentTNode);
186-
if (isContentQueryHost(currentTNode)) {
187-
tView.queries!.elementEnd(currentTNode);
188-
}
185+
elementEndFirstCreatePass(tView, tNode);
189186
}
190187

191188
if (tNode.classesWithoutHost != null && hasClassInput(tNode)) {

packages/core/src/render3/view/elements.ts

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

99
import {assertFirstCreatePass} from '../assert';
10-
import {TAttributes, TNodeType, type TElementNode} from '../interfaces/node';
10+
import {registerPostOrderHooks} from '../hooks';
11+
import {TAttributes, TNode, TNodeType, type TElementNode} from '../interfaces/node';
12+
import {isContentQueryHost} from '../interfaces/type_checks';
1113
import type {LView, TView} from '../interfaces/view';
1214
import {computeStaticStyling} from '../styling/static_styling';
1315
import {getOrCreateTNode} from '../tnode_manipulation';
@@ -59,3 +61,11 @@ export function elementStartFirstCreatePass(
5961

6062
return tNode;
6163
}
64+
65+
export function elementEndFirstCreatePass(tView: TView, tNode: TNode) {
66+
ngDevMode && assertFirstCreatePass(tView);
67+
registerPostOrderHooks(tView, tNode);
68+
if (isContentQueryHost(tNode)) {
69+
tView.queries!.elementEnd(tNode);
70+
}
71+
}

packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@
275275
"detectChangesInternal",
276276
"diPublicInInjector",
277277
"documentElement",
278+
"elementEndFirstCreatePass",
278279
"elementStartFirstCreatePass",
279280
"enterDI",
280281
"enterView",
@@ -430,7 +431,6 @@
430431
"producerUpdateValueVersion",
431432
"refreshContentQueries",
432433
"refreshView",
433-
"registerPostOrderHooks",
434434
"rememberChangeHistoryAndInvokeOnChangesHook",
435435
"remove",
436436
"removeClass",

packages/core/test/bundling/animations/bundle.golden_symbols.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@
296296
"detectChangesInternal",
297297
"diPublicInInjector",
298298
"documentElement",
299+
"elementEndFirstCreatePass",
299300
"elementStartFirstCreatePass",
300301
"enterDI",
301302
"enterView",
@@ -456,7 +457,6 @@
456457
"producerUpdateValueVersion",
457458
"refreshContentQueries",
458459
"refreshView",
459-
"registerPostOrderHooks",
460460
"rememberChangeHistoryAndInvokeOnChangesHook",
461461
"remove",
462462
"removeClass",

packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@
227227
"detectChangesInViewIfRequired",
228228
"detectChangesInternal",
229229
"diPublicInInjector",
230+
"elementEndFirstCreatePass",
230231
"elementStartFirstCreatePass",
231232
"enterDI",
232233
"enterView",
@@ -370,7 +371,6 @@
370371
"producerUpdateValueVersion",
371372
"refreshContentQueries",
372373
"refreshView",
373-
"registerPostOrderHooks",
374374
"rememberChangeHistoryAndInvokeOnChangesHook",
375375
"remove",
376376
"removeElements",

packages/core/test/bundling/defer/bundle.golden_symbols.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@
276276
"detectChangesInViewIfRequired",
277277
"detectChangesInternal",
278278
"diPublicInInjector",
279+
"elementEndFirstCreatePass",
279280
"elementStartFirstCreatePass",
280281
"enterDI",
281282
"enterView",

packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@
329329
"detectChangesInViewIfRequired",
330330
"detectChangesInternal",
331331
"diPublicInInjector",
332+
"elementEndFirstCreatePass",
332333
"elementStartFirstCreatePass",
333334
"enterDI",
334335
"enterView",

packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@
317317
"detectChangesInViewIfRequired",
318318
"detectChangesInternal",
319319
"diPublicInInjector",
320+
"elementEndFirstCreatePass",
320321
"elementPropertyInternal",
321322
"elementStartFirstCreatePass",
322323
"enterDI",

packages/core/test/bundling/hello_world/bundle.golden_symbols.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@
249249
"isApplicationBootstrapConfig",
250250
"isComponentDef",
251251
"isComponentHost",
252+
"isContentQueryHost",
252253
"isDestroyed",
253254
"isDetachedByI18n",
254255
"isEnvironmentProviders",

0 commit comments

Comments
 (0)