Home / Function/ ClassBody() — svelte Function Reference

ClassBody() — svelte Function Reference

Architecture documentation for the ClassBody() function in ClassBody.js from the svelte codebase.

Entity Profile

Dependency Diagram

graph TD
  698c974c_bac9_ab20_d589_1aa129451a2d["ClassBody()"]
  81444023_4896_5434_7a65_69f9a6e56d31["ClassBody.js"]
  698c974c_bac9_ab20_d589_1aa129451a2d -->|defined in| 81444023_4896_5434_7a65_69f9a6e56d31
  d69a156c_617a_9397_4c8b_e94508c59e30["get_name()"]
  698c974c_bac9_ab20_d589_1aa129451a2d -->|calls| d69a156c_617a_9397_4c8b_e94508c59e30
  style 698c974c_bac9_ab20_d589_1aa129451a2d fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

packages/svelte/src/compiler/phases/3-transform/server/visitors/ClassBody.js lines 10–81

export function ClassBody(node, context) {
	const state_fields = context.state.analysis.classes.get(node);

	if (!state_fields) {
		// in legacy mode, do nothing
		context.next();
		return;
	}

	/** @type {Array<MethodDefinition | PropertyDefinition | StaticBlock>} */
	const body = [];

	const child_state = { ...context.state, state_fields };

	for (const [name, field] of state_fields) {
		if (name[0] === '#') {
			continue;
		}

		// insert backing fields for stuff declared in the constructor
		if (
			field &&
			field.node.type === 'AssignmentExpression' &&
			(field.type === '$derived' || field.type === '$derived.by')
		) {
			const member = b.member(b.this, field.key);

			body.push(
				b.prop_def(field.key, null),
				b.method('get', b.key(name), [], [b.return(b.call(member))]),
				b.method('set', b.key(name), [b.id('$$value')], [b.return(b.call(member, b.id('$$value')))])
			);
		}
	}

	// Replace parts of the class body
	for (const definition of node.body) {
		if (definition.type !== 'PropertyDefinition') {
			body.push(
				/** @type {MethodDefinition | StaticBlock} */ (context.visit(definition, child_state))
			);
			continue;
		}

		const name = get_name(definition.key);
		const field = name && state_fields.get(name);

		if (!field) {
			body.push(/** @type {PropertyDefinition} */ (context.visit(definition, child_state)));
			continue;
		}

		if (name[0] === '#' || field.type === '$state' || field.type === '$state.raw') {
			body.push(/** @type {PropertyDefinition} */ (context.visit(definition, child_state)));
		} else if (field.node === definition) {
			// $derived / $derived.by
			const member = b.member(b.this, field.key);

			body.push(
				b.prop_def(
					field.key,
					/** @type {CallExpression} */ (context.visit(field.value, child_state))
				),

				b.method('get', definition.key, [], [b.return(b.call(member))]),
				b.method('set', b.key(name), [b.id('$$value')], [b.return(b.call(member, b.id('$$value')))])
			);
		}
	}

	return { ...node, body };
}

Domain

Subdomains

Calls

Frequently Asked Questions

What does ClassBody() do?
ClassBody() is a function in the svelte codebase, defined in packages/svelte/src/compiler/phases/3-transform/server/visitors/ClassBody.js.
Where is ClassBody() defined?
ClassBody() is defined in packages/svelte/src/compiler/phases/3-transform/server/visitors/ClassBody.js at line 10.
What does ClassBody() call?
ClassBody() calls 1 function(s): get_name.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free