From fe275cc5687fe1182f82d5f1f9ca6a7b47a81db3 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sun, 27 Jan 2019 18:12:26 -0500 Subject: [PATCH] fix some let stuff --- src/compile/nodes/Element.ts | 3 +-- src/compile/nodes/shared/Expression.ts | 10 ++++++---- src/compile/nodes/shared/TemplateScope.ts | 5 +++++ src/compile/render-dom/wrappers/Element/index.ts | 1 + .../render-dom/wrappers/InlineComponent/index.ts | 8 +++++--- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/compile/nodes/Element.ts b/src/compile/nodes/Element.ts index 362dbb784f..44e91b6408 100644 --- a/src/compile/nodes/Element.ts +++ b/src/compile/nodes/Element.ts @@ -92,7 +92,6 @@ export default class Element extends Node { constructor(component, parent, scope, info: any) { super(component, parent, scope, info); this.name = info.name; - this.scope = scope; const parentElement = parent.findNearest(/^Element/); this.namespace = this.name === 'svg' ? @@ -196,7 +195,7 @@ export default class Element extends Node { const dependencies = new Set([l.name]); l.names.forEach(name => { - this.scope.add(name, dependencies); + this.scope.add(name, dependencies, this); }); }); } else { diff --git a/src/compile/nodes/shared/Expression.ts b/src/compile/nodes/shared/Expression.ts index 061ddebeb7..fab40ccdc2 100644 --- a/src/compile/nodes/shared/Expression.ts +++ b/src/compile/nodes/shared/Expression.ts @@ -124,7 +124,11 @@ export default class Expression { if (scope.has(name)) return; if (globalWhitelist.has(name) && component.declarations.indexOf(name) === -1) return; - if (template_scope.names.has(name)) { + if (template_scope.is_let(name)) { + if (!function_expression) { + dependencies.add(name); + } + } else if (template_scope.names.has(name)) { expression.usesContext = true; contextual_dependencies.add(name); @@ -188,9 +192,7 @@ export default class Expression { dynamic_dependencies() { return Array.from(this.dependencies).filter(name => { - const owner = this.template_scope.getOwner(name); - const is_let = owner && (owner.type === 'InlineComponent' || owner.type === 'Element'); - if (is_let) return true; + if (this.template_scope.is_let(name)) return true; const variable = this.component.var_lookup.get(name); return variable.mutated; diff --git a/src/compile/nodes/shared/TemplateScope.ts b/src/compile/nodes/shared/TemplateScope.ts index 24b9d1830b..70522c88ed 100644 --- a/src/compile/nodes/shared/TemplateScope.ts +++ b/src/compile/nodes/shared/TemplateScope.ts @@ -37,4 +37,9 @@ export default class TemplateScope { getOwner(name: string): NodeWithScope { return this.owners.get(name) || (this.parent && this.parent.getOwner(name)); } + + is_let(name: string) { + const owner = this.getOwner(name); + return owner && (owner.type === 'Element' || owner.type === 'InlineComponent'); + } } \ No newline at end of file diff --git a/src/compile/render-dom/wrappers/Element/index.ts b/src/compile/render-dom/wrappers/Element/index.ts index 8f3e92e104..e71ba4b9cd 100644 --- a/src/compile/render-dom/wrappers/Element/index.ts +++ b/src/compile/render-dom/wrappers/Element/index.ts @@ -141,6 +141,7 @@ export default class ElementWrapper extends Wrapper { (owner as InlineComponentWrapper).slots.set(name, { block: child_block, + scope: this.node.scope, fn }); this.renderer.blocks.push(child_block); diff --git a/src/compile/render-dom/wrappers/InlineComponent/index.ts b/src/compile/render-dom/wrappers/InlineComponent/index.ts index 1b90aa2f69..4098b76c34 100644 --- a/src/compile/render-dom/wrappers/InlineComponent/index.ts +++ b/src/compile/render-dom/wrappers/InlineComponent/index.ts @@ -15,10 +15,11 @@ import createDebuggingComment from '../../../../utils/createDebuggingComment'; import sanitize from '../../../../utils/sanitize'; import { get_context_merger } from '../shared/get_context_merger'; import EachBlock from '../../../nodes/EachBlock'; +import TemplateScope from '../../../nodes/shared/TemplateScope'; export default class InlineComponentWrapper extends Wrapper { var: string; - slots: Map = new Map(); + slots: Map = new Map(); node: InlineComponent; fragment: FragmentWrapper; @@ -79,6 +80,7 @@ export default class InlineComponentWrapper extends Wrapper { this.slots.set('default', { block: default_slot, + scope: this.node.scope, fn }); this.fragment = new FragmentWrapper(renderer, default_slot, node.children, this, stripWhitespace, nextSibling); @@ -145,9 +147,9 @@ export default class InlineComponentWrapper extends Wrapper { } const fragment_dependencies = new Set(); - this.slots.forEach(slot => { + this.slots.forEach((slot, name) => { slot.block.dependencies.forEach(name => { - const is_let = this.node.lets.some(l => l.names.indexOf(name) !== -1); + const is_let = slot.scope.is_let(name); const variable = renderer.component.var_lookup.get(name); if (is_let || variable.mutated) {