diff --git a/.changeset/gentle-toys-chew.md b/.changeset/gentle-toys-chew.md new file mode 100644 index 000000000000..dfc9f2013be5 --- /dev/null +++ b/.changeset/gentle-toys-chew.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: allow to access private fields after `this` reassignment diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/global.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/global.js index 811407b35b84..e229b5edf772 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/global.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/global.js @@ -13,15 +13,13 @@ export const global_visitors = { } }, MemberExpression(node, { state, next }) { - if (node.object.type === 'ThisExpression') { - // rewrite `this.#foo` as `this.#foo.v` inside a constructor - if (node.property.type === 'PrivateIdentifier') { - const field = state.private_state.get(node.property.name); - if (field) { - return state.in_constructor ? b.member(node, b.id('v')) : b.call('$.get', node); - } + // rewrite `this.#foo` as `this.#foo.v` inside a constructor + if (node.property.type === 'PrivateIdentifier') { + const field = state.private_state.get(node.property.name); + if (field) { + return state.in_constructor ? b.member(node, b.id('v')) : b.call('$.get', node); } - + } else if (node.object.type === 'ThisExpression') { // rewrite `this.foo` as `this.#foo.v` inside a constructor if (node.property.type === 'Identifier' && !node.computed) { const field = state.public_state.get(node.property.name); diff --git a/packages/svelte/tests/runtime-runes/samples/class-private-fields-reassigned-this/_config.js b/packages/svelte/tests/runtime-runes/samples/class-private-fields-reassigned-this/_config.js new file mode 100644 index 000000000000..88b806c0f085 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/class-private-fields-reassigned-this/_config.js @@ -0,0 +1,10 @@ +import { test } from '../../test'; + +export default test({ + compileOptions: { + dev: true + }, + async test({ assert, logs }) { + assert.deepEqual(logs, ['init', 1, 'init', 1]); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/class-private-fields-reassigned-this/main.svelte b/packages/svelte/tests/runtime-runes/samples/class-private-fields-reassigned-this/main.svelte new file mode 100644 index 000000000000..fad50c5fe19c --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/class-private-fields-reassigned-this/main.svelte @@ -0,0 +1,23 @@ +