From c9e98e6bbaed9b33df8087567235de9a54fdc537 Mon Sep 17 00:00:00 2001 From: Mathias Picker <48158184+MathiasWP@users.noreply.github.com> Date: Mon, 2 Jan 2023 03:48:34 +0100 Subject: [PATCH] [fix]: remove double up initialization on svelte:element (#8142) * fixed double up initialization on svelte:element elements * updated test and fixed bug * update other svelte:element test * removed whitespace * refactor * correctly update expected ouput resulting from #7938 * remove .solo Co-authored-by: Yuichiro Yamashita --- .../render_dom/wrappers/Element/index.ts | 39 ++-- .../svelte-element-event-handlers/expected.js | 168 ++++++++++++++++++ .../input.svelte | 3 + .../js/samples/svelte-element-svg/expected.js | 43 ++--- 4 files changed, 212 insertions(+), 41 deletions(-) create mode 100644 test/js/samples/svelte-element-event-handlers/expected.js create mode 100644 test/js/samples/svelte-element-event-handlers/input.svelte diff --git a/src/compiler/compile/render_dom/wrappers/Element/index.ts b/src/compiler/compile/render_dom/wrappers/Element/index.ts index cef758b89e..8a8f59810b 100644 --- a/src/compiler/compile/render_dom/wrappers/Element/index.ts +++ b/src/compiler/compile/render_dom/wrappers/Element/index.ts @@ -170,6 +170,15 @@ export default class ElementWrapper extends Wrapper { ) { super(renderer, block, parent, node); + this.var = { + type: 'Identifier', + name: node.name.replace(regex_invalid_variable_identifier_characters, '_') + }; + + this.void = is_void(node.name); + + this.class_dependencies = []; + if (node.is_dynamic_element && block.type !== CHILD_DYNAMIC_ELEMENT_BLOCK) { this.child_dynamic_element_block = block.child({ comment: create_debugging_comment(node, renderer.component), @@ -185,16 +194,13 @@ export default class ElementWrapper extends Wrapper { strip_whitespace, next_sibling ); - } - this.var = { - type: 'Identifier', - name: node.name.replace(regex_invalid_variable_identifier_characters, '_') - }; - - this.void = is_void(node.name); - - this.class_dependencies = []; + // the original svelte:element is never used for rendering, because + // it gets assigned a child_dynamic_element which is used in all rendering logic. + // so doing all of this on the original svelte:element will just cause double + // code, because it will be done again on the child_dynamic_element. + return; + } if (this.node.children.length) { this.node.lets.forEach(l => { @@ -327,20 +333,19 @@ export default class ElementWrapper extends Wrapper { ${this.var}.p(#ctx, #dirty); } } else if (${previous_tag}) { - ${ - has_transitions - ? b` + ${has_transitions + ? b` @group_outros(); @transition_out(${this.var}, 1, 1, () => { ${this.var} = null; }); @check_outros(); ` - : b` + : b` ${this.var}.d(1); ${this.var} = null; ` - } + } } ${previous_tag} = ${tag}; `); @@ -682,9 +687,9 @@ export default class ElementWrapper extends Wrapper { function ${handler}(${params}) { ${binding_group.bindings.map(b => b.handler.mutation)} ${Array.from(dependencies) - .filter(dep => dep[0] !== '$') - .filter(dep => !contextual_dependencies.has(dep)) - .map(dep => b`${this.renderer.invalidate(dep)};`)} + .filter(dep => dep[0] !== '$') + .filter(dep => !contextual_dependencies.has(dep)) + .map(dep => b`${this.renderer.invalidate(dep)};`)} } `); diff --git a/test/js/samples/svelte-element-event-handlers/expected.js b/test/js/samples/svelte-element-event-handlers/expected.js new file mode 100644 index 0000000000..b9e648aadc --- /dev/null +++ b/test/js/samples/svelte-element-event-handlers/expected.js @@ -0,0 +1,168 @@ +/* generated by Svelte vX.Y.Z */ +import { + SvelteComponent, + append, + assign, + bubble, + detach, + element, + empty, + get_spread_update, + init, + insert, + listen, + noop, + run_all, + safe_not_equal, + set_attributes, + set_custom_element_data_map +} from "svelte/internal"; + +function create_dynamic_element(ctx) { + let svelte_element1; + let svelte_element0; + let mounted; + let dispose; + let svelte_element0_levels = [{ class: "inner" }]; + let svelte_element0_data = {}; + + for (let i = 0; i < svelte_element0_levels.length; i += 1) { + svelte_element0_data = assign(svelte_element0_data, svelte_element0_levels[i]); + } + + let svelte_element1_levels = [{ class: "outer" }]; + let svelte_element1_data = {}; + + for (let i = 0; i < svelte_element1_levels.length; i += 1) { + svelte_element1_data = assign(svelte_element1_data, svelte_element1_levels[i]); + } + + return { + c() { + svelte_element1 = element("a"); + svelte_element0 = element("span"); + + if ((/-/).test("span")) { + set_custom_element_data_map(svelte_element0, svelte_element0_data); + } else { + set_attributes(svelte_element0, svelte_element0_data); + } + + if ((/-/).test("a")) { + set_custom_element_data_map(svelte_element1, svelte_element1_data); + } else { + set_attributes(svelte_element1, svelte_element1_data); + } + }, + m(target, anchor) { + insert(target, svelte_element1, anchor); + append(svelte_element1, svelte_element0); + + if (!mounted) { + dispose = [ + listen(svelte_element0, "keydown", /*keydown_handler_1*/ ctx[2]), + listen(svelte_element0, "keyup", /*keyup_handler_1*/ ctx[3]), + listen(svelte_element1, "keydown", /*keydown_handler*/ ctx[0]), + listen(svelte_element1, "keyup", /*keyup_handler*/ ctx[1]) + ]; + + mounted = true; + } + }, + p(ctx, dirty) { + svelte_element0_data = get_spread_update(svelte_element0_levels, [{ class: "inner" }]); + + if ((/-/).test("span")) { + set_custom_element_data_map(svelte_element0, svelte_element0_data); + } else { + set_attributes(svelte_element0, svelte_element0_data); + } + + svelte_element1_data = get_spread_update(svelte_element1_levels, [{ class: "outer" }]); + + if ((/-/).test("a")) { + set_custom_element_data_map(svelte_element1, svelte_element1_data); + } else { + set_attributes(svelte_element1, svelte_element1_data); + } + }, + d(detaching) { + if (detaching) detach(svelte_element1); + mounted = false; + run_all(dispose); + } + }; +} + +function create_fragment(ctx) { + let previous_tag = "a"; + let svelte_element_anchor; + let svelte_element = "a" && create_dynamic_element(ctx); + + return { + c() { + if (svelte_element) svelte_element.c(); + svelte_element_anchor = empty(); + }, + m(target, anchor) { + if (svelte_element) svelte_element.m(target, anchor); + insert(target, svelte_element_anchor, anchor); + }, + p(ctx, [dirty]) { + if ("a") { + if (!previous_tag) { + svelte_element = create_dynamic_element(ctx); + svelte_element.c(); + svelte_element.m(svelte_element_anchor.parentNode, svelte_element_anchor); + } else if (safe_not_equal(previous_tag, "a")) { + svelte_element.d(1); + svelte_element = create_dynamic_element(ctx); + svelte_element.c(); + svelte_element.m(svelte_element_anchor.parentNode, svelte_element_anchor); + } else { + svelte_element.p(ctx, dirty); + } + } else if (previous_tag) { + svelte_element.d(1); + svelte_element = null; + } + + previous_tag = "a"; + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) detach(svelte_element_anchor); + if (svelte_element) svelte_element.d(detaching); + } + }; +} + +function instance($$self) { + function keydown_handler(event) { + bubble.call(this, $$self, event); + } + + function keyup_handler(event) { + bubble.call(this, $$self, event); + } + + function keydown_handler_1(event) { + bubble.call(this, $$self, event); + } + + function keyup_handler_1(event) { + bubble.call(this, $$self, event); + } + + return [keydown_handler, keyup_handler, keydown_handler_1, keyup_handler_1]; +} + +class Component extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal, {}); + } +} + +export default Component; \ No newline at end of file diff --git a/test/js/samples/svelte-element-event-handlers/input.svelte b/test/js/samples/svelte-element-event-handlers/input.svelte new file mode 100644 index 0000000000..bb0b7b57a9 --- /dev/null +++ b/test/js/samples/svelte-element-event-handlers/input.svelte @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/test/js/samples/svelte-element-svg/expected.js b/test/js/samples/svelte-element-svg/expected.js index 263f6c842b..7db210219b 100644 --- a/test/js/samples/svelte-element-svg/expected.js +++ b/test/js/samples/svelte-element-svg/expected.js @@ -14,11 +14,6 @@ import { svg_element } from "svelte/internal"; -function create_dynamic_element_1(ctx) { - return { c: noop, m: noop, p: noop, d: noop }; -} - -// (5:0) function create_dynamic_element(ctx) { let svelte_element1; let svelte_element0; @@ -61,35 +56,35 @@ function create_dynamic_element(ctx) { function create_fragment(ctx) { let previous_tag = /*tag*/ ctx[0].svg; - let svelte_element1_anchor; - let svelte_element1 = /*tag*/ ctx[0].svg && create_dynamic_element(ctx); + let svelte_element_anchor; + let svelte_element = /*tag*/ ctx[0].svg && create_dynamic_element(ctx); return { c() { - if (svelte_element1) svelte_element1.c(); - svelte_element1_anchor = empty(); + if (svelte_element) svelte_element.c(); + svelte_element_anchor = empty(); }, m(target, anchor) { - if (svelte_element1) svelte_element1.m(target, anchor); - insert(target, svelte_element1_anchor, anchor); + if (svelte_element) svelte_element.m(target, anchor); + insert(target, svelte_element_anchor, anchor); }, p(ctx, [dirty]) { if (/*tag*/ ctx[0].svg) { if (!previous_tag) { - svelte_element1 = create_dynamic_element(ctx); - svelte_element1.c(); - svelte_element1.m(svelte_element1_anchor.parentNode, svelte_element1_anchor); + svelte_element = create_dynamic_element(ctx); + svelte_element.c(); + svelte_element.m(svelte_element_anchor.parentNode, svelte_element_anchor); } else if (safe_not_equal(previous_tag, /*tag*/ ctx[0].svg)) { - svelte_element1.d(1); - svelte_element1 = create_dynamic_element(ctx); - svelte_element1.c(); - svelte_element1.m(svelte_element1_anchor.parentNode, svelte_element1_anchor); + svelte_element.d(1); + svelte_element = create_dynamic_element(ctx); + svelte_element.c(); + svelte_element.m(svelte_element_anchor.parentNode, svelte_element_anchor); } else { - svelte_element1.p(ctx, dirty); + svelte_element.p(ctx, dirty); } } else if (previous_tag) { - svelte_element1.d(1); - svelte_element1 = null; + svelte_element.d(1); + svelte_element = null; } previous_tag = /*tag*/ ctx[0].svg; @@ -97,8 +92,8 @@ function create_fragment(ctx) { i: noop, o: noop, d(detaching) { - if (detaching) detach(svelte_element1_anchor); - if (svelte_element1) svelte_element1.d(detaching); + if (detaching) detach(svelte_element_anchor); + if (svelte_element) svelte_element.d(detaching); } }; } @@ -115,4 +110,4 @@ class Component extends SvelteComponent { } } -export default Component; +export default Component; \ No newline at end of file