From 1c761e709bd82b0113f1f306b33ad5e511f7a14f Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Sun, 9 Apr 2017 14:42:57 -0400 Subject: [PATCH] refactor a lot of attribute code --- src/generators/Generator.js | 4 +- src/generators/dom/Block.js | 4 +- .../dom/visitors/Element/Attribute.js | 133 ++++++++++ .../addElementBinding.js => Binding.js} | 14 +- .../dom/visitors/Element/Element.js | 69 ++++-- .../dom/visitors/Element/EventHandler.js | 62 +++++ src/generators/dom/visitors/Element/Ref.js | 15 ++ .../attributes/addElementAttributes.js | 229 ------------------ .../getStaticAttributeValue.js | 0 .../Element/{attributes => }/lookup.js | 0 10 files changed, 264 insertions(+), 266 deletions(-) create mode 100644 src/generators/dom/visitors/Element/Attribute.js rename src/generators/dom/visitors/Element/{attributes/addElementBinding.js => Binding.js} (89%) create mode 100644 src/generators/dom/visitors/Element/EventHandler.js create mode 100644 src/generators/dom/visitors/Element/Ref.js delete mode 100644 src/generators/dom/visitors/Element/attributes/addElementAttributes.js rename src/generators/dom/visitors/Element/{attributes => }/getStaticAttributeValue.js (100%) rename src/generators/dom/visitors/Element/{attributes => }/lookup.js (100%) diff --git a/src/generators/Generator.js b/src/generators/Generator.js index 37d8de90b6..f1aef70eea 100644 --- a/src/generators/Generator.js +++ b/src/generators/Generator.js @@ -60,14 +60,14 @@ export default class Generator { return alias; } - contextualise ( fragment, expression, isEventHandler ) { + contextualise ( block, expression, isEventHandler ) { this.addSourcemapLocations( expression ); const usedContexts = []; const dependencies = []; const { code, helpers } = this; - const { contextDependencies, contexts, indexes } = fragment; + const { contextDependencies, contexts, indexes } = block; let scope = annotateWithScopes( expression ); diff --git a/src/generators/dom/Block.js b/src/generators/dom/Block.js index 3f5b838bbb..90329c6c21 100644 --- a/src/generators/dom/Block.js +++ b/src/generators/dom/Block.js @@ -39,7 +39,7 @@ export default class Block { `var ${name} = ${renderStatement};` ); - this.createMountStatement( name, parentNode ); + this.mount( name, parentNode ); } else { this.builders.create.addLine( `${this.generator.helper( 'appendNode' )}( ${renderStatement}, ${parentNode} );` ); } @@ -58,7 +58,7 @@ export default class Block { this.addElement( name, renderStatement, parentNode, true ); } - createMountStatement ( name, parentNode ) { + mount ( name, parentNode ) { if ( parentNode ) { this.builders.create.addLine( `${this.generator.helper( 'appendNode' )}( ${name}, ${parentNode} );` ); } else { diff --git a/src/generators/dom/visitors/Element/Attribute.js b/src/generators/dom/visitors/Element/Attribute.js new file mode 100644 index 0000000000..c73bc1973b --- /dev/null +++ b/src/generators/dom/visitors/Element/Attribute.js @@ -0,0 +1,133 @@ +import attributeLookup from './lookup.js'; +import deindent from '../../../../utils/deindent.js'; +import getStaticAttributeValue from './getStaticAttributeValue.js'; + +export default function visitAttribute ( generator, block, state, node, attribute ) { + const name = attribute.name; + + let metadata = state.namespace ? null : attributeLookup[ name ]; + if ( metadata && metadata.appliesTo && !~metadata.appliesTo.indexOf( node.name ) ) metadata = null; + + let dynamic = false; + + const isIndirectlyBoundValue = name === 'value' && ( + node.name === 'option' || // TODO check it's actually bound + node.name === 'input' && /^(checkbox|radio)$/.test( getStaticAttributeValue( node, 'type' ) ) + ); + + const propertyName = isIndirectlyBoundValue ? '__value' : metadata && metadata.propertyName; + + // xlink is a special case... we could maybe extend this to generic + // namespaced attributes but I'm not sure that's applicable in + // HTML5? + const method = name.slice( 0, 6 ) === 'xlink:' ? 'setXlinkAttribute' : 'setAttribute'; + + // attributes without values, e.g.