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 1304x 1304x 1304x 1304x 1304x 169x 169x 169x 169x 1304x 1135x 1135x 1304x 1304x 181x 181x 181x 181x 181x 181x 181x 181x 1123x 1123x 1123x  
/** @import { ArrowFunctionExpression, FunctionExpression, Node } from 'estree' */
/** @import { ComponentContext } from '../../types' */
import { build_hoisted_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?.hoisted === true) {
		const params = build_hoisted_params(node, context);
 
		return /** @type {FunctionExpression} */ ({
			...node,
			params,
			body: context.visit(node.body, state)
		});
	}
 
	context.next(state);
};