use expression directly

pull/9609/head
baseballyama 3 years ago
parent 5e307451dd
commit fe4542f25b

@ -573,14 +573,7 @@ function special(parser) {
type: 'ConstTag', type: 'ConstTag',
start, start,
end: parser.index, end: parser.index,
expression: { declaration
type: 'AssignmentExpression',
start: (declaration.start ?? 0) + CONST_LENGTH,
end: declaration.end ?? 0,
operator: '=',
left: declaration.declarations[0].id,
right: declaration.declarations[0].init
}
}) })
); );
} }

@ -1611,19 +1611,20 @@ export const template_visitors = {
); );
}, },
ConstTag(node, { state, visit }) { ConstTag(node, { state, visit }) {
const declaration = node.declaration.declarations[0];
// TODO we can almost certainly share some code with $derived(...) // TODO we can almost certainly share some code with $derived(...)
if (node.expression.left.type === 'Identifier') { if (declaration.id.type === 'Identifier') {
state.init.push( state.init.push(
b.const( b.const(
node.expression.left, declaration.id,
b.call( b.call(
'$.derived', '$.derived',
b.thunk(/** @type {import('estree').Expression} */ (visit(node.expression.right))) b.thunk(/** @type {import('estree').Expression} */ (visit(declaration.init)))
) )
) )
); );
} else { } else {
const identifiers = extract_identifiers(node.expression.left); const identifiers = extract_identifiers(declaration.id);
const tmp = b.id(state.scope.generate('computed_const')); const tmp = b.id(state.scope.generate('computed_const'));
// Make all identifiers that are declared within the following computed regular // Make all identifiers that are declared within the following computed regular
@ -1639,8 +1640,8 @@ export const template_visitors = {
[], [],
b.block([ b.block([
b.const( b.const(
/** @type {import('estree').Pattern} */ (visit(node.expression.left)), /** @type {import('estree').Pattern} */ (visit(declaration.id)),
/** @type {import('estree').Expression} */ (visit(node.expression.right)) /** @type {import('estree').Expression} */ (visit(declaration.init))
), ),
b.return(b.object(identifiers.map((node) => b.prop('init', node, node)))) b.return(b.object(identifiers.map((node) => b.prop('init', node, node))))
]) ])

@ -1049,8 +1049,9 @@ const template_visitors = {
state.template.push(t_expression(id)); state.template.push(t_expression(id));
}, },
ConstTag(node, { state, visit }) { ConstTag(node, { state, visit }) {
const pattern = /** @type {import('estree').Pattern} */ (visit(node.expression.left)); const declaration = node.declaration.declarations[0];
const init = /** @type {import('estree').Expression} */ (visit(node.expression.right)); const pattern = /** @type {import('estree').Pattern} */ (visit(declaration.id));
const init = /** @type {import('estree').Expression} */ (visit(declaration.init));
state.init.push(b.declaration('const', pattern, init)); state.init.push(b.declaration('const', pattern, init));
}, },
DebugTag(node, { state, visit }) { DebugTag(node, { state, visit }) {

@ -437,7 +437,8 @@ export function create_scopes(ast, root, allow_reactive_declarations, parent) {
next(); next();
}, },
VariableDeclaration(node, { state, next }) { VariableDeclaration(node, { state, path, next }) {
const is_parent_const_tag = path.at(-1)?.type === 'ConstTag';
for (const declarator of node.declarations) { for (const declarator of node.declarations) {
/** @type {import('#compiler').Binding[]} */ /** @type {import('#compiler').Binding[]} */
const bindings = []; const bindings = [];
@ -445,7 +446,12 @@ export function create_scopes(ast, root, allow_reactive_declarations, parent) {
state.scope.declarators.set(declarator, bindings); state.scope.declarators.set(declarator, bindings);
for (const id of extract_identifiers(declarator.id)) { for (const id of extract_identifiers(declarator.id)) {
const binding = state.scope.declare(id, 'normal', node.kind, declarator.init); const binding = state.scope.declare(
id,
is_parent_const_tag ? 'derived' : 'normal',
node.kind,
declarator.init
);
bindings.push(binding); bindings.push(binding);
} }
} }
@ -594,7 +600,8 @@ export function create_scopes(ast, root, allow_reactive_declarations, parent) {
}, },
ConstTag(node, { state, next }) { ConstTag(node, { state, next }) {
for (const identifier of extract_identifiers(node.expression.left)) { const declaration = node.declaration.declarations[0];
for (const identifier of extract_identifiers(declaration.id)) {
state.scope.declare( state.scope.declare(
/** @type {import('estree').Identifier} */ (identifier), /** @type {import('estree').Identifier} */ (identifier),
'derived', 'derived',

@ -2,7 +2,8 @@ import type { Binding } from '#compiler';
import type { import type {
ArrayExpression, ArrayExpression,
ArrowFunctionExpression, ArrowFunctionExpression,
AssignmentExpression, VariableDeclaration,
VariableDeclarator,
Expression, Expression,
FunctionDeclaration, FunctionDeclaration,
FunctionExpression, FunctionExpression,
@ -11,8 +12,7 @@ import type {
Node, Node,
ObjectExpression, ObjectExpression,
Pattern, Pattern,
Program, Program
VariableDeclaration
} from 'estree'; } from 'estree';
export interface BaseNode { export interface BaseNode {
@ -131,7 +131,9 @@ export interface Comment extends BaseNode {
/** A `{@const ...}` tag */ /** A `{@const ...}` tag */
export interface ConstTag extends BaseNode { export interface ConstTag extends BaseNode {
type: 'ConstTag'; type: 'ConstTag';
expression: AssignmentExpression; declaration: VariableDeclaration & {
declarations: [VariableDeclarator & { id: Identifier, init: Expression } ]
};
} }
/** A `{@debug ...}` tag */ /** A `{@debug ...}` tag */

Loading…
Cancel
Save