mirror of https://github.com/sveltejs/svelte
				
				
				
			
							parent
							
								
									c8ef540985
								
							
						
					
					
						commit
						2edb05172a
					
				@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					'svelte': minor
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					feat: allow `$state` in computed class fields
 | 
				
			||||||
@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					/** @import { ClassBody, ClassDeclaration, Expression, VariableDeclaration } from 'estree' */
 | 
				
			||||||
 | 
					/** @import { ClientTransformState, Context } from '../types' */
 | 
				
			||||||
 | 
					import * as b from '#compiler/builders';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @param {ClassDeclaration} node
 | 
				
			||||||
 | 
					 * @param {Context} context
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function ClassDeclaration(node, context) {
 | 
				
			||||||
 | 
						/** @type {ClientTransformState & { computed_field_declarations: VariableDeclaration[] }} */
 | 
				
			||||||
 | 
						const state = {
 | 
				
			||||||
 | 
							...context.state,
 | 
				
			||||||
 | 
							computed_field_declarations: []
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						const super_class = node.superClass
 | 
				
			||||||
 | 
							? /** @type {Expression} */ (context.visit(node.superClass))
 | 
				
			||||||
 | 
							: null;
 | 
				
			||||||
 | 
						const body = /** @type {ClassBody} */ (context.visit(node.body, state));
 | 
				
			||||||
 | 
						if (state.computed_field_declarations.length > 0) {
 | 
				
			||||||
 | 
							const init = b.call(
 | 
				
			||||||
 | 
								b.arrow(
 | 
				
			||||||
 | 
									[],
 | 
				
			||||||
 | 
									b.block([
 | 
				
			||||||
 | 
										...state.computed_field_declarations,
 | 
				
			||||||
 | 
										b.return(b.class(node.id, body, super_class))
 | 
				
			||||||
 | 
									])
 | 
				
			||||||
 | 
								)
 | 
				
			||||||
 | 
							);
 | 
				
			||||||
 | 
							return node.id ? b.var(node.id, init) : init;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return b.class_declaration(node.id, body, super_class);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					/** @import { ClassBody, ClassExpression, Expression, VariableDeclaration } from 'estree' */
 | 
				
			||||||
 | 
					/** @import { ClientTransformState, Context } from '../types' */
 | 
				
			||||||
 | 
					import * as b from '#compiler/builders';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @param {ClassExpression} node
 | 
				
			||||||
 | 
					 * @param {Context} context
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function ClassExpression(node, context) {
 | 
				
			||||||
 | 
						/** @type {ClientTransformState & { computed_field_declarations: VariableDeclaration[] }} */
 | 
				
			||||||
 | 
						const state = {
 | 
				
			||||||
 | 
							...context.state,
 | 
				
			||||||
 | 
							computed_field_declarations: []
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						const super_class = node.superClass
 | 
				
			||||||
 | 
							? /** @type {Expression} */ (context.visit(node.superClass))
 | 
				
			||||||
 | 
							: null;
 | 
				
			||||||
 | 
						const body = /** @type {ClassBody} */ (context.visit(node.body, state));
 | 
				
			||||||
 | 
						if (state.computed_field_declarations.length > 0) {
 | 
				
			||||||
 | 
							return b.call(
 | 
				
			||||||
 | 
								b.arrow(
 | 
				
			||||||
 | 
									[],
 | 
				
			||||||
 | 
									b.block([
 | 
				
			||||||
 | 
										...state.computed_field_declarations,
 | 
				
			||||||
 | 
										b.return(b.class(node.id, body, super_class))
 | 
				
			||||||
 | 
									])
 | 
				
			||||||
 | 
								)
 | 
				
			||||||
 | 
							);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return b.class(node.id, body, super_class);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					/** @import { ClassBody, ClassDeclaration, Expression, VariableDeclaration } from 'estree' */
 | 
				
			||||||
 | 
					/** @import { ServerTransformState, Context } from '../types' */
 | 
				
			||||||
 | 
					import * as b from '#compiler/builders';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @param {ClassDeclaration} node
 | 
				
			||||||
 | 
					 * @param {Context} context
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function ClassDeclaration(node, context) {
 | 
				
			||||||
 | 
					    /** @type {ServerTransformState & { computed_field_declarations: VariableDeclaration[] }} */
 | 
				
			||||||
 | 
					    const state = {
 | 
				
			||||||
 | 
					        ...context.state,
 | 
				
			||||||
 | 
					        computed_field_declarations: []
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    const super_class = node.superClass
 | 
				
			||||||
 | 
					        ? /** @type {Expression} */ (context.visit(node.superClass))
 | 
				
			||||||
 | 
					        : null;
 | 
				
			||||||
 | 
					    const body = /** @type {ClassBody} */ (context.visit(node.body, state));
 | 
				
			||||||
 | 
					    if (state.computed_field_declarations.length > 0) {
 | 
				
			||||||
 | 
					        const init = b.call(
 | 
				
			||||||
 | 
					            b.arrow(
 | 
				
			||||||
 | 
					                [],
 | 
				
			||||||
 | 
					                b.block([
 | 
				
			||||||
 | 
					                    ...state.computed_field_declarations,
 | 
				
			||||||
 | 
					                    b.return(b.class(node.id, body, super_class))
 | 
				
			||||||
 | 
					                ])
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        return node.id ? b.var(node.id, init) : init;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return b.class_declaration(node.id, body, super_class);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					/** @import { ClassBody, ClassExpression, Expression, VariableDeclaration } from 'estree' */
 | 
				
			||||||
 | 
					/** @import { ServerTransformState, Context } from '../types' */
 | 
				
			||||||
 | 
					import * as b from '#compiler/builders';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @param {ClassExpression} node
 | 
				
			||||||
 | 
					 * @param {Context} context
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function ClassExpression(node, context) {
 | 
				
			||||||
 | 
						/** @type {ServerTransformState & { computed_field_declarations: VariableDeclaration[] }} */
 | 
				
			||||||
 | 
						const state = {
 | 
				
			||||||
 | 
							...context.state,
 | 
				
			||||||
 | 
							computed_field_declarations: []
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						const super_class = node.superClass
 | 
				
			||||||
 | 
							? /** @type {Expression} */ (context.visit(node.superClass))
 | 
				
			||||||
 | 
							: null;
 | 
				
			||||||
 | 
						const body = /** @type {ClassBody} */ (context.visit(node.body, state));
 | 
				
			||||||
 | 
						if (state.computed_field_declarations.length > 0) {
 | 
				
			||||||
 | 
							return b.call(
 | 
				
			||||||
 | 
								b.arrow(
 | 
				
			||||||
 | 
									[],
 | 
				
			||||||
 | 
									b.block([
 | 
				
			||||||
 | 
										...state.computed_field_declarations,
 | 
				
			||||||
 | 
										b.return(b.class(node.id, body, super_class))
 | 
				
			||||||
 | 
									])
 | 
				
			||||||
 | 
								)
 | 
				
			||||||
 | 
							);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return b.class(node.id, body, super_class);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue