All files / src/compiler/phases/3-transform/client/visitors/shared function.js

100% Statements 35/35
100% Branches 7/7
100% Functions 1/1
100% Lines 34/34

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 352x 2x 2x 2x 2x 2x 2x 2x 2x 1308x 1308x 1308x 1308x 1308x 167x 167x 167x 167x 1308x 1141x 1141x 1308x 1308x 178x 178x 178x 178x 178x 178x 178x 178x 1130x 1130x 1130x  
/** @import { ArrowFunctionExpression, FunctionExpression, Node } from 'estree' */
/** @import { ComponentContext } from '../../types' */
import { build_hoistable_params } from '../../utils.js';
 
/**
 * @param {ArrowFunctionExpression | FunctionExpression} node
 * @param {ComponentContext} context
 */
export const visit_function = (node, context) => {
	const metadata = node.metadata;
 
	let state = context.state;
 
	if (node.type === 'FunctionExpression') {
		const parent = /** @type {Node} */ (context.path.at(-1));
		const in_constructor = parent.type === 'MethodDefinition' && parent.kind === 'constructor';
 
		state = { ...context.state, in_constructor };
	} else {
		state = { ...context.state, in_constructor: false };
	}
 
	if (metadata?.hoistable === true) {
		const params = build_hoistable_params(node, context);
 
		return /** @type {FunctionExpression} */ ({
			...node,
			params,
			body: context.visit(node.body, state)
		});
	}
 
	context.next(state);
};