From 3ced3c13253c9208edca37d5dacdc330534f5947 Mon Sep 17 00:00:00 2001 From: Mikhail Korepanov Date: Sat, 9 Mar 2019 19:21:05 +0300 Subject: [PATCH] Don't invalidate `this`. Fixes #2184 --- src/compile/render-dom/index.ts | 11 +++-- .../samples/dont-invalidate-this/expected.js | 42 +++++++++++++++++++ .../samples/dont-invalidate-this/input.svelte | 6 +++ 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 test/js/samples/dont-invalidate-this/expected.js create mode 100644 test/js/samples/dont-invalidate-this/input.svelte diff --git a/src/compile/render-dom/index.ts b/src/compile/render-dom/index.ts index 067288c0f5..663006d508 100644 --- a/src/compile/render-dom/index.ts +++ b/src/compile/render-dom/index.ts @@ -165,9 +165,14 @@ export default function dom( } if (node.type === 'AssignmentExpression') { - const names = node.left.type === 'MemberExpression' - ? [getObject(node.left).name] - : extractNames(node.left); + let names = []; + + if (node.left.type === 'MemberExpression') { + const left_object_name = getObject(node.left).name; + left_object_name && (names = [left_object_name]); + } else { + names = extractNames(node.left); + } if (node.operator === '=' && nodes_match(node.left, node.right)) { const dirty = names.filter(name => { diff --git a/test/js/samples/dont-invalidate-this/expected.js b/test/js/samples/dont-invalidate-this/expected.js new file mode 100644 index 0000000000..db21ccdd64 --- /dev/null +++ b/test/js/samples/dont-invalidate-this/expected.js @@ -0,0 +1,42 @@ +/* generated by Svelte vX.Y.Z */ +import { SvelteComponent as SvelteComponent_1, addListener, createElement, detachNode, init, insert, noop, safe_not_equal } from "svelte/internal"; + +function create_fragment(ctx) { + var input, dispose; + + return { + c() { + input = createElement("input"); + dispose = addListener(input, "input", make_uppercase); + }, + + m(target, anchor) { + insert(target, input, anchor); + }, + + p: noop, + i: noop, + o: noop, + + d(detach) { + if (detach) { + detachNode(input); + } + + dispose(); + } + }; +} + +function make_uppercase() { + this.value = this.value.toUpperCase(); +} + +class SvelteComponent extends SvelteComponent_1 { + constructor(options) { + super(); + init(this, options, null, create_fragment, safe_not_equal); + } +} + +export default SvelteComponent; diff --git a/test/js/samples/dont-invalidate-this/input.svelte b/test/js/samples/dont-invalidate-this/input.svelte new file mode 100644 index 0000000000..5b0a565a3a --- /dev/null +++ b/test/js/samples/dont-invalidate-this/input.svelte @@ -0,0 +1,6 @@ + +