diff --git a/src/compile/nodes/CatchBlock.ts b/src/compile/nodes/CatchBlock.ts index f728c1b850..5171631845 100644 --- a/src/compile/nodes/CatchBlock.ts +++ b/src/compile/nodes/CatchBlock.ts @@ -1,12 +1,9 @@ -import Node from './shared/Node'; -import Block from '../render-dom/Block'; import map_children from './shared/map_children'; import TemplateScope from './shared/TemplateScope'; +import AbstractBlock from './shared/AbstractBlock'; -export default class CatchBlock extends Node { - block: Block; +export default class CatchBlock extends AbstractBlock { scope: TemplateScope; - children: Node[]; constructor(component, parent, scope, info) { super(component, parent, scope, info); @@ -14,7 +11,7 @@ export default class CatchBlock extends Node { this.scope = scope.child(); this.scope.add(parent.error, parent.expression.dependencies, this); this.children = map_children(component, parent, this.scope, info.children); - + this.warn_if_empty_block(); } -} \ No newline at end of file +} diff --git a/src/compile/nodes/EachBlock.ts b/src/compile/nodes/EachBlock.ts index ce9b63fe47..d143cdd1ec 100644 --- a/src/compile/nodes/EachBlock.ts +++ b/src/compile/nodes/EachBlock.ts @@ -1,9 +1,9 @@ import Node from './shared/Node'; import ElseBlock from './ElseBlock'; -import Block from '../render-dom/Block'; import Expression from './shared/Expression'; import map_children from './shared/map_children'; import TemplateScope from './shared/TemplateScope'; +import AbstractBlock from './shared/AbstractBlock'; import { Node as INode } from '../../interfaces'; function unpack_destructuring(contexts: Array<{ name: string, tail: string }>, node: INode, tail: string) { @@ -25,10 +25,9 @@ function unpack_destructuring(contexts: Array<{ name: string, tail: string }>, n } } -export default class EachBlock extends Node { +export default class EachBlock extends AbstractBlock { type: 'EachBlock'; - block: Block; expression: Expression; context_node: Node; @@ -41,7 +40,6 @@ export default class EachBlock extends Node { has_animation: boolean; has_binding = false; - children: Node[]; else?: ElseBlock; constructor(component, parent, scope, info) { @@ -85,7 +83,7 @@ export default class EachBlock extends Node { } } - this.warn_if_empty_block(); // TODO would be better if EachBlock, IfBlock etc extended an abstract Block class + this.warn_if_empty_block(); this.else = info.else ? new ElseBlock(component, this, this.scope, info.else) diff --git a/src/compile/nodes/ElseBlock.ts b/src/compile/nodes/ElseBlock.ts index 90886f8fdc..61c1aa5455 100644 --- a/src/compile/nodes/ElseBlock.ts +++ b/src/compile/nodes/ElseBlock.ts @@ -1,11 +1,8 @@ -import Node from './shared/Node'; -import Block from '../render-dom/Block'; import map_children from './shared/map_children'; +import AbstractBlock from './shared/AbstractBlock'; -export default class ElseBlock extends Node { +export default class ElseBlock extends AbstractBlock { type: 'ElseBlock'; - children: Node[]; - block: Block; constructor(component, parent, scope, info) { super(component, parent, scope, info); @@ -13,4 +10,4 @@ export default class ElseBlock extends Node { this.warn_if_empty_block(); } -} \ No newline at end of file +} diff --git a/src/compile/nodes/IfBlock.ts b/src/compile/nodes/IfBlock.ts index 5b79d16385..ae6aede834 100644 --- a/src/compile/nodes/IfBlock.ts +++ b/src/compile/nodes/IfBlock.ts @@ -1,17 +1,13 @@ -import Node from './shared/Node'; import ElseBlock from './ElseBlock'; -import Block from '../render-dom/Block'; import Expression from './shared/Expression'; import map_children from './shared/map_children'; +import AbstractBlock from './shared/AbstractBlock'; -export default class IfBlock extends Node { +export default class IfBlock extends AbstractBlock { type: 'IfBlock'; expression: Expression; - children: any[]; else: ElseBlock; - block: Block; - constructor(component, parent, scope, info) { super(component, parent, scope, info); @@ -24,4 +20,4 @@ export default class IfBlock extends Node { this.warn_if_empty_block(); } -} \ No newline at end of file +} diff --git a/src/compile/nodes/PendingBlock.ts b/src/compile/nodes/PendingBlock.ts index 720442fab6..688039c2ec 100644 --- a/src/compile/nodes/PendingBlock.ts +++ b/src/compile/nodes/PendingBlock.ts @@ -1,10 +1,7 @@ -import Node from './shared/Node'; -import Block from '../render-dom/Block'; import map_children from './shared/map_children'; +import AbstractBlock from './shared/AbstractBlock'; -export default class PendingBlock extends Node { - block: Block; - children: Node[]; +export default class PendingBlock extends AbstractBlock { constructor(component, parent, scope, info) { super(component, parent, scope, info); @@ -12,4 +9,4 @@ export default class PendingBlock extends Node { this.warn_if_empty_block(); } -} \ No newline at end of file +} diff --git a/src/compile/nodes/ThenBlock.ts b/src/compile/nodes/ThenBlock.ts index 54319a7ae5..d8d251e1d7 100644 --- a/src/compile/nodes/ThenBlock.ts +++ b/src/compile/nodes/ThenBlock.ts @@ -1,12 +1,9 @@ -import Node from './shared/Node'; -import Block from '../render-dom/Block'; import map_children from './shared/map_children'; import TemplateScope from './shared/TemplateScope'; +import AbstractBlock from './shared/AbstractBlock'; -export default class ThenBlock extends Node { - block: Block; +export default class ThenBlock extends AbstractBlock { scope: TemplateScope; - children: Node[]; constructor(component, parent, scope, info) { super(component, parent, scope, info); @@ -17,4 +14,4 @@ export default class ThenBlock extends Node { this.warn_if_empty_block(); } -} \ No newline at end of file +} diff --git a/src/compile/nodes/shared/AbstractBlock.ts b/src/compile/nodes/shared/AbstractBlock.ts new file mode 100644 index 0000000000..1dfebd51f0 --- /dev/null +++ b/src/compile/nodes/shared/AbstractBlock.ts @@ -0,0 +1,25 @@ +import Block from '../../render-dom/Block'; +import Component from './../../Component'; +import Node from './Node'; + +export default class AbstractBlock extends Node { + block: Block; + children: Node[]; + + constructor(component: Component, parent, scope, info: any) { + super(component, parent, scope, info); + } + + warn_if_empty_block() { + if (!this.children || this.children.length > 1) return; + + const child = this.children[0]; + + if (!child || (child.type === 'Text' && !/[^ \r\n\f\v\t]/.test(child.data))) { + this.component.warn(this, { + code: 'empty-block', + message: 'Empty block' + }); + } + } +} diff --git a/src/compile/nodes/shared/Node.ts b/src/compile/nodes/shared/Node.ts index 92c1cc40d7..b6eaf9965d 100644 --- a/src/compile/nodes/shared/Node.ts +++ b/src/compile/nodes/shared/Node.ts @@ -1,3 +1,4 @@ +import Attribute from './../Attribute'; import Component from './../../Component'; export default class Node { @@ -12,6 +13,7 @@ export default class Node { can_use_innerhtml: boolean; var: string; + attributes: Attribute[]; constructor(component: Component, parent, scope, info: any) { this.start = info.start; @@ -64,18 +66,4 @@ export default class Node { this.parent.type === type || this.parent.has_ancestor(type) : false; } - - warn_if_empty_block() { - if (!/Block$/.test(this.type) || !this.children) return; - if (this.children.length > 1) return; - - const child = this.children[0]; - - if (!child || (child.type === 'Text' && !/[^ \r\n\f\v\t]/.test(child.data))) { - this.component.warn(this, { - code: 'empty-block', - message: 'Empty block' - }); - } - } }