From 40a5f2886207e49a4d34a030d910bf256c05f37b Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 19 Nov 2017 11:37:42 -0500 Subject: [PATCH] start refactoring bindings --- .../dom/visitors/Element/Binding.ts | 1 - .../dom/visitors/Element/Element.ts | 263 ++++--- .../dom/visitors/Element/EventHandler.ts | 111 --- src/generators/dom/visitors/Element/Ref.ts | 25 - .../dom/visitors/Element/addBindings.ts | 689 ++++++++++++++++++ .../dom/visitors/Element/addTransitions.ts | 9 +- 6 files changed, 864 insertions(+), 234 deletions(-) delete mode 100644 src/generators/dom/visitors/Element/EventHandler.ts delete mode 100644 src/generators/dom/visitors/Element/Ref.ts create mode 100644 src/generators/dom/visitors/Element/addBindings.ts diff --git a/src/generators/dom/visitors/Element/Binding.ts b/src/generators/dom/visitors/Element/Binding.ts index 6be11e86a5..e39f8c6609 100644 --- a/src/generators/dom/visitors/Element/Binding.ts +++ b/src/generators/dom/visitors/Element/Binding.ts @@ -183,7 +183,6 @@ export default function visitBinding( if (!isMediaElement) { node.initialUpdate = updateElement; - node.initialUpdateNeedsStateObject = !block.contexts.has(name); } if (!isReadOnly) { // audio/video duration is read-only, it never updates diff --git a/src/generators/dom/visitors/Element/Element.ts b/src/generators/dom/visitors/Element/Element.ts index f678dec9e8..d3da9e38c2 100644 --- a/src/generators/dom/visitors/Element/Element.ts +++ b/src/generators/dom/visitors/Element/Element.ts @@ -4,9 +4,10 @@ import visitSlot from '../Slot'; import visitComponent from '../Component'; import visitWindow from './meta/Window'; import visitAttribute from './Attribute'; -import visitEventHandler from './EventHandler'; import visitBinding from './Binding'; -import visitRef from './Ref'; +import addBindings from './addBindings'; +import flattenReference from '../../../../utils/flattenReference'; +import validCalleeObjects from '../../../../utils/validCalleeObjects'; import * as namespaces from '../../../../utils/namespaces'; import getStaticAttributeValue from '../../../../utils/getStaticAttributeValue'; import isVoidElementName from '../../../../utils/isVoidElementName'; @@ -18,24 +19,10 @@ import { State } from '../../interfaces'; import reservedNames from '../../../../utils/reservedNames'; import { stringify } from '../../../../utils/stringify'; -const meta = { +const meta: Record = { ':Window': visitWindow, }; -const order = { - Attribute: 1, - Binding: 2, - EventHandler: 3, - Ref: 4, -}; - -const visitors = { - Attribute: visitAttribute, - EventHandler: visitEventHandler, - Binding: visitBinding, - Ref: visitRef, -}; - export default function visitElement( generator: DomGenerator, block: Block, @@ -69,8 +56,6 @@ export default function visitElement( `${componentStack[componentStack.length - 1].var}._slotted.${slot.value[0].data}` : // TODO this looks bonkers state.parentNode; - const isToplevel = !parentNode; - block.addVariable(name); block.builders.create.addLine( `${name} = ${getRenderStatement( @@ -93,6 +78,10 @@ export default function visitElement( ); } else { block.builders.mount.addLine(`@insertNode(${name}, #target, anchor);`); + + // TODO we eventually need to consider what happens to elements + // that belong to the same outgroup as an outroing element... + block.builders.unmount.addLine(`@detachNode(${name});`); } // add CSS encapsulation attribute @@ -109,105 +98,191 @@ export default function visitElement( } } - function visitAttributesAndAddProps() { - let intro; - let outro; - - node.attributes - .sort((a: Node, b: Node) => order[a.type] - order[b.type]) - .forEach((attribute: Node) => { - if (attribute.type === 'Transition') { - if (attribute.intro) intro = attribute; - if (attribute.outro) outro = attribute; - return; - } - - visitors[attribute.type](generator, block, childState, node, attribute); + if (node.name === 'textarea') { + // this is an egregious hack, but it's the easiest way to get