From 8c7ad3c5a394f6efb0fcb981177a7d8a37105632 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 15 May 2025 14:30:23 -0400 Subject: [PATCH] disallow computed state fields --- .../2-analyze/visitors/shared/class-analysis.js | 2 +- .../samples/class-state-constructor-7/errors.json | 14 ++++++++++++++ .../class-state-constructor-7/input.svelte.js | 7 +++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 packages/svelte/tests/validator/samples/class-state-constructor-7/errors.json create mode 100644 packages/svelte/tests/validator/samples/class-state-constructor-7/input.svelte.js diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/class-analysis.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/class-analysis.js index 02b585fd4d..27be9261f8 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/class-analysis.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/class-analysis.js @@ -88,7 +88,7 @@ export class ClassAnalysis { node.operator === '=' && node.left.type === 'MemberExpression' && node.left.object.type === 'ThisExpression' && - (node.left.property.type === 'Identifier' || + ((node.left.property.type === 'Identifier' && !node.left.computed) || node.left.property.type === 'PrivateIdentifier' || node.left.property.type === 'Literal') ) diff --git a/packages/svelte/tests/validator/samples/class-state-constructor-7/errors.json b/packages/svelte/tests/validator/samples/class-state-constructor-7/errors.json new file mode 100644 index 0000000000..64e56f8d5c --- /dev/null +++ b/packages/svelte/tests/validator/samples/class-state-constructor-7/errors.json @@ -0,0 +1,14 @@ +[ + { + "code": "state_invalid_placement", + "message": "`$state(...)` can only be used as a variable declaration initializer, a class field declaration, or the first assignment to a class field at the top level of the constructor.", + "start": { + "line": 5, + "column": 16 + }, + "end": { + "line": 5, + "column": 25 + } + } +] diff --git a/packages/svelte/tests/validator/samples/class-state-constructor-7/input.svelte.js b/packages/svelte/tests/validator/samples/class-state-constructor-7/input.svelte.js new file mode 100644 index 0000000000..50c8559837 --- /dev/null +++ b/packages/svelte/tests/validator/samples/class-state-constructor-7/input.svelte.js @@ -0,0 +1,7 @@ +const count = 'count'; + +export class Counter { + constructor() { + this[count] = $state(0); + } +}