chore: remove static value handling (#9571)

The deleted code ensured that a static variable wouldn't update when it's in the same text expression as a reactive variable. We solved this through emitting a warning about this instead, marking it as undefined behavior.
pull/9650/head
Rich Harris 7 months ago committed by GitHub
parent 5836c1cdbd
commit 48e78e420f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,5 @@
---
'svelte': patch
---
chore: prevent some unused variable creation

@ -1598,37 +1598,8 @@ function serialize_template_literal(values, visit, state) {
if (node.type === 'ExpressionTag' && node.metadata.contains_call_expression) {
contains_call_expression = true;
}
let expression = visit(node.expression);
if (node.expression.type === 'Identifier') {
const name = node.expression.name;
const binding = scope.get(name);
// When we combine expressions as part of a single template element, we might
// be referencing variables that can be mutated, but are not actually state.
// In order to prevent this undesired behavior, we need ensure we cache the
// latest value we have of that variable before we process the template, enforcing
// the value remains static through the lifetime of the template.
if (binding !== null && binding.kind === 'normal' && binding.mutated) {
let has_already_cached = false;
// Check if we already create a const of this expression
for (let node of state.init) {
if (
node.type === 'VariableDeclaration' &&
node.declarations[0].id.type === 'Identifier' &&
node.declarations[0].id.name === name + '_const'
) {
has_already_cached = true;
expression = b.id(name + '_const');
break;
}
}
if (!has_already_cached) {
const tmp_id = scope.generate(name + '_const');
state.init.push(b.const(tmp_id, expression));
expression = b.id(tmp_id);
}
}
}
expressions.push(b.call('$.stringify', expression));
expressions.push(b.call('$.stringify', visit(node.expression)));
quasis.push(b.quasi('', i + 1 === values.length));
}
}

Loading…
Cancel
Save