@@ -20,6 +20,7 @@ import type {
20
20
UpdatableBlock ,
21
21
} from '@glimmer/interfaces' ;
22
22
import { destroy , registerDestructor } from '@glimmer/destroyable' ;
23
+ import { createUnboundRef , REFERENCE } from '@glimmer/reference' ;
23
24
import { assert , expect , Stack } from '@glimmer/util' ;
24
25
25
26
import type { DynamicAttribute } from './attributes/dynamic' ;
@@ -83,6 +84,7 @@ export class NewElementBuilder implements ElementBuilder {
83
84
[ CURSOR_STACK ] = new Stack < Cursor > ( ) ;
84
85
private modifierStack = new Stack < Nullable < ModifierInstance [ ] > > ( ) ;
85
86
private blockStack = new Stack < LiveBlock > ( ) ;
87
+ private htmlElementsState : { shouldAddHtmlElement ?: boolean } [ ] ;
86
88
87
89
static forInitialRender ( env : Environment , cursor : CursorImpl ) {
88
90
return new this ( env , cursor . element , cursor . nextSibling ) . initialize ( ) ;
@@ -196,8 +198,8 @@ export class NewElementBuilder implements ElementBuilder {
196
198
this . constructing = null ;
197
199
this . operations = null ;
198
200
199
- this . pushModifiers ( modifiers ) ;
200
201
this . pushElement ( element , null ) ;
202
+ this . pushModifiers ( modifiers ) ;
201
203
this . didOpenElement ( element ) ;
202
204
}
203
205
@@ -207,12 +209,13 @@ export class NewElementBuilder implements ElementBuilder {
207
209
208
210
closeElement ( ) : Nullable < ModifierInstance [ ] > {
209
211
const htmlState = this . htmlElementsState . pop ( ) ;
210
- if ( htmlState . shouldAddHtmlElement ) {
212
+ if ( htmlState ?. shouldAddHtmlElement ) {
213
+ const element = this . element ;
211
214
this . env . debugRenderTree ?. didRender ( htmlState , {
212
- parentElement : ( ) => element . parentElement ,
213
- firstNode : ( ) => element ,
214
- lastNode : ( ) => element ,
215
- } ) ;
215
+ parentElement : ( ) => ( element as any ) . parentElement ,
216
+ firstNode : ( ) => element ,
217
+ lastNode : ( ) => element ,
218
+ } ) ;
216
219
}
217
220
this . willCloseElement ( ) ;
218
221
this . popElement ( ) ;
@@ -257,35 +260,50 @@ export class NewElementBuilder implements ElementBuilder {
257
260
private pushModifiers ( modifiers : Nullable < ModifierInstance [ ] > ) : void {
258
261
this . modifierStack . push ( modifiers ) ;
259
262
if ( this . env . debugRenderTree ) {
260
- modifiers = modifiers || [ ]
261
- const htmlState = { } ;
263
+ modifiers = modifiers || [ ] ;
264
+ const htmlState = {
265
+ shouldAddHtmlElement :
266
+ modifiers . length || ( globalThis as any ) . ENV_DEBUG_RENDER_TREE_ALL_ELEMENTS ,
267
+ } ;
262
268
this . htmlElementsState . push ( htmlState ) ;
263
- const shouldAddHtmlElement = modifiers . length || globalThis . ENV_DEBUG_RENDER_TREE_ALL_ELEMENTS
264
- htmlState . shouldAddHtmlElement = shouldAddHtmlElement ;
265
- if ( shouldAddHtmlElement ) {
269
+ if ( htmlState . shouldAddHtmlElement ) {
266
270
this . env . debugRenderTree ?. create ( htmlState , {
267
271
type : 'html-element' ,
268
- name : this . element . localName ,
272
+ name : this . element . tagName . toLowerCase ( ) ,
269
273
args : {
270
- named : this . element . attrs ,
271
- positional : [ ]
272
- } ,
273
- instance : delegate
274
+ named : { } ,
275
+ positional : [ ] ,
276
+ } as any ,
277
+ instance : this . element ,
274
278
} ) ;
275
279
}
276
280
for ( const modifier of modifiers ) {
277
281
const state = { } ;
278
- const name = modifier . definition . resolvedName ;
279
- const delegate = modifier . manager . componentManagerDelegates . get ( this . env . owner ) ;
280
- const element = modifier . state . element ;
282
+ const name = modifier . definition . resolvedName || 'unknown-modifier' ;
283
+ const instance = ( modifier . state as any ) . instance || ( modifier . state as any ) . delegate ;
284
+ const element = this . element ;
285
+ const args : any = {
286
+ positional : [ ] ,
287
+ named : { } ,
288
+ } ;
289
+ for ( const value of ( modifier . state as any ) . args . positional ) {
290
+ if ( value && value [ REFERENCE ] ) {
291
+ args . positional . push ( value ) ;
292
+ } else {
293
+ args . positional . push ( createUnboundRef ( value , false ) ) ;
294
+ }
295
+ }
296
+ for ( const [ key , value ] of Object . entries ( ( modifier . state as any ) ?. args . named ) ) {
297
+ args . named [ key ] = createUnboundRef ( value , false ) ;
298
+ }
281
299
this . env . debugRenderTree ?. create ( state , {
282
300
type : 'modifier' ,
283
301
name,
284
- args : modifier . state . args ,
285
- instance : delegate
302
+ args : args ,
303
+ instance,
286
304
} ) ;
287
305
this . env . debugRenderTree ?. didRender ( state , {
288
- parentElement : ( ) => element . parentElement ,
306
+ parentElement : ( ) => ( element as any ) . parentElement ,
289
307
firstNode : ( ) => element ,
290
308
lastNode : ( ) => element ,
291
309
} ) ;
0 commit comments