fix: improve code generation

pull/10156/head
Dominic Gannaway 3 years ago
parent a1a3e819c9
commit ec57acd07e

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: improve code generation

@ -217,9 +217,10 @@ function is_expression_async(expression) {
* @param {import('estree').AssignmentExpression} node
* @param {import('zimmerframe').Context<import('#compiler').SvelteNode, State>} context
* @param {() => any} fallback
* @param {{skip_proxy_and_freeze?: boolean}} [options]
* @returns {import('estree').Expression}
*/
export function serialize_set_binding(node, context, fallback) {
export function serialize_set_binding(node, context, fallback, options) {
const { state, visit } = context;
if (
@ -242,7 +243,7 @@ export function serialize_set_binding(node, context, fallback) {
const value = path.expression?.(b.id(tmp_id));
const assignment = b.assignment('=', path.node, value);
original_assignments.push(assignment);
assignments.push(serialize_set_binding(assignment, context, () => assignment));
assignments.push(serialize_set_binding(assignment, context, () => assignment, options));
}
if (assignments.every((assignment, i) => assignment === original_assignments[i])) {
@ -288,7 +289,11 @@ export function serialize_set_binding(node, context, fallback) {
if (private_state !== undefined) {
if (state.in_constructor) {
// See if we should wrap value in $.proxy
if (context.state.analysis.runes && should_proxy_or_freeze(value)) {
if (
context.state.analysis.runes &&
!options?.skip_proxy_and_freeze &&
should_proxy_or_freeze(value)
) {
const assignment = fallback();
if (assignment.type === 'AssignmentExpression') {
assignment.right =
@ -302,7 +307,9 @@ export function serialize_set_binding(node, context, fallback) {
return b.call(
'$.set',
left,
context.state.analysis.runes && should_proxy_or_freeze(value)
context.state.analysis.runes &&
!options?.skip_proxy_and_freeze &&
should_proxy_or_freeze(value)
? private_state.kind === 'frozen_state'
? b.call('$.freeze', value)
: b.call('$.proxy', value)
@ -321,6 +328,7 @@ export function serialize_set_binding(node, context, fallback) {
if (
context.state.analysis.runes &&
public_state !== undefined &&
!options?.skip_proxy_and_freeze &&
should_proxy_or_freeze(value)
) {
const assignment = fallback();
@ -387,7 +395,9 @@ export function serialize_set_binding(node, context, fallback) {
return b.call(
'$.set',
b.id(left_name),
context.state.analysis.runes && should_proxy_or_freeze(value)
context.state.analysis.runes &&
!options?.skip_proxy_and_freeze &&
should_proxy_or_freeze(value)
? b.call('$.proxy', value)
: value
);
@ -395,7 +405,9 @@ export function serialize_set_binding(node, context, fallback) {
return b.call(
'$.set',
b.id(left_name),
context.state.analysis.runes && should_proxy_or_freeze(value)
context.state.analysis.runes &&
!options?.skip_proxy_and_freeze &&
should_proxy_or_freeze(value)
? b.call('$.freeze', value)
: value
);
@ -624,6 +636,5 @@ export function should_proxy_or_freeze(node) {
) {
return false;
}
return true;
}

@ -2604,7 +2604,10 @@ export const template_visitors = {
serialize_set_binding(
assignment,
context,
() => /** @type {import('estree').Expression} */ (context.visit(assignment))
() => /** @type {import('estree').Expression} */ (context.visit(assignment)),
{
skip_proxy_and_freeze: true,
}
)
);

@ -15,7 +15,9 @@
"end": 36,
"type": "StyleDirective",
"name": "color",
"modifiers": ["important"],
"modifiers": [
"important"
],
"value": [
{
"type": "MustacheTag",
@ -45,4 +47,4 @@
}
]
}
}
}

@ -9,8 +9,11 @@
"start": 0,
"end": 30,
"data": " svelte-ignore foo bar ",
"ignores": ["foo", "bar"]
"ignores": [
"foo",
"bar"
]
}
]
}
}
}

@ -81,4 +81,4 @@
"styles": "\n\tdiv {\n\t\tcolor: red;\n\t}\n"
}
}
}
}

@ -81,4 +81,4 @@
"styles": "\n\tdiv {\n\t\tcolor: red;\n\t}\n"
}
}
}
}

@ -907,4 +907,4 @@
"transparent": false
},
"options": null
}
}

@ -327,4 +327,4 @@
"transparent": false
},
"options": null
}
}

@ -29,8 +29,8 @@ export default function State_proxy_literal($$anchor, $$props) {
var button = $.sibling($.sibling(input));
$.bind_value(node, () => $.get(str), ($$value) => $.set(str, $.proxy($$value)));
$.bind_value(input, () => $.get(tpl), ($$value) => $.set(tpl, $.proxy($$value)));
$.bind_value(node, () => $.get(str), ($$value) => $.set(str, $$value));
$.bind_value(input, () => $.get(tpl), ($$value) => $.set(tpl, $$value));
button.__click = [reset, str, tpl];
$.close_frag($$anchor, fragment);
$.pop();

Loading…
Cancel
Save