Skip to content

Commit b472b00

Browse files
committed
Clean up implementation
1 parent 33d130e commit b472b00

File tree

4 files changed

+38
-39
lines changed

4 files changed

+38
-39
lines changed

packages/@glimmer-workspace/integration-tests/test/debug-render-tree-test.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ class DebugRenderTreeTest extends RenderTest {
313313
args: { positional: [this.element.firstChild], named: {} },
314314
instance: (instance: GlimmerishComponent) => instance === null,
315315
template: null,
316-
bounds: this.nodeBounds(this.element.firstChild!.firstChild, this.element),
316+
bounds: this.elementBounds(this.element.firstChild! as unknown as Element),
317317
children: [
318318
{
319319
type: 'component',
@@ -519,12 +519,12 @@ class DebugRenderTreeTest extends RenderTest {
519519
assert.deepEqual(this.delegate.getCapturedRenderTree(), [], 'there was no output');
520520
}
521521

522-
nodeBounds(_node: SimpleNode | null, parent?: SimpleNode): CapturedBounds {
522+
nodeBounds(_node: SimpleNode | null): CapturedBounds {
523523
let node = expect(_node, 'BUG: Expected node');
524524

525525
return {
526526
parentElement: expect(
527-
parent || node.parentNode,
527+
node.parentNode,
528528
'BUG: detached node'
529529
) as unknown as SimpleNode as SimpleElement,
530530
firstNode: node as unknown as SimpleNode,

packages/@glimmer/interfaces/lib/dom/attributes.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ export interface DOMStack {
3737
element: SimpleElement,
3838
guid: string,
3939
insertBefore: Maybe<SimpleNode>
40-
): Nullable<RemoteLiveBlock>;
41-
popRemoteElement(): void;
40+
): RemoteLiveBlock;
41+
popRemoteElement(): RemoteLiveBlock;
4242
popElement(): void;
4343
openElement(tag: string, _operations?: ElementOperations): SimpleElement;
4444
flushElement(modifiers: Nullable<ModifierInstance[]>): void;

packages/@glimmer/runtime/lib/compiled/opcodes/dom.ts

+29-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
CheckOption,
2020
CheckString,
2121
} from '@glimmer/debug';
22-
import { associateDestroyableChild, destroy } from '@glimmer/destroyable';
22+
import { associateDestroyableChild, destroy, registerDestructor } from '@glimmer/destroyable';
2323
import { getInternalModifierManager } from '@glimmer/manager';
2424
import { createComputeRef, isConstRef, valueForRef } from '@glimmer/reference';
2525
import { debugToString, expect, isObject } from '@glimmer/util';
@@ -32,6 +32,7 @@ import type { DynamicAttribute } from '../../vm/attributes/dynamic';
3232
import { isCurriedType, resolveCurriedValue } from '../../curried-value';
3333
import { APPEND_OPCODES } from '../../opcodes';
3434
import { CONSTANTS } from '../../symbols';
35+
import { createCapturedArgs } from '../../vm/arguments';
3536
import { CheckArguments, CheckOperations, CheckReference } from './-debug-strip';
3637
import { Assert } from './vm';
3738

@@ -71,10 +72,36 @@ APPEND_OPCODES.add(Op.PushRemoteElement, (vm) => {
7172

7273
let block = vm.elements().pushRemoteElement(element, guid, insertBefore);
7374
if (block) vm.associateDestroyable(block);
75+
76+
if (vm.env.debugRenderTree !== undefined) {
77+
// Note that there is nothing to update – when the args for an
78+
// {{#in-element}} changes it gets torn down and a new one is
79+
// re-created/rendered in its place (see the `Assert`s above)
80+
let args = createCapturedArgs(
81+
insertBefore === undefined ? {} : { insertBefore: insertBeforeRef },
82+
[elementRef]
83+
);
84+
85+
vm.env.debugRenderTree.create(block, {
86+
type: 'keyword',
87+
name: 'in-element',
88+
args,
89+
instance: null,
90+
});
91+
92+
registerDestructor(block, () => {
93+
vm.env.debugRenderTree?.willDestroy(block);
94+
});
95+
}
7496
});
7597

7698
APPEND_OPCODES.add(Op.PopRemoteElement, (vm) => {
77-
vm.elements().popRemoteElement();
99+
let bounds = vm.elements().popRemoteElement();
100+
101+
if (vm.env.debugRenderTree !== undefined) {
102+
// The RemoteLiveBlock is also its bounds
103+
vm.env.debugRenderTree.didRender(bounds, bounds);
104+
}
78105
});
79106

80107
APPEND_OPCODES.add(Op.FlushElement, (vm) => {

packages/@glimmer/runtime/lib/vm/element-builder.ts

+4-32
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type {
22
AttrNamespace,
33
Bounds,
4-
CapturedArguments,
54
Cursor,
65
CursorStackSymbol,
76
ElementBuilder,
@@ -13,7 +12,6 @@ import type {
1312
Maybe,
1413
ModifierInstance,
1514
Nullable,
16-
Reference,
1715
SimpleComment,
1816
SimpleDocumentFragment,
1917
SimpleElement,
@@ -22,7 +20,6 @@ import type {
2220
UpdatableBlock,
2321
} from '@glimmer/interfaces';
2422
import { destroy, registerDestructor } from '@glimmer/destroyable';
25-
import { createConstRef } from '@glimmer/reference';
2623
import { assert, expect, Stack } from '@glimmer/util';
2724

2825
import type { DynamicAttribute } from './attributes/dynamic';
@@ -217,26 +214,7 @@ export class NewElementBuilder implements ElementBuilder {
217214
guid: string,
218215
insertBefore: Maybe<SimpleNode>
219216
): RemoteLiveBlock {
220-
const block = this.__pushRemoteElement(element, guid, insertBefore);
221-
if (this.env.debugRenderTree) {
222-
const namedArgs: Record<string, Reference> = {};
223-
if (insertBefore !== undefined) {
224-
namedArgs['insertBefore'] = createConstRef(insertBefore, false);
225-
}
226-
this.env.debugRenderTree.create(block, {
227-
type: 'keyword',
228-
name: 'in-element',
229-
args: {
230-
named: namedArgs,
231-
positional: [createConstRef(element, false)],
232-
} as CapturedArguments,
233-
instance: null,
234-
});
235-
registerDestructor(block, () => {
236-
this.env.debugRenderTree?.willDestroy(block);
237-
});
238-
}
239-
return block;
217+
return this.__pushRemoteElement(element, guid, insertBefore);
240218
}
241219

242220
__pushRemoteElement(
@@ -257,17 +235,11 @@ export class NewElementBuilder implements ElementBuilder {
257235
return this.pushLiveBlock(block, true);
258236
}
259237

260-
popRemoteElement(): void {
238+
popRemoteElement(): RemoteLiveBlock {
261239
const block = this.popBlock();
240+
assert(block instanceof RemoteLiveBlock, '[BUG] expecting a RemoteLiveBlock');
262241
this.popElement();
263-
const parentElement = this.element;
264-
if (this.env.debugRenderTree) {
265-
this.env.debugRenderTree?.didRender(block, {
266-
parentElement: () => parentElement,
267-
firstNode: () => block.firstNode(),
268-
lastNode: () => block.lastNode(),
269-
});
270-
}
242+
return block;
271243
}
272244

273245
protected pushElement(element: SimpleElement, nextSibling: Maybe<SimpleNode> = null): void {

0 commit comments

Comments
 (0)