Skip to content

Commit 6814926

Browse files
committed
start on JS visitors
1 parent dbf849b commit 6814926

File tree

3 files changed

+57
-41
lines changed

3 files changed

+57
-41
lines changed

packages/svelte/src/compiler/phases/3-transform/server/transform-server.js

Lines changed: 4 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/** @import { AssignmentExpression, BinaryOperator, BlockStatement, CallExpression, Expression, ExpressionStatement, Identifier, MethodDefinition, Node, Pattern, Program, Property, PropertyDefinition, Statement, VariableDeclarator } from 'estree' */
1+
/** @import { AssignmentExpression, BinaryOperator, CallExpression, Expression, ExpressionStatement, MethodDefinition, Pattern, Program, Property, PropertyDefinition, Statement, VariableDeclarator } from 'estree' */
22
/** @import { Binding, Namespace, SvelteNode, ValidatedCompileOptions, ValidatedModuleCompileOptions } from '#compiler' */
33
/** @import { ComponentServerTransformState, ComponentVisitors, ServerTransformState, Visitors } from './types.js' */
44
/** @import { Analysis, ComponentAnalysis } from '../../types.js' */
@@ -8,10 +8,10 @@ import { walk } from 'zimmerframe';
88
import { set_scope, get_rune } from '../../scope.js';
99
import { extract_identifiers, extract_paths, is_expression_async } from '../../../utils/ast.js';
1010
import * as b from '../../../utils/builders.js';
11-
import is_reference from 'is-reference';
1211
import { transform_inspect_rune } from '../utils.js';
1312
import { filename } from '../../../state.js';
1413
import { render_stylesheet } from '../css/index.js';
14+
import { Identifier } from './visitors/javascript/Identifier.js';
1515
import { AwaitBlock } from './visitors/template/AwaitBlock.js';
1616
import { Component } from './visitors/template/Component.js';
1717
import { ConstTag } from './visitors/template/ConstTag.js';
@@ -33,6 +33,7 @@ import { SvelteFragment } from './visitors/template/SvelteFragment.js';
3333
import { SvelteHead } from './visitors/template/SvelteHead.js';
3434
import { SvelteSelf } from './visitors/template/SvelteSelf.js';
3535
import { TitleElement } from './visitors/template/TitleElement.js';
36+
import { serialize_get_binding } from './visitors/javascript/shared/utils.js';
3637

3738
/**
3839
* @param {VariableDeclarator} declarator
@@ -56,37 +57,6 @@ function create_state_declarators(declarator, scope, value) {
5657
];
5758
}
5859

59-
/**
60-
* @param {Identifier} node
61-
* @param {ServerTransformState} state
62-
* @returns {Expression}
63-
*/
64-
function serialize_get_binding(node, state) {
65-
const binding = state.scope.get(node.name);
66-
67-
if (binding === null || node === binding.node) {
68-
// No associated binding or the declaration itself which shouldn't be transformed
69-
return node;
70-
}
71-
72-
if (binding.kind === 'store_sub') {
73-
const store_id = b.id(node.name.slice(1));
74-
return b.call(
75-
'$.store_get',
76-
b.assignment('??=', b.id('$$store_subs'), b.object([])),
77-
b.literal(node.name),
78-
serialize_get_binding(store_id, state)
79-
);
80-
}
81-
82-
if (Object.hasOwn(state.getters, node.name)) {
83-
const getter = state.getters[node.name];
84-
return typeof getter === 'function' ? getter(node) : getter;
85-
}
86-
87-
return node;
88-
}
89-
9060
/**
9161
* @param {AssignmentExpression} node
9262
* @param {Pick<import('zimmerframe').Context<SvelteNode, ServerTransformState>, 'visit' | 'state'>} context
@@ -220,14 +190,7 @@ function serialize_set_binding(node, context, fallback) {
220190

221191
/** @type {Visitors} */
222192
const global_visitors = {
223-
Identifier(node, { path, state }) {
224-
if (is_reference(node, /** @type {Node} */ (path.at(-1)))) {
225-
if (node.name === '$$props') {
226-
return b.id('$$sanitized_props');
227-
}
228-
return serialize_get_binding(node, state);
229-
}
230-
},
193+
Identifier,
231194
AssignmentExpression(node, context) {
232195
return serialize_set_binding(node, context, context.next);
233196
},
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/** @import { Identifier, Node } from 'estree' */
2+
/** @import { Context } from '../../types' */
3+
import is_reference from 'is-reference';
4+
import * as b from '../../../../../utils/builders.js';
5+
import { serialize_get_binding } from './shared/utils.js';
6+
7+
/**
8+
* @param {Identifier} node
9+
* @param {Context} context
10+
*/
11+
export function Identifier(node, { path, state }) {
12+
if (is_reference(node, /** @type {Node} */ (path.at(-1)))) {
13+
if (node.name === '$$props') {
14+
return b.id('$$sanitized_props');
15+
}
16+
17+
return serialize_get_binding(node, state);
18+
}
19+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/** @import { Expression, Identifier } from 'estree' */
2+
/** @import { ServerTransformState } from '../../../types' */
3+
import * as b from '../../../../../../utils/builders.js';
4+
5+
/**
6+
* @param {Identifier} node
7+
* @param {ServerTransformState} state
8+
* @returns {Expression}
9+
*/
10+
export function serialize_get_binding(node, state) {
11+
const binding = state.scope.get(node.name);
12+
13+
if (binding === null || node === binding.node) {
14+
// No associated binding or the declaration itself which shouldn't be transformed
15+
return node;
16+
}
17+
18+
if (binding.kind === 'store_sub') {
19+
const store_id = b.id(node.name.slice(1));
20+
return b.call(
21+
'$.store_get',
22+
b.assignment('??=', b.id('$$store_subs'), b.object([])),
23+
b.literal(node.name),
24+
serialize_get_binding(store_id, state)
25+
);
26+
}
27+
28+
if (Object.hasOwn(state.getters, node.name)) {
29+
const getter = state.getters[node.name];
30+
return typeof getter === 'function' ? getter(node) : getter;
31+
}
32+
33+
return node;
34+
}

0 commit comments

Comments
 (0)