From e7d324f305024625abb5bd5ab714beee91e01706 Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Tue, 4 Apr 2017 23:10:52 -0400 Subject: [PATCH] visitors can just be functions now --- src/generators/dom/visitors/Component.js | 4 +- src/generators/dom/visitors/Element.js | 4 +- src/generators/server-side-rendering/visit.js | 4 +- .../server-side-rendering/visitors/Comment.js | 4 +- .../visitors/Component.js | 116 +++++++++--------- .../visitors/EachBlock.js | 50 ++++---- .../server-side-rendering/visitors/Element.js | 88 ++++++------- .../server-side-rendering/visitors/IfBlock.js | 38 +++--- .../visitors/MustacheTag.js | 10 +- .../visitors/RawMustacheTag.js | 10 +- .../server-side-rendering/visitors/Text.js | 8 +- .../visitors/YieldTag.js | 8 +- .../visitors/meta/Window.js | 12 +- 13 files changed, 161 insertions(+), 195 deletions(-) diff --git a/src/generators/dom/visitors/Component.js b/src/generators/dom/visitors/Component.js index ed9cae8921..d9a8e0daa5 100644 --- a/src/generators/dom/visitors/Component.js +++ b/src/generators/dom/visitors/Component.js @@ -168,13 +168,13 @@ export default { key: null }); - this.elementDepth += 1; + generator.elementDepth += 1; node.children.forEach( child => { visit( child, generator ); }); - this.elementDepth -= 1; + generator.elementDepth -= 1; generator.pop(); } diff --git a/src/generators/dom/visitors/Element.js b/src/generators/dom/visitors/Element.js index a056c2957f..a224f0ffce 100644 --- a/src/generators/dom/visitors/Element.js +++ b/src/generators/dom/visitors/Element.js @@ -110,13 +110,13 @@ export default { key: null }); - this.elementDepth += 1; + generator.elementDepth += 1; node.children.forEach( child => { visit( child, generator ); }); - this.elementDepth -= 1; + generator.elementDepth -= 1; if ( node.name in meta ) { if ( meta[ node.name ].leave ) meta[ node.name ].leave( generator, node ); diff --git a/src/generators/server-side-rendering/visit.js b/src/generators/server-side-rendering/visit.js index 5f688e76ac..e9837098c4 100644 --- a/src/generators/server-side-rendering/visit.js +++ b/src/generators/server-side-rendering/visit.js @@ -2,7 +2,5 @@ import visitors from './visitors/index.js'; export default function visit ( node, generator ) { const visitor = visitors[ node.type ]; - - if ( visitor.enter ) visitor.enter( generator, node ); - if ( visitor.leave ) visitor.leave( generator, node ); + visitor( generator, node ); } \ No newline at end of file diff --git a/src/generators/server-side-rendering/visitors/Comment.js b/src/generators/server-side-rendering/visitors/Comment.js index f32a1e64a8..4d3477d7ef 100644 --- a/src/generators/server-side-rendering/visitors/Comment.js +++ b/src/generators/server-side-rendering/visitors/Comment.js @@ -1,3 +1,3 @@ -export default { +export default function visitComment () { // do nothing -}; +} diff --git a/src/generators/server-side-rendering/visitors/Component.js b/src/generators/server-side-rendering/visitors/Component.js index 688f70f614..4b1793f047 100644 --- a/src/generators/server-side-rendering/visitors/Component.js +++ b/src/generators/server-side-rendering/visitors/Component.js @@ -1,79 +1,77 @@ import flattenReference from '../../../utils/flattenReference.js'; import visit from '../visit.js'; -export default { - enter ( generator, node ) { - function stringify ( chunk ) { - if ( chunk.type === 'Text' ) return chunk.data; - if ( chunk.type === 'MustacheTag' ) { - const { snippet } = generator.contextualise( chunk.expression ); - return '${__escape( ' + snippet + ')}'; - } +export default function visitComponent ( generator, node ) { + function stringify ( chunk ) { + if ( chunk.type === 'Text' ) return chunk.data; + if ( chunk.type === 'MustacheTag' ) { + const { snippet } = generator.contextualise( chunk.expression ); + return '${__escape( ' + snippet + ')}'; } + } - const attributes = []; - const bindings = []; + const attributes = []; + const bindings = []; - node.attributes.forEach( attribute => { - if ( attribute.type === 'Attribute' ) { - attributes.push( attribute ); - } else if ( attribute.type === 'Binding' ) { - bindings.push( attribute ); - } - }); + node.attributes.forEach( attribute => { + if ( attribute.type === 'Attribute' ) { + attributes.push( attribute ); + } else if ( attribute.type === 'Binding' ) { + bindings.push( attribute ); + } + }); - const props = attributes - .map( attribute => { - let value; + const props = attributes + .map( attribute => { + let value; - if ( attribute.value === true ) { - value = `true`; - } else if ( attribute.value.length === 0 ) { - value = `''`; - } else if ( attribute.value.length === 1 ) { - const chunk = attribute.value[0]; - if ( chunk.type === 'Text' ) { - value = isNaN( chunk.data ) ? JSON.stringify( chunk.data ) : chunk.data; - } else { - const { snippet } = generator.contextualise( chunk.expression ); - value = snippet; - } + if ( attribute.value === true ) { + value = `true`; + } else if ( attribute.value.length === 0 ) { + value = `''`; + } else if ( attribute.value.length === 1 ) { + const chunk = attribute.value[0]; + if ( chunk.type === 'Text' ) { + value = isNaN( chunk.data ) ? JSON.stringify( chunk.data ) : chunk.data; } else { - value = '`' + attribute.value.map( stringify ).join( '' ) + '`'; + const { snippet } = generator.contextualise( chunk.expression ); + value = snippet; } + } else { + value = '`' + attribute.value.map( stringify ).join( '' ) + '`'; + } - return `${attribute.name}: ${value}`; - }) - .concat( bindings.map( binding => { - const { name, keypath } = flattenReference( binding.value ); - const value = generator.current.contexts.has( name ) ? keypath : `root.${keypath}`; - return `${binding.name}: ${value}`; - })) - .join( ', ' ); + return `${attribute.name}: ${value}`; + }) + .concat( bindings.map( binding => { + const { name, keypath } = flattenReference( binding.value ); + const value = generator.current.contexts.has( name ) ? keypath : `root.${keypath}`; + return `${binding.name}: ${value}`; + })) + .join( ', ' ); - const expression = node.name === ':Self' ? generator.name : generator.importedComponents.get( node.name ) || `${generator.alias( 'template' )}.components.${node.name}`; + const expression = node.name === ':Self' ? generator.name : generator.importedComponents.get( node.name ) || `${generator.alias( 'template' )}.components.${node.name}`; - bindings.forEach( binding => { - generator.addBinding( binding, expression ); - }); + bindings.forEach( binding => { + generator.addBinding( binding, expression ); + }); - let open = `\${${expression}.render({${props}}`; + let open = `\${${expression}.render({${props}}`; - if ( node.children.length ) { - open += `, { yield: () => \``; - } + if ( node.children.length ) { + open += `, { yield: () => \``; + } - generator.append( open ); + generator.append( open ); - this.elementDepth += 1; + generator.elementDepth += 1; - node.children.forEach( child => { - visit( child, generator ); - }); + node.children.forEach( child => { + visit( child, generator ); + }); - this.elementDepth -= 1; + generator.elementDepth -= 1; - const close = node.children.length ? `\` })}` : ')}'; - generator.append( close ); - } -}; + const close = node.children.length ? `\` })}` : ')}'; + generator.append( close ); +} diff --git a/src/generators/server-side-rendering/visitors/EachBlock.js b/src/generators/server-side-rendering/visitors/EachBlock.js index da97500a43..93cca86df9 100644 --- a/src/generators/server-side-rendering/visitors/EachBlock.js +++ b/src/generators/server-side-rendering/visitors/EachBlock.js @@ -1,36 +1,34 @@ import visit from '../visit.js'; -export default { - enter ( generator, node ) { - const { dependencies, snippet } = generator.contextualise( node.expression ); +export default function visitEachBlock ( generator, node ) { + const { dependencies, snippet } = generator.contextualise( node.expression ); - const open = `\${ ${snippet}.map( ${ node.index ? `( ${node.context}, ${node.index} )` : node.context} => \``; - generator.append( open ); + const open = `\${ ${snippet}.map( ${ node.index ? `( ${node.context}, ${node.index} )` : node.context} => \``; + generator.append( open ); - // TODO should this be the generator's job? It's duplicated between - // here and the equivalent DOM compiler visitor - const contexts = new Map( generator.current.contexts ); - contexts.set( node.context, node.context ); + // TODO should this be the generator's job? It's duplicated between + // here and the equivalent DOM compiler visitor + const contexts = new Map( generator.current.contexts ); + contexts.set( node.context, node.context ); - const indexes = new Map( generator.current.indexes ); - if ( node.index ) indexes.set( node.index, node.context ); + const indexes = new Map( generator.current.indexes ); + if ( node.index ) indexes.set( node.index, node.context ); - const contextDependencies = new Map( generator.current.contextDependencies ); - contextDependencies.set( node.context, dependencies ); + const contextDependencies = new Map( generator.current.contextDependencies ); + contextDependencies.set( node.context, dependencies ); - generator.push({ - contexts, - indexes, - contextDependencies - }); + generator.push({ + contexts, + indexes, + contextDependencies + }); - node.children.forEach( child => { - visit( child, generator ); - }); + node.children.forEach( child => { + visit( child, generator ); + }); - const close = `\` ).join( '' )}`; - generator.append( close ); + const close = `\` ).join( '' )}`; + generator.append( close ); - generator.pop(); - } -}; + generator.pop(); +} \ No newline at end of file diff --git a/src/generators/server-side-rendering/visitors/Element.js b/src/generators/server-side-rendering/visitors/Element.js index f452a37e07..97bc489ec9 100644 --- a/src/generators/server-side-rendering/visitors/Element.js +++ b/src/generators/server-side-rendering/visitors/Element.js @@ -1,72 +1,60 @@ -import Component from './Component.js'; +import visitComponent from './Component.js'; import isVoidElementName from '../../../utils/isVoidElementName.js'; import visit from '../visit.js'; -import Window from './meta/Window.js'; +import visitWindow from './meta/Window.js'; const meta = { - ':Window': Window + ':Window': visitWindow }; -export default { - enter ( generator, node ) { - if ( node.name in meta ) { - return meta[ node.name ].enter( generator, node ); - } - - if ( generator.components.has( node.name ) || node.name === ':Self' ) { - Component.enter( generator, node ); - return; - } - - let openingTag = `<${node.name}`; +export default function visitElement ( generator, node ) { + if ( node.name in meta ) { + return meta[ node.name ]( generator, node ); + } - node.attributes.forEach( attribute => { - if ( attribute.type !== 'Attribute' ) return; + if ( generator.components.has( node.name ) || node.name === ':Self' ) { + visitComponent( generator, node ); + return; + } - let str = ` ${attribute.name}`; + let openingTag = `<${node.name}`; - if ( attribute.value !== true ) { - str += `="` + attribute.value.map( chunk => { - if ( chunk.type === 'Text' ) { - return chunk.data; - } + node.attributes.forEach( attribute => { + if ( attribute.type !== 'Attribute' ) return; - const { snippet } = generator.contextualise( chunk.expression ); - return '${' + snippet + '}'; - }).join( '' ) + `"`; - } + let str = ` ${attribute.name}`; - openingTag += str; - }); + if ( attribute.value !== true ) { + str += `="` + attribute.value.map( chunk => { + if ( chunk.type === 'Text' ) { + return chunk.data; + } - if ( generator.cssId && !generator.elementDepth ) { - openingTag += ` ${generator.cssId}`; + const { snippet } = generator.contextualise( chunk.expression ); + return '${' + snippet + '}'; + }).join( '' ) + `"`; } - openingTag += '>'; + openingTag += str; + }); - generator.append( openingTag ); + if ( generator.cssId && !generator.elementDepth ) { + openingTag += ` ${generator.cssId}`; + } - this.elementDepth += 1; + openingTag += '>'; - node.children.forEach( child => { - visit( child, generator ); - }); + generator.append( openingTag ); - this.elementDepth -= 1; + generator.elementDepth += 1; - if ( node.name in meta ) { - if ( meta[ node.name ].leave ) meta[ node.name ].leave( generator, node ); - return; - } + node.children.forEach( child => { + visit( child, generator ); + }); - if ( generator.components.has( node.name ) || node.name === ':Self' ) { - Component.leave( generator, node ); - return; - } + generator.elementDepth -= 1; - if ( !isVoidElementName( node.name ) ) { - generator.append( `` ); - } + if ( !isVoidElementName( node.name ) ) { + generator.append( `` ); } -}; +} \ No newline at end of file diff --git a/src/generators/server-side-rendering/visitors/IfBlock.js b/src/generators/server-side-rendering/visitors/IfBlock.js index 1d093db358..f024f04ec3 100644 --- a/src/generators/server-side-rendering/visitors/IfBlock.js +++ b/src/generators/server-side-rendering/visitors/IfBlock.js @@ -1,29 +1,27 @@ import visit from '../visit.js'; -export default { - enter ( generator, node ) { - const { snippet } = generator.contextualise( node.expression ); +export default function visitIfBlock ( generator, node ) { + const { snippet } = generator.contextualise( node.expression ); - generator.append( '${ ' + snippet + ' ? `' ); + generator.append( '${ ' + snippet + ' ? `' ); - generator.push({ - conditions: generator.current.conditions.concat( snippet ) - }); + generator.push({ + conditions: generator.current.conditions.concat( snippet ) + }); - node.children.forEach( child => { - visit( child, generator ); - }); + node.children.forEach( child => { + visit( child, generator ); + }); - generator.append( '` : `' ); + generator.append( '` : `' ); - if ( node.else ) { - node.else.children.forEach( child => { - visit( child, generator ); - }); - } + if ( node.else ) { + node.else.children.forEach( child => { + visit( child, generator ); + }); + } - generator.append( '` }' ); + generator.append( '` }' ); - generator.pop(); - } -}; + generator.pop(); +} \ No newline at end of file diff --git a/src/generators/server-side-rendering/visitors/MustacheTag.js b/src/generators/server-side-rendering/visitors/MustacheTag.js index 9052e2627f..99102a7ccb 100644 --- a/src/generators/server-side-rendering/visitors/MustacheTag.js +++ b/src/generators/server-side-rendering/visitors/MustacheTag.js @@ -1,6 +1,4 @@ -export default { - enter ( generator, node ) { - const { snippet } = generator.contextualise( node.expression ); - generator.append( '${__escape( ' + snippet + ' )}' ); - } -}; +export default function visitMustacheTag ( generator, node ) { + const { snippet } = generator.contextualise( node.expression ); + generator.append( '${__escape( ' + snippet + ' )}' ); +} \ No newline at end of file diff --git a/src/generators/server-side-rendering/visitors/RawMustacheTag.js b/src/generators/server-side-rendering/visitors/RawMustacheTag.js index c84de16e2a..0c70f363e3 100644 --- a/src/generators/server-side-rendering/visitors/RawMustacheTag.js +++ b/src/generators/server-side-rendering/visitors/RawMustacheTag.js @@ -1,6 +1,4 @@ -export default { - enter ( generator, node ) { - const { snippet } = generator.contextualise( node.expression ); - generator.append( '${' + snippet + '}' ); - } -}; +export default function visitRawMustacheTag ( generator, node ) { + const { snippet } = generator.contextualise( node.expression ); + generator.append( '${' + snippet + '}' ); +} \ No newline at end of file diff --git a/src/generators/server-side-rendering/visitors/Text.js b/src/generators/server-side-rendering/visitors/Text.js index 16630a709d..d8510d8393 100644 --- a/src/generators/server-side-rendering/visitors/Text.js +++ b/src/generators/server-side-rendering/visitors/Text.js @@ -1,5 +1,3 @@ -export default { - enter ( generator, node ) { - generator.append( node.data.replace( /\${/g, '\\${' ) ); - } -}; +export default function visitText ( generator, node ) { + generator.append( node.data.replace( /\${/g, '\\${' ) ); +} \ No newline at end of file diff --git a/src/generators/server-side-rendering/visitors/YieldTag.js b/src/generators/server-side-rendering/visitors/YieldTag.js index a9b35f777e..bde5ab1a00 100644 --- a/src/generators/server-side-rendering/visitors/YieldTag.js +++ b/src/generators/server-side-rendering/visitors/YieldTag.js @@ -1,5 +1,3 @@ -export default { - enter ( generator ) { - generator.append( `\${options && options.yield ? options.yield() : ''}` ); - } -}; +export default function visitYieldTag ( generator ) { + generator.append( `\${options && options.yield ? options.yield() : ''}` ); +} \ No newline at end of file diff --git a/src/generators/server-side-rendering/visitors/meta/Window.js b/src/generators/server-side-rendering/visitors/meta/Window.js index 7df7d8bdaf..4b4bf67ccc 100644 --- a/src/generators/server-side-rendering/visitors/meta/Window.js +++ b/src/generators/server-side-rendering/visitors/meta/Window.js @@ -1,9 +1,3 @@ -export default { - enter () { - // noop - }, - - leave () { - // noop - } -}; +export default function visitWindow () { + // noop +} \ No newline at end of file