From 135f4439c300b4bb996782e90f9d610b3373d574 Mon Sep 17 00:00:00 2001 From: Yuichiro Yamashita Date: Fri, 14 Aug 2026 14:49:51 +0900 Subject: [PATCH] fix: increment private state fields through a non-`this` receiver (#18622) --- .changeset/quiet-donkeys-clap.md | 5 ++++ .../client/visitors/UpdateExpression.js | 1 - .../_config.js | 22 ++++++++++++++++++ .../main.svelte | 23 +++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 .changeset/quiet-donkeys-clap.md create mode 100644 packages/svelte/tests/runtime-runes/samples/class-private-state-increment-other-receiver/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/class-private-state-increment-other-receiver/main.svelte diff --git a/.changeset/quiet-donkeys-clap.md b/.changeset/quiet-donkeys-clap.md new file mode 100644 index 0000000000..dc9df3b7e1 --- /dev/null +++ b/.changeset/quiet-donkeys-clap.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: increment private state fields through a non-`this` receiver diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/UpdateExpression.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/UpdateExpression.js index 66952eb298..bc483daaed 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/UpdateExpression.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/UpdateExpression.js @@ -13,7 +13,6 @@ export function UpdateExpression(node, context) { if ( argument.type === 'MemberExpression' && - argument.object.type === 'ThisExpression' && argument.property.type === 'PrivateIdentifier' && context.state.state_fields.has('#' + argument.property.name) ) { diff --git a/packages/svelte/tests/runtime-runes/samples/class-private-state-increment-other-receiver/_config.js b/packages/svelte/tests/runtime-runes/samples/class-private-state-increment-other-receiver/_config.js new file mode 100644 index 0000000000..8f023b602a --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/class-private-state-increment-other-receiver/_config.js @@ -0,0 +1,22 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test'; + +export default test({ + html: ``, + + test({ assert, target }) { + const [bump, drop] = target.querySelectorAll('button'); + + bump?.click(); + flushSync(); + assert.htmlEqual(target.innerHTML, ``); + + bump?.click(); + flushSync(); + assert.htmlEqual(target.innerHTML, ``); + + drop?.click(); + flushSync(); + assert.htmlEqual(target.innerHTML, ``); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/class-private-state-increment-other-receiver/main.svelte b/packages/svelte/tests/runtime-runes/samples/class-private-state-increment-other-receiver/main.svelte new file mode 100644 index 0000000000..67827aceee --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/class-private-state-increment-other-receiver/main.svelte @@ -0,0 +1,23 @@ + + + +