mostly fix insane node 4 issue

pull/422/head
Rich-Harris 9 years ago
parent e32e69f3e8
commit be33a29a56

@ -119,8 +119,9 @@ class DomGenerator extends Generator {
} }
} }
generateBlock ( node, name ) { generateBlock ( node, name, type ) {
this.push({ this.push({
type,
name, name,
target: 'target', target: 'target',
localElementDepth: 0, localElementDepth: 0,
@ -203,6 +204,7 @@ export default function dom ( parsed, source, options ) {
const component = getUniqueName( 'component' ); const component = getUniqueName( 'component' );
generator.push({ generator.push({
type: 'block',
name: generator.alias( 'render_main_fragment' ), name: generator.alias( 'render_main_fragment' ),
namespace, namespace,
target: 'target', target: 'target',

@ -0,0 +1,4 @@
export default function findBlock ( fragment ) {
while ( fragment.type !== 'block' ) fragment = fragment.parent;
return fragment;
}

@ -67,7 +67,7 @@ export default {
const yieldName = generator.getUniqueName( `render_${name}_yield_fragment` ); const yieldName = generator.getUniqueName( `render_${name}_yield_fragment` );
const params = current.params.join( ', ' ); const params = current.params.join( ', ' );
generator.generateBlock( node, yieldName ); generator.generateBlock( node, yieldName, 'yield' );
const yieldFragment = current.getUniqueName( `${name}_yield_fragment` ); const yieldFragment = current.getUniqueName( `${name}_yield_fragment` );
@ -151,6 +151,7 @@ export default {
if ( !local.update.isEmpty() ) current.builders.update.addBlock( local.update ); if ( !local.update.isEmpty() ) current.builders.update.addBlock( local.update );
generator.push({ generator.push({
type: 'component',
namespace: local.namespace, namespace: local.namespace,
target: name, target: name,
parent: current, parent: current,

@ -168,7 +168,7 @@ export default {
} }
if ( node.else ) { if ( node.else ) {
generator.generateBlock( node.else, renderElse ); generator.generateBlock( node.else, renderElse, 'block' );
} }
const indexNames = new Map( generator.current.indexNames ); const indexNames = new Map( generator.current.indexNames );
@ -193,6 +193,7 @@ export default {
const getUniqueName = generator.getUniqueNameMaker( blockParams ); const getUniqueName = generator.getUniqueNameMaker( blockParams );
generator.push({ generator.push({
type: 'block',
name: renderer, name: renderer,
target: 'target', target: 'target',
expression: node.expression, expression: node.expression,

@ -101,6 +101,7 @@ export default {
generator.createMountStatement( name ); generator.createMountStatement( name );
generator.push({ generator.push({
type: 'element',
namespace: local.namespace, namespace: local.namespace,
target: name, target: name,
parent: generator.current, parent: generator.current,

@ -9,7 +9,7 @@ function getConditionsAndBlocks ( generator, node, _name, i = 0 ) {
block: name block: name
}]; }];
generator.generateBlock( node, name ); generator.generateBlock( node, name, 'block' );
if ( node.else && node.else.children.length === 1 && if ( node.else && node.else.children.length === 1 &&
node.else.children[0].type === 'IfBlock' ) { node.else.children[0].type === 'IfBlock' ) {
@ -24,7 +24,7 @@ function getConditionsAndBlocks ( generator, node, _name, i = 0 ) {
}); });
if ( node.else ) { if ( node.else ) {
generator.generateBlock( node.else, name ); generator.generateBlock( node.else, name, 'block' );
} }
} }
return conditionsAndBlocks; return conditionsAndBlocks;

@ -1,4 +1,5 @@
import deindent from '../../../utils/deindent.js'; import deindent from '../../../utils/deindent.js';
import findBlock from '../utils/findBlock.js';
export default { export default {
enter ( generator, node ) { enter ( generator, node ) {
@ -9,12 +10,12 @@ export default {
generator.current.builders.init.addLine( `var last_${name} = ${snippet};` ); generator.current.builders.init.addLine( `var last_${name} = ${snippet};` );
generator.addElement( name, `${generator.helper( 'createText' )}( last_${name} )`, true ); generator.addElement( name, `${generator.helper( 'createText' )}( last_${name} )`, true );
if ( !generator.current.tmp ) { const fragment = findBlock( generator.current );
generator.current.tmp = generator.current.getUniqueName( 'tmp' ); if ( !fragment.tmp ) fragment.tmp = fragment.getUniqueName( 'tmp' );
}
generator.current.builders.update.addBlock( deindent` generator.current.builders.update.addBlock( deindent`
if ( ( ${generator.current.tmp} = ${snippet} ) !== last_${name} ) { if ( ( ${fragment.tmp} = ${snippet} ) !== last_${name} ) {
${name}.data = last_${name} = ${generator.current.tmp}; ${name}.data = last_${name} = ${fragment.tmp};
} }
` ); ` );
} }

@ -1,4 +1,5 @@
import deindent from '../../../utils/deindent.js'; import deindent from '../../../utils/deindent.js';
import findBlock from '../utils/findBlock.js';
export default { export default {
enter ( generator, node ) { enter ( generator, node ) {
@ -26,12 +27,12 @@ export default {
generator.current.builders.init.addLine( mountStatement ); generator.current.builders.init.addLine( mountStatement );
} }
if ( !generator.current.tmp ) { const fragment = findBlock( generator.current );
generator.current.tmp = generator.current.getUniqueName( 'tmp' ); if ( !fragment.tmp ) fragment.tmp = fragment.getUniqueName( 'tmp' );
}
generator.current.builders.update.addBlock( deindent` generator.current.builders.update.addBlock( deindent`
if ( ( ${generator.current.tmp} = ${snippet} ) !== last_${name} ) { if ( ( ${fragment.tmp} = ${snippet} ) !== last_${name} ) {
last_${name} = ${generator.current.tmp}; last_${name} = ${fragment.tmp};
${detachStatement} ${detachStatement}
${mountStatement} ${mountStatement}
} }

@ -3,6 +3,7 @@ import addElementBinding from './addElementBinding';
import deindent from '../../../../utils/deindent.js'; import deindent from '../../../../utils/deindent.js';
import flattenReference from '../../../../utils/flattenReference.js'; import flattenReference from '../../../../utils/flattenReference.js';
import getStaticAttributeValue from './binding/getStaticAttributeValue.js'; import getStaticAttributeValue from './binding/getStaticAttributeValue.js';
import findBlock from '../../utils/findBlock.js';
export default function addElementAttributes ( generator, node, local ) { export default function addElementAttributes ( generator, node, local ) {
node.attributes.forEach( attribute => { node.attributes.forEach( attribute => {
@ -105,12 +106,12 @@ export default function addElementAttributes ( generator, node, local ) {
} }
local.init.addLine( updater ); local.init.addLine( updater );
if ( !generator.current.tmp ) { const fragment = findBlock( generator.current );
generator.current.tmp = generator.current.getUniqueName( 'tmp' ); if ( !fragment.tmp ) fragment.tmp = fragment.getUniqueName( 'tmp' );
}
local.update.addBlock( deindent` local.update.addBlock( deindent`
if ( ( ${generator.current.tmp} = ${snippet} ) !== ${last} ) { if ( ( ${fragment.tmp} = ${snippet} ) !== ${last} ) {
${last} = ${generator.current.tmp}; ${last} = ${fragment.tmp};
${updater} ${updater}
} }
` ); ` );

Loading…
Cancel
Save