diff --git a/compiler/generate/index.js b/compiler/generate/index.js index bca700a96b..a807766bf9 100644 --- a/compiler/generate/index.js +++ b/compiler/generate/index.js @@ -52,6 +52,28 @@ export default function generate ( parsed, source, options, names ) { return name; }, + generateBlock ( node, name ) { + generator.push({ + name, + target: 'target', + localElementDepth: 0, + + initStatements: [], + mountStatements: [], + updateStatements: [], + detachStatements: [], + teardownStatements: [], + + getUniqueName: generator.getUniqueNameMaker() + }); + // walk the children here + node.children.forEach( generator.visit ); + generator.addRenderer( generator.current ); + generator.pop(); + // unset the children, to avoid them being visited again + node.children = []; + }, + addRenderer ( fragment ) { if ( fragment.autofocus ) { fragment.initStatements.push( `${fragment.autofocus}.focus();` ); diff --git a/compiler/generate/visitors/Component.js b/compiler/generate/visitors/Component.js index 677a6191fa..dcad568d69 100644 --- a/compiler/generate/visitors/Component.js +++ b/compiler/generate/visitors/Component.js @@ -30,31 +30,12 @@ export default { `target: ${!isToplevel ? generator.current.target: 'null'}`, 'root: component.root || component' ]; - // Component has children + + // Component has children, put them in a separate {{yield}} block if ( hasChildren ) { const yieldName = generator.current.getUniqueName( `render${name}YieldFragment` ); - // {{YIELD STUFF}} - generator.push({ - name: yieldName, - target: 'target', - localElementDepth: 0, - - initStatements: [], - mountStatements: [], - updateStatements: [], - detachStatements: [], - teardownStatements: [], - - getUniqueName: generator.getUniqueNameMaker() - }); - - node.children.forEach( generator.visit ); - generator.addRenderer( generator.current ); - generator.pop(); - - // Don't render children twice - node.children = []; + generator.generateBlock( node, yieldName ); generator.current.initStatements.push(`var ${name}_yieldFragment = ${yieldName}( root, component );`); generator.current.updateStatements.push(`${name}_yieldFragment.update ( changed, root );`); diff --git a/compiler/generate/visitors/EachBlock.js b/compiler/generate/visitors/EachBlock.js index 8cdb3e5533..caa99e795e 100644 --- a/compiler/generate/visitors/EachBlock.js +++ b/compiler/generate/visitors/EachBlock.js @@ -101,22 +101,7 @@ export default { } if ( node.else ) { - generator.push({ - name: renderElse, - target: 'target', - localElementDepth: 0, - - initStatements: [], - mountStatements: [], - updateStatements: [], - detachStatements: [], - teardownStatements: [], - - getUniqueName: generator.getUniqueNameMaker() - }); - node.else.children.forEach( generator.visit ); - generator.addRenderer( generator.current ); - generator.pop(); + generator.generateBlock( node.else, renderElse ); } const indexNames = Object.assign( {}, generator.current.indexNames ); diff --git a/compiler/generate/visitors/IfBlock.js b/compiler/generate/visitors/IfBlock.js index 54ab60d3cd..7282baf77c 100644 --- a/compiler/generate/visitors/IfBlock.js +++ b/compiler/generate/visitors/IfBlock.js @@ -1,28 +1,5 @@ import deindent from '../utils/deindent.js'; -// collect all the conditions and blocks in the if/elseif/else chain -function generateBlock ( generator, node, name ) { - // walk the children here - generator.push({ - name, - target: 'target', - localElementDepth: 0, - - initStatements: [], - mountStatements: [], - updateStatements: [], - detachStatements: [], - teardownStatements: [], - - getUniqueName: generator.getUniqueNameMaker() - }); - node.children.forEach( generator.visit ); - generator.addRenderer( generator.current ); - generator.pop(); - // unset the children, to avoid them being visited again - node.children = []; -} - function getConditionsAndBlocks ( generator, node, _name, i = 0 ) { generator.addSourcemapLocations( node.expression ); const name = `${_name}_${i}`; @@ -31,7 +8,7 @@ function getConditionsAndBlocks ( generator, node, _name, i = 0 ) { condition: generator.contextualise( node.expression ).snippet, block: name }]; - generateBlock( generator, node, name ); + generator.generateBlock( node, name ); if ( node.else && node.else.children.length === 1 && node.else.children[0].type === 'IfBlock' ) { @@ -44,7 +21,7 @@ function getConditionsAndBlocks ( generator, node, _name, i = 0 ) { block: node.else ? name : null, }); if (node.else) { - generateBlock( generator, node.else, name ); + generator.generateBlock( node.else, name ); } } return conditionsAndBlocks;