Skip to content

Commit 565c7f6

Browse files
committed
moved transformation in template.js
1 parent f763eff commit 565c7f6

File tree

8 files changed

+149
-40
lines changed

8 files changed

+149
-40
lines changed

packages/svelte/src/compiler/phases/1-parse/state/element.js

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -467,16 +467,7 @@ function read_attribute(parser, unique_names) {
467467
}
468468

469469
if (type) {
470-
const [base_directive_name, ...modifiers] = name.slice(colon_index + 1).split('|');
471-
472-
// this allow for accessing members of an object
473-
const splitted_directive = base_directive_name.split('.');
474-
475-
let directive_name = splitted_directive.shift() ?? '';
476-
477-
for (let new_piece of splitted_directive) {
478-
directive_name += `['${new_piece}']`;
479-
}
470+
const [directive_name, ...modifiers] = name.slice(colon_index + 1).split('|');
480471

481472
if (directive_name === '') {
482473
error(start + colon_index + 1, 'empty-directive-name', type);

packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,22 @@ function serialize_style_directives(style_directives, element_id, context, is_at
7474
}
7575
}
7676

77+
/**
78+
* goes from nested.access to nested['access']
79+
* @param {string} expression
80+
*/
81+
function member_expression_id_to_literal(expression) {
82+
// this allow for accessing members of an object
83+
const splitted_expression = expression.split('.');
84+
85+
let new_expression = splitted_expression.shift() ?? '';
86+
87+
for (let new_piece of splitted_expression) {
88+
new_expression += `['${new_piece}']`;
89+
}
90+
return new_expression;
91+
}
92+
7793
/**
7894
* Serializes each class directive into something like `$.class_toogle(element, class_name, value)`
7995
* and adds it either to init or update, depending on whether or not the value or the attributes are dynamic.
@@ -1676,7 +1692,16 @@ export const template_visitors = {
16761692
? b.literal(null)
16771693
: b.thunk(/** @type {import('estree').Expression} */ (visit(node.expression)));
16781694

1679-
state.init.push(b.stmt(b.call('$.animate', state.node, b.id(node.name), expression)));
1695+
state.init.push(
1696+
b.stmt(
1697+
b.call(
1698+
'$.animate',
1699+
state.node,
1700+
b.id(member_expression_id_to_literal(node.name)),
1701+
expression
1702+
)
1703+
)
1704+
);
16801705
},
16811706
ClassDirective(node, { state, next }) {
16821707
error(node, 'INTERNAL', 'Node should have been handled elsewhere');
@@ -1696,7 +1721,7 @@ export const template_visitors = {
16961721
b.call(
16971722
type,
16981723
state.node,
1699-
b.id(node.name),
1724+
b.id(member_expression_id_to_literal(node.name)),
17001725
expression,
17011726
node.modifiers.includes('global') ? b.true : b.false
17021727
)
@@ -2417,7 +2442,13 @@ export const template_visitors = {
24172442
/** @type {import('estree').Expression[]} */
24182443
const args = [
24192444
state.node,
2420-
b.arrow(params, b.call(serialize_get_binding(b.id(node.name), state), ...params))
2445+
b.arrow(
2446+
params,
2447+
b.call(
2448+
serialize_get_binding(b.id(member_expression_id_to_literal(node.name)), state),
2449+
...params
2450+
)
2451+
)
24212452
];
24222453

24232454
if (node.expression) {

packages/svelte/tests/parser-legacy/samples/action-with-memberaccess/input.svelte

Lines changed: 0 additions & 1 deletion
This file was deleted.

packages/svelte/tests/parser-legacy/samples/action-with-memberaccess/output.json

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { test } from '../../test';
2+
3+
export default test({});
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// index.svelte (Svelte VERSION)
2+
// Note: compiler output will change before 5.0 is released!
3+
import "svelte/internal/disclose-version";
4+
import * as $ from "svelte/internal";
5+
6+
var frag = $.template(`<div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div>`, true);
7+
8+
export default function Directives_with_member_access($$anchor, $$props) {
9+
$.push($$props, false);
10+
11+
const one = () => {};
12+
const nested = { one };
13+
const evenmore = { nested };
14+
15+
/* Init */
16+
var fragment = $.open_frag($$anchor, true, frag);
17+
var div = $.child_frag(fragment);
18+
var div_1 = $.sibling($.sibling(div));
19+
var div_2 = $.sibling($.sibling(div_1));
20+
var div_3 = $.sibling($.sibling(div_2));
21+
22+
$.transition(div_3, one, null, false);
23+
24+
var div_4 = $.sibling($.sibling(div_3));
25+
26+
$.transition(div_4, nested['one'], null, false);
27+
28+
var div_5 = $.sibling($.sibling(div_4));
29+
30+
$.transition(div_5, evenmore['nested']['one'], null, false);
31+
32+
var div_6 = $.sibling($.sibling(div_5));
33+
34+
$.animate(div_6, one, null);
35+
36+
var div_7 = $.sibling($.sibling(div_6));
37+
38+
$.animate(div_7, nested['one'], null);
39+
40+
var div_8 = $.sibling($.sibling(div_7));
41+
42+
$.animate(div_8, evenmore['nested']['one'], null);
43+
44+
var div_9 = $.sibling($.sibling(div_8));
45+
46+
$.in(div_9, one, null, false);
47+
48+
var div_10 = $.sibling($.sibling(div_9));
49+
50+
$.in(div_10, nested['one'], null, false);
51+
52+
var div_11 = $.sibling($.sibling(div_10));
53+
54+
$.in(div_11, evenmore['nested']['one'], null, false);
55+
56+
var div_12 = $.sibling($.sibling(div_11));
57+
58+
$.out(div_12, one, null, false);
59+
60+
var div_13 = $.sibling($.sibling(div_12));
61+
62+
$.out(div_13, nested['one'], null, false);
63+
64+
var div_14 = $.sibling($.sibling(div_13));
65+
66+
$.out(div_14, evenmore['nested']['one'], null, false);
67+
$.action(div, $$node => one($$node));
68+
$.action(div_1, $$node => nested['one']($$node));
69+
$.action(div_2, $$node => evenmore['nested']['one']($$node));
70+
$.close_frag($$anchor, fragment);
71+
$.pop();
72+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// index.svelte (Svelte VERSION)
2+
// Note: compiler output will change before 5.0 is released!
3+
import * as $ from "svelte/internal/server";
4+
5+
export default function Directives_with_member_access($$payload, $$props) {
6+
$.push(false);
7+
8+
const one = () => {};
9+
const nested = { one };
10+
const evenmore = { nested };
11+
12+
$$payload.out += `<div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div>`;
13+
$.pop();
14+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<script>
2+
const one = ()=>{};
3+
const nested = {one};
4+
const evenmore = {nested};
5+
</script>
6+
7+
<div use:one />
8+
<div use:nested.one />
9+
<div use:evenmore.nested.one />
10+
11+
<div transition:one />
12+
<div transition:nested.one />
13+
<div transition:evenmore.nested.one />
14+
15+
<div animate:one />
16+
<div animate:nested.one />
17+
<div animate:evenmore.nested.one />
18+
19+
<div in:one />
20+
<div in:nested.one />
21+
<div in:evenmore.nested.one />
22+
23+
<div out:one />
24+
<div out:nested.one />
25+
<div out:evenmore.nested.one />

0 commit comments

Comments
 (0)