diff --git a/src/compiler/compile/Component.ts b/src/compiler/compile/Component.ts index 202e14fd98..f0e45942e2 100644 --- a/src/compiler/compile/Component.ts +++ b/src/compiler/compile/Component.ts @@ -844,7 +844,7 @@ export default class Component { scope = map.get(node); } - if (node.type === 'AssignmentExpression' || node.type === 'UpdateExpression') { + if (node.type === 'AssignmentExpression' || node.type === 'UpdateExpression' || (node.type === 'UnaryExpression' && node.operator === 'delete')) { const assignee = node.type === 'AssignmentExpression' ? node.left : node.argument; const names = extract_names(assignee as Node); @@ -1303,7 +1303,7 @@ export default class Component { if (node.operator !== '=') { dependencies.add(left.name); } - } else if (node.type === 'UpdateExpression') { + } else if (node.type === 'UpdateExpression' || (node.type === 'UnaryExpression' && node.operator === 'delete')) { const identifier = get_object(node.argument); assignees.add(identifier.name); } else if (is_reference(node as NodeWithPropertyDefinition, parent as NodeWithPropertyDefinition)) { diff --git a/src/compiler/compile/nodes/shared/Expression.ts b/src/compiler/compile/nodes/shared/Expression.ts index 7c6fc39185..adb9028696 100644 --- a/src/compiler/compile/nodes/shared/Expression.ts +++ b/src/compiler/compile/nodes/shared/Expression.ts @@ -125,7 +125,7 @@ export default class Expression { if (node.type === 'AssignmentExpression') { deep = node.left.type === 'MemberExpression'; names = extract_names(deep ? get_object(node.left) : node.left); - } else if (node.type === 'UpdateExpression') { + } else if (node.type === 'UpdateExpression' || (node.type === 'UnaryExpression' && node.operator === 'delete')) { names = extract_names(get_object(node.argument)); } } @@ -343,7 +343,7 @@ export default class Expression { } } - if (node.type === 'AssignmentExpression' || node.type === 'UpdateExpression') { + if (node.type === 'AssignmentExpression' || node.type === 'UpdateExpression' || (node.type === 'UnaryExpression' && node.operator === 'delete')) { const assignee = node.type === 'AssignmentExpression' ? node.left : node.argument; const object_name = get_object(assignee).name; diff --git a/src/compiler/compile/render_dom/index.ts b/src/compiler/compile/render_dom/index.ts index f74f4cdf1c..76110984ed 100644 --- a/src/compiler/compile/render_dom/index.ts +++ b/src/compiler/compile/render_dom/index.ts @@ -283,7 +283,7 @@ export default function dom( execution_context = null; } - if (node.type === 'AssignmentExpression' || node.type === 'UpdateExpression') { + if (node.type === 'AssignmentExpression' || node.type === 'UpdateExpression' || (node.type === 'UnaryExpression' && node.operator === 'delete')) { const assignee = node.type === 'AssignmentExpression' ? node.left : node.argument; // normally (`a = 1`, `b.c = 2`), there'll be a single name diff --git a/src/compiler/compile/render_dom/invalidate.ts b/src/compiler/compile/render_dom/invalidate.ts index 7eeb34a894..80a2093794 100644 --- a/src/compiler/compile/render_dom/invalidate.ts +++ b/src/compiler/compile/render_dom/invalidate.ts @@ -58,7 +58,8 @@ export function invalidate(renderer: Renderer, scope: Scope, node: Node, names: const pass_value = ( extra_args.length > 0 || (node.type === 'AssignmentExpression' && node.left.type !== 'Identifier') || - (node.type === 'UpdateExpression' && (!node.prefix || node.argument.type !== 'Identifier')) + (node.type === 'UpdateExpression' && (!node.prefix || node.argument.type !== 'Identifier')) || + (node.type === 'UnaryExpression' && node.operator === 'delete' && (!node.prefix || node.argument.type !== 'Identifier')) ); if (pass_value) { extra_args.unshift({ diff --git a/test/js/samples/reactive-delete/expected.js b/test/js/samples/reactive-delete/expected.js new file mode 100644 index 0000000000..12dcf0f339 --- /dev/null +++ b/test/js/samples/reactive-delete/expected.js @@ -0,0 +1,31 @@ +/* generated by Svelte vX.Y.Z */ +import { SvelteComponent, init, safe_not_equal } from "svelte/internal"; + +function instance($$self, $$props, $$invalidate) { + const a = { b: true }; + + function removeB() { + $$invalidate(1, delete a.b, a); + } + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*a*/ 2) { + $: console.log(a.b); + } + }; + + return [removeB, a]; +} + +class Component extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, null, safe_not_equal, { removeB: 0 }); + } + + get removeB() { + return this.$$.ctx[0]; + } +} + +export default Component; \ No newline at end of file diff --git a/test/js/samples/reactive-delete/input.svelte b/test/js/samples/reactive-delete/input.svelte new file mode 100644 index 0000000000..02c0bc839d --- /dev/null +++ b/test/js/samples/reactive-delete/input.svelte @@ -0,0 +1,9 @@ +