diff --git a/src/compiler/compile/Component.ts b/src/compiler/compile/Component.ts index 8ed8e3390d..2e0fb9bb49 100644 --- a/src/compiler/compile/Component.ts +++ b/src/compiler/compile/Component.ts @@ -789,7 +789,7 @@ export default class Component { } let deep = false; - let names: string[] | null; + let names: string[] | undefined; if (node.type === 'AssignmentExpression') { deep = node.left.type === 'MemberExpression'; @@ -801,11 +801,21 @@ export default class Component { const { name } = get_object(node.argument); names = [name]; } - + if (names) { names.forEach(name => { - const variable = component.var_lookup.get(name); - if (variable && variable.writable === false && !deep) { + let current_scope = scope; + let declaration; + + while (current_scope) { + if (current_scope.declarations.has(name)) { + declaration = current_scope.declarations.get(name); + break; + } + current_scope = current_scope.parent; + } + + if (declaration && declaration.kind === 'const' && !deep) { component.error(node as any, { code: 'assignment-to-const', message: 'You are assigning to a const' diff --git a/src/compiler/compile/nodes/shared/Expression.ts b/src/compiler/compile/nodes/shared/Expression.ts index c105bc0e55..4410943a31 100644 --- a/src/compiler/compile/nodes/shared/Expression.ts +++ b/src/compiler/compile/nodes/shared/Expression.ts @@ -151,13 +151,29 @@ export default class Expression { if (variable) { variable[deep ? 'mutated' : 'reassigned'] = true; + } + + let current_scope = scope; + let declaration; - if (!deep && variable.writable === false) { - component.error(node as any, { - code: 'assignment-to-const', - message: 'You are assigning to a const' - }); + while (current_scope) { + if (current_scope.declarations.has(name)) { + declaration = current_scope.declarations.get(name); + break; } + current_scope = current_scope.parent; + } + + if (declaration && declaration.kind === 'const' && !deep) { + component.error(node as any, { + code: 'assignment-to-const', + message: 'You are assigning to a const' + }); + } else if (variable && variable.writable === false && !deep) { + component.error(node as any, { + code: 'assignment-to-const', + message: 'You are assigning to a const' + }); } } });