diff --git a/src/compile/Component.ts b/src/compile/Component.ts index 613c038da5..8d32e7a2cd 100644 --- a/src/compile/Component.ts +++ b/src/compile/Component.ts @@ -62,7 +62,6 @@ export default class Component { module_javascript: string; javascript: string; - imported_declarations: Set = new Set(); hoistable_nodes: Set = new Set(); node_for_declaration: Map = new Map(); partly_hoisted: string[] = []; @@ -422,8 +421,6 @@ export default class Component { module: is_module, hoistable: true }); - - this.imported_declarations.add(specifier.local.name); }); } }); @@ -837,7 +834,7 @@ export default class Component { // reference instance variables other than other // hoistable functions. TODO others? - const { hoistable_nodes, imported_declarations, var_lookup } = this; + const { hoistable_nodes, var_lookup } = this; const top_level_function_declarations = new Map(); diff --git a/src/compile/nodes/shared/Expression.ts b/src/compile/nodes/shared/Expression.ts index 956106a84d..eb5f7a6e7c 100644 --- a/src/compile/nodes/shared/Expression.ts +++ b/src/compile/nodes/shared/Expression.ts @@ -288,7 +288,9 @@ export default class Expression { } else { names.forEach(name => { if (scope.declarations.has(name)) return; - if (component.imported_declarations.has(name)) return; + + const variable = component.var_lookup.get(name); + if (variable && variable.hoistable) return; pending_assignments.add(name); }); @@ -297,7 +299,9 @@ export default class Expression { const { name } = getObject(node.argument); if (scope.declarations.has(name)) return; - if (component.imported_declarations.has(name)) return; + + const variable = component.var_lookup.get(name); + if (variable && variable.hoistable) return; pending_assignments.add(name); } diff --git a/src/compile/render-dom/index.ts b/src/compile/render-dom/index.ts index a58c8845a2..18f8ccb844 100644 --- a/src/compile/render-dom/index.ts +++ b/src/compile/render-dom/index.ts @@ -178,9 +178,11 @@ export default function dom( code.overwrite(node.start, node.end, dirty.map(n => `$$invalidate('${n}', ${n})`).join('; ')); } else { names.forEach(name => { - if (component.imported_declarations.has(name)) return; if (scope.findOwner(name) !== component.instance_scope) return; + const variable = component.var_lookup.get(name); + if (variable && variable.hoistable) return; + pending_assignments.add(name); component.has_reactive_assignments = true; }); @@ -190,9 +192,11 @@ export default function dom( else if (node.type === 'UpdateExpression') { const { name } = getObject(node.argument); - if (component.imported_declarations.has(name)) return; if (scope.findOwner(name) !== component.instance_scope) return; + const variable = component.var_lookup.get(name); + if (variable && variable.hoistable) return; + pending_assignments.add(name); component.has_reactive_assignments = true; }