diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/ClassBody.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/ClassBody.js index cb609bd1b3..2bfc1dbce3 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/ClassBody.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/ClassBody.js @@ -33,7 +33,7 @@ export function ClassBody(node, context) { /** @type {Map} */ const state_fields = new Map(); - /** @type {Map>} */ + /** @type {Map>} */ const fields = new Map(); context.state.analysis.classes.set(node, state_fields); @@ -60,7 +60,8 @@ export function ClassBody(node, context) { const _key = (key.type === 'PrivateIdentifier' ? '#' : '') + name; const field = fields.get(_key); - if (field) { + // if there's already a method or assigned field, error + if (field && !(field.length === 1 && field[0] === 'prop')) { e.duplicate_class_field(node, _key); } @@ -80,7 +81,7 @@ export function ClassBody(node, context) { const key = (child.key.type === 'PrivateIdentifier' ? '#' : '') + get_name(child.key); const field = fields.get(key); if (!field) { - fields.set(key, ['prop']); + fields.set(key, [child.value ? 'assigned_prop' : 'prop']); continue; } e.duplicate_class_field(child, key); @@ -96,7 +97,11 @@ export function ClassBody(node, context) { fields.set(key, [child.kind]); continue; } - if (field.includes(child.kind) || field.includes('prop')) { + if ( + field.includes(child.kind) || + field.includes('prop') || + field.includes('assigned_prop') + ) { e.duplicate_class_field(child, key); } if (child.kind === 'get') {