hoist if block selectors

pull/751/head
Rich Harris 8 years ago
parent ff814ecfa4
commit 177e7d09c3

@ -184,7 +184,7 @@ export default class Block {
}
}
render() {
toString() {
let introing;
const hasIntros = !this.builders.intro.isEmpty();
if (hasIntros) {

@ -15,7 +15,7 @@ import Block from './Block';
import { Parsed, CompileOptions, Node } from '../../interfaces';
export class DomGenerator extends Generator {
blocks: Block[];
blocks: (Block|string)[];
readonly: Set<string>;
metaBindings: string[];
@ -160,7 +160,7 @@ export default function dom(
}
generator.blocks.forEach(block => {
builder.addBlock(block.render());
builder.addBlock(block.toString());
});
const sharedPath = options.shared === true

@ -94,11 +94,7 @@ export default function visitEventHandler(
`;
if (shouldHoist) {
generator.blocks.push(
<Block>{
render: () => handler,
}
);
generator.blocks.push(handler);
} else {
block.builders.init.addBlock(handler);
}

@ -226,20 +226,22 @@ function compound(
dynamic,
{ name, anchor, params, hasElse, if_name }
) {
const get_block = block.getUniqueName(`get_block`);
const select_block = generator.getUniqueName(`select_block`);
const current_block = block.getUniqueName(`current_block`);
const current_block_and = hasElse ? '' : `${current_block} && `;
block.builders.init.addBlock(deindent`
function ${get_block} ( ${params} ) {
generator.blocks.push(deindent`
function ${select_block} ( ${params} ) {
${branches
.map(({ condition, block }) => {
return `${condition ? `if ( ${condition} ) ` : ''}return ${block};`;
})
.join('\n')}
}
`);
var ${current_block} = ${get_block}( ${params} );
block.builders.init.addBlock(deindent`
var ${current_block} = ${select_block}( ${params} );
var ${name} = ${current_block_and}${current_block}( ${params}, #component );
`);
@ -272,7 +274,7 @@ function compound(
if (dynamic) {
block.builders.update.addBlock(deindent`
if ( ${current_block} === ( ${current_block} = ${get_block}( ${params} ) ) && ${name} ) {
if ( ${current_block} === ( ${current_block} = ${select_block}( ${params} ) ) && ${name} ) {
${name}.update( changed, ${params} );
} else {
${changeBlock}
@ -280,7 +282,7 @@ function compound(
`);
} else {
block.builders.update.addBlock(deindent`
if ( ${current_block} !== ( ${current_block} = ${get_block}( ${params} ) ) ) {
if ( ${current_block} !== ( ${current_block} = ${select_block}( ${params} ) ) ) {
${changeBlock}
}
`);
@ -302,7 +304,7 @@ function compoundWithOutros(
dynamic,
{ name, anchor, params, hasElse }
) {
const get_block = block.getUniqueName(`get_block`);
const select_block = block.getUniqueName(`select_block`);
const current_block_index = block.getUniqueName(`current_block_index`);
const previous_block_index = block.getUniqueName(`previous_block_index`);
const if_block_creators = block.getUniqueName(`if_block_creators`);
@ -322,7 +324,7 @@ function compoundWithOutros(
var ${if_blocks} = [];
function ${get_block} ( ${params} ) {
function ${select_block} ( ${params} ) {
${branches
.map(({ condition, block }, i) => {
return `${condition ? `if ( ${condition} ) ` : ''}return ${block
@ -335,12 +337,12 @@ function compoundWithOutros(
if (hasElse) {
block.builders.init.addBlock(deindent`
${current_block_index} = ${get_block}( ${params} );
${current_block_index} = ${select_block}( ${params} );
${name} = ${if_blocks}[ ${current_block_index} ] = ${if_block_creators}[ ${current_block_index} ]( ${params}, #component );
`);
} else {
block.builders.init.addBlock(deindent`
if ( ~( ${current_block_index} = ${get_block}( ${params} ) ) ) {
if ( ~( ${current_block_index} = ${select_block}( ${params} ) ) ) {
${name} = ${if_blocks}[ ${current_block_index} ] = ${if_block_creators}[ ${current_block_index} ]( ${params}, #component );
}
`);
@ -395,7 +397,7 @@ function compoundWithOutros(
if (dynamic) {
block.builders.update.addBlock(deindent`
var ${previous_block_index} = ${current_block_index};
${current_block_index} = ${get_block}( ${params} );
${current_block_index} = ${select_block}( ${params} );
if ( ${current_block_index} === ${previous_block_index} ) {
${if_current_block_index}${if_blocks}[ ${current_block_index} ].update( changed, ${params} );
} else {
@ -405,7 +407,7 @@ function compoundWithOutros(
} else {
block.builders.update.addBlock(deindent`
var ${previous_block_index} = ${current_block_index};
${current_block_index} = ${get_block}( ${params} );
${current_block_index} = ${select_block}( ${params} );
if ( ${current_block_index} !== ${previous_block_index} ) {
${changeBlock}
}

@ -138,12 +138,7 @@ var proto = {
function create_main_fragment ( state, component ) {
var if_block_anchor;
function get_block ( state ) {
if ( state.foo ) return create_if_block;
return create_if_block_1;
}
var current_block = get_block( state );
var current_block = select_block( state );
var if_block = current_block( state, component );
return {
@ -158,7 +153,7 @@ function create_main_fragment ( state, component ) {
},
update: function ( changed, state ) {
if ( current_block !== ( current_block = get_block( state ) ) ) {
if ( current_block !== ( current_block = select_block( state ) ) ) {
if_block.unmount();
if_block.destroy();
if_block = current_block( state, component );
@ -222,6 +217,11 @@ function create_if_block_1 ( state, component ) {
};
}
function select_block ( state ) {
if ( state.foo ) return create_if_block;
return create_if_block_1;
}
function SvelteComponent ( options ) {
options = options || {};
this._state = options.data || {};

@ -3,12 +3,7 @@ import { appendNode, assign, createComment, createElement, createText, detachNod
function create_main_fragment ( state, component ) {
var if_block_anchor;
function get_block ( state ) {
if ( state.foo ) return create_if_block;
return create_if_block_1;
}
var current_block = get_block( state );
var current_block = select_block( state );
var if_block = current_block( state, component );
return {
@ -23,7 +18,7 @@ function create_main_fragment ( state, component ) {
},
update: function ( changed, state ) {
if ( current_block !== ( current_block = get_block( state ) ) ) {
if ( current_block !== ( current_block = select_block( state ) ) ) {
if_block.unmount();
if_block.destroy();
if_block = current_block( state, component );
@ -87,6 +82,11 @@ function create_if_block_1 ( state, component ) {
};
}
function select_block ( state ) {
if ( state.foo ) return create_if_block;
return create_if_block_1;
}
function SvelteComponent ( options ) {
options = options || {};
this._state = options.data || {};

Loading…
Cancel
Save