@@ -314,11 +314,7 @@ export default class RenderTree {
314
314
this . _reset ( ) ;
315
315
316
316
this . tree = captureRenderTree ( this . owner ) ;
317
- let serialized = this . _serializeRenderNodes ( this . tree ) ;
318
-
319
- this . _releaseStaleObjects ( ) ;
320
-
321
- return serialized ;
317
+ return this . _createSimpleNodes ( this . tree ) ;
322
318
}
323
319
324
320
/**
@@ -540,7 +536,7 @@ export default class RenderTree {
540
536
} ;
541
537
const idx = parentNode . children . indexOf ( node ) ;
542
538
parentNode . children . splice ( idx , 0 , htmlNode ) ;
543
- return this . _serializeRenderNode ( htmlNode , parentNode ) ;
539
+ return this . _createSimpleNode ( htmlNode , parentNode ) ;
544
540
}
545
541
546
542
_serializeRenderNodes ( nodes , parentNode = null ) {
@@ -552,14 +548,66 @@ export default class RenderTree {
552
548
return mapped ;
553
549
}
554
550
555
- _serializeRenderNode ( node , parentNode = null ) {
551
+ _createSimpleNode ( node , parentNode ) {
556
552
if ( ! node . id . startsWith ( this . renderNodeIdPrefix ) ) {
557
553
node . id = `${ this . renderNodeIdPrefix } -${ node . id } ` ;
558
554
}
555
+
556
+ this . nodes [ node . id ] = node ;
557
+ this . parentNodes [ node . id ] = parentNode ;
558
+
559
+ if ( node . type === 'modifier' ) {
560
+ if ( parentNode . instance !== node . bounds . firstNode ) {
561
+ return this . _insertHtmlElementNode ( node , parentNode ) ;
562
+ }
563
+ }
564
+
565
+ if ( node . type === 'html-element' ) {
566
+ // show set attributes in inspector
567
+ Array . from ( node . instance . attributes ) . forEach ( ( attr ) => {
568
+ node . args . named [ attr . nodeName ] = attr . nodeValue ;
569
+ } ) ;
570
+ // move modifiers and components into the element children
571
+ parentNode . children . forEach ( ( child ) => {
572
+ if (
573
+ child . bounds . parentElement === node . instance ||
574
+ ( child . type === 'modifier' &&
575
+ child . bounds . firstNode === node . instance )
576
+ ) {
577
+ node . children . push ( child ) ;
578
+ }
579
+ } ) ;
580
+ node . children . forEach ( ( child ) => {
581
+ const idx = parentNode . children . indexOf ( child ) ;
582
+ if ( idx >= 0 ) {
583
+ parentNode . children . splice ( idx , 1 ) ;
584
+ }
585
+ } ) ;
586
+ }
587
+
588
+ return {
589
+ id : node . id ,
590
+ type : node . type ,
591
+ name : node . name ,
592
+ children : this . _createSimpleNodes ( node . children , node ) ,
593
+ } ;
594
+ }
595
+
596
+ _createSimpleNodes ( nodes , parentNode = null ) {
597
+ const mapped = [ ] ;
598
+ // nodes can be mutated during serialize, which is why we use indexing instead of .map
599
+ for ( let i = 0 ; i < nodes . length ; i ++ ) {
600
+ mapped . push ( this . _createSimpleNode ( nodes [ i ] , parentNode ) ) ;
601
+ }
602
+ return mapped ;
603
+ }
604
+
605
+ _serializeRenderNode ( nodeId ) {
606
+ const node = this . nodes [ nodeId ] ;
607
+ if ( ! node ) return null ;
559
608
let serialized = this . serialized [ node . id ] ;
560
609
561
610
if ( serialized === undefined ) {
562
- this . nodes [ node . id ] = node ;
563
611
if ( node . type === 'keyword' ) {
564
612
node . type = 'component' ;
565
613
this . inElementSupport ?. nodeMap . set ( node , node . id ) ;
@@ -586,33 +634,6 @@ export default class RenderTree {
586
634
} ) ;
587
635
}
588
636
589
- if ( parentNode ) {
590
- this . parentNodes [ node . id ] = parentNode ;
591
- }
592
-
593
- if ( node . type === 'html-element' ) {
594
- // show set attributes in inspector
595
- Array . from ( node . instance . attributes ) . forEach ( ( attr ) => {
596
- node . args . named [ attr . nodeName ] = attr . nodeValue ;
597
- } ) ;
598
- // move modifiers and components into the element children
599
- parentNode . children . forEach ( ( child ) => {
600
- if (
601
- child . bounds . parentElement === node . instance ||
602
- ( child . type === 'modifier' &&
603
- child . bounds . firstNode === node . instance )
604
- ) {
605
- node . children . push ( child ) ;
606
- }
607
- } ) ;
608
- node . children . forEach ( ( child ) => {
609
- const idx = parentNode . children . indexOf ( child ) ;
610
- if ( idx >= 0 ) {
611
- parentNode . children . splice ( idx , 1 ) ;
612
- }
613
- } ) ;
614
- }
615
-
616
637
if ( node . type === 'component' && ! node . instance ) {
617
638
node . instance = this . _createSimpleInstance (
618
639
'TemplateOnlyComponent' ,
@@ -624,18 +645,15 @@ export default class RenderTree {
624
645
node . instance =
625
646
node . instance || this . _createSimpleInstance ( node . name , node . args ) ;
626
647
node . instance . toString = ( ) => node . name ;
627
- if ( parentNode . instance !== node . bounds . firstNode ) {
628
- return this . _insertHtmlElementNode ( node , parentNode ) ;
629
- }
630
648
}
631
649
632
650
this . serialized [ node . id ] = serialized = {
633
651
...node ,
634
652
args : this . _serializeArgs ( node . args ) ,
635
653
instance : this . _serializeItem ( node . instance ) ,
636
654
bounds : this . _serializeBounds ( node . bounds ) ,
637
- children : this . _serializeRenderNodes ( node . children , node ) ,
638
655
} ;
656
+ delete serialized . children ;
639
657
}
640
658
641
659
return serialized ;
@@ -691,12 +709,7 @@ export default class RenderTree {
691
709
}
692
710
693
711
_serializeObject ( object ) {
694
- let id = this . previouslyRetainedObjects . get ( object ) ;
695
-
696
- if ( id === undefined ) {
697
- id = this . retainObject ( object ) ;
698
- }
699
-
712
+ let id = this . retainObject ( object ) ;
700
713
this . retainedObjects . set ( object , id ) ;
701
714
702
715
return { id, type : typeof object , inspect : inspect ( object ) } ;
0 commit comments