diff --git a/src/generators/Generator.js b/src/generators/Generator.js index d1956ed734..a7d0196f2d 100644 --- a/src/generators/Generator.js +++ b/src/generators/Generator.js @@ -427,10 +427,6 @@ export default class Generator { } push ( fragment ) { - const newFragment = Object.assign( {}, this.current, fragment, { - parent: this.current - }); - - this.current = newFragment; + this.current = fragment; } } diff --git a/src/generators/dom/Fragment.js b/src/generators/dom/Fragment.js new file mode 100644 index 0000000000..870ac26cac --- /dev/null +++ b/src/generators/dom/Fragment.js @@ -0,0 +1,9 @@ +export default class Fragment { + constructor ( options ) { + Object.assign( this, options ); + } + + child ( options ) { + return new Fragment( Object.assign( {}, this, options, { parent: this } ) ); + } +} \ No newline at end of file diff --git a/src/generators/dom/index.js b/src/generators/dom/index.js index deb667755e..c3a97f7482 100644 --- a/src/generators/dom/index.js +++ b/src/generators/dom/index.js @@ -3,6 +3,7 @@ import getBuilders from './utils/getBuilders.js'; import CodeBuilder from '../../utils/CodeBuilder.js'; import visit from './visit.js'; import Generator from '../Generator.js'; +import Fragment from './Fragment.js'; import * as shared from '../../shared/index.js'; class DomGenerator extends Generator { @@ -116,7 +117,7 @@ class DomGenerator extends Generator { } generateBlock ( node, name, type ) { - this.push({ + const childFragment = this.current.child({ type, name, target: 'target', @@ -125,6 +126,8 @@ class DomGenerator extends Generator { getUniqueName: this.getUniqueNameMaker( this.current.params ) }); + this.push( childFragment ); + // walk the children here node.children.forEach( node => visit( node, this ) ); this.addRenderer( this.current ); @@ -156,8 +159,9 @@ export default function dom ( parsed, source, options ) { const getUniqueName = generator.getUniqueNameMaker( [ 'root' ] ); const component = getUniqueName( 'component' ); - generator.push({ + const mainFragment = new Fragment({ type: 'block', + generator, name: generator.alias( 'create_main_fragment' ), namespace, target: 'target', @@ -174,14 +178,15 @@ export default function dom ( parsed, source, options ) { listNames: new Map(), builders: getBuilders(), - getUniqueName, + getUniqueName }); + generator.push( mainFragment ); parsed.html.children.forEach( node => { visit( node, generator ); }); - generator.addRenderer( generator.pop() ); + generator.addRenderer( mainFragment ); const builders = { main: new CodeBuilder(), diff --git a/src/generators/dom/visitors/Component.js b/src/generators/dom/visitors/Component.js index 12f02ba53f..8ab6e8da95 100644 --- a/src/generators/dom/visitors/Component.js +++ b/src/generators/dom/visitors/Component.js @@ -158,7 +158,7 @@ export default function visitComponent ( generator, node ) { current.builders.create.addBlock( local.create ); if ( !local.update.isEmpty() ) current.builders.update.addBlock( local.update ); - generator.push({ + const childFragment = generator.current.child({ type: 'component', namespace: local.namespace, target: name, @@ -166,6 +166,7 @@ export default function visitComponent ( generator, node ) { localElementDepth: current.localElementDepth + 1, key: null }); + generator.push( childFragment ); generator.elementDepth += 1; diff --git a/src/generators/dom/visitors/EachBlock.js b/src/generators/dom/visitors/EachBlock.js index d52feec1bf..63aac0000d 100644 --- a/src/generators/dom/visitors/EachBlock.js +++ b/src/generators/dom/visitors/EachBlock.js @@ -192,7 +192,7 @@ export default function visitEachBlock ( generator, node ) { const getUniqueName = generator.getUniqueNameMaker( blockParams ); - generator.push({ + const childFragment = generator.current.child({ type: 'block', name: renderer, target: 'target', @@ -212,9 +212,11 @@ export default function visitEachBlock ( generator, node ) { params: blockParams, builders: getBuilders(), - getUniqueName, + getUniqueName }); + generator.push( childFragment ); + node.children.forEach( child => { visit( child, generator ); }); diff --git a/src/generators/dom/visitors/Element.js b/src/generators/dom/visitors/Element.js index 6b1b209892..95b55a12bb 100644 --- a/src/generators/dom/visitors/Element.js +++ b/src/generators/dom/visitors/Element.js @@ -98,7 +98,7 @@ export default function visitElement ( generator, node ) { generator.createMountStatement( name ); - generator.push({ + const childFragment = generator.current.child({ type: 'element', namespace: local.namespace, target: name, @@ -107,6 +107,8 @@ export default function visitElement ( generator, node ) { key: null }); + generator.push( childFragment ); + generator.elementDepth += 1; node.children.forEach( child => { diff --git a/test/runtime/samples/pass-no-options/_config.js b/test/runtime/samples/pass-no-options/_config.js index 7a8e7a4fb6..9683944f21 100644 --- a/test/runtime/samples/pass-no-options/_config.js +++ b/test/runtime/samples/pass-no-options/_config.js @@ -1,6 +1,7 @@ export default { html: '

Just some static HTML

', - test: function ( assert, component, target, window ) { + + test ( assert, component, target, window ) { const newComp = new window.SvelteComponent(); assert.equal(newComp instanceof window.SvelteComponent, true); }