diff --git a/packages/svelte/src/compiler/phases/scope.js b/packages/svelte/src/compiler/phases/scope.js index f0885f8545..1c2f8ccf5c 100644 --- a/packages/svelte/src/compiler/phases/scope.js +++ b/packages/svelte/src/compiler/phases/scope.js @@ -1183,7 +1183,21 @@ export function create_scopes(ast, root, allow_reactive_declarations, parent) { ]); } for (const reference of answer.references) { - if (reference.declares) continue; + if (reference.declares) { + // `var x` again: the declarator declares the binding the first one made + const ours = reference.binding === null ? undefined : from_parser.get(reference.binding); + /** @type {any} */ + let declarator = parentOf(reference.node); + while (declarator && /Pattern$|^Property$|^RestElement$/.test(declarator.type)) { + declarator = parentOf(declarator); + } + if (ours && declarator?.type === 'VariableDeclarator') { + declarators.push([declarator, ours]); + // an initializer there assigns again, so the first one is not the value + if (reference.write) ours.reassigned = true; + } + continue; + } const binding = reference.binding === null ? undefined : from_parser.get(reference.binding); entries.push([ reference.node, diff --git a/packages/svelte/tests/runtime-legacy/samples/var-redeclared/_config.js b/packages/svelte/tests/runtime-legacy/samples/var-redeclared/_config.js new file mode 100644 index 0000000000..a2414b8830 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/var-redeclared/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + html: '

42 3 4

' +}); diff --git a/packages/svelte/tests/runtime-legacy/samples/var-redeclared/main.svelte b/packages/svelte/tests/runtime-legacy/samples/var-redeclared/main.svelte new file mode 100644 index 0000000000..01a98b23bc --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/var-redeclared/main.svelte @@ -0,0 +1,9 @@ + + +

{test} {a} {c}