Home / Function/ build_assignment() — svelte Function Reference

build_assignment() — svelte Function Reference

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

Entity Profile

Dependency Diagram

graph TD
  de76709c_7ae0_7ba1_eecf_1f23ef572fb0["build_assignment()"]
  96ee438d_6c6f_9aff_59f4_d00e63e9d98c["AssignmentExpression.js"]
  de76709c_7ae0_7ba1_eecf_1f23ef572fb0 -->|defined in| 96ee438d_6c6f_9aff_59f4_d00e63e9d98c
  d69a156c_617a_9397_4c8b_e94508c59e30["get_name()"]
  de76709c_7ae0_7ba1_eecf_1f23ef572fb0 -->|calls| d69a156c_617a_9397_4c8b_e94508c59e30
  627dc2f8_4dbc_5bb1_8f54_cee503e17098["get()"]
  de76709c_7ae0_7ba1_eecf_1f23ef572fb0 -->|calls| 627dc2f8_4dbc_5bb1_8f54_cee503e17098
  bed91719_d047_2256_e199_ee875d5f49b9["get_rune()"]
  de76709c_7ae0_7ba1_eecf_1f23ef572fb0 -->|calls| bed91719_d047_2256_e199_ee875d5f49b9
  a3992cec_6c90_d564_7bfc_3ad8518003cc["build_assignment_value()"]
  de76709c_7ae0_7ba1_eecf_1f23ef572fb0 -->|calls| a3992cec_6c90_d564_7bfc_3ad8518003cc
  06f6be1c_3203_ab7d_95be_766e7d2ef91b["is_non_coercive_operator()"]
  de76709c_7ae0_7ba1_eecf_1f23ef572fb0 -->|calls| 06f6be1c_3203_ab7d_95be_766e7d2ef91b
  88db3726_5740_3eb8_99fb_4b297fb19b24["should_proxy()"]
  de76709c_7ae0_7ba1_eecf_1f23ef572fb0 -->|calls| 88db3726_5740_3eb8_99fb_4b297fb19b24
  c460607c_df6f_f0bc_cf31_b4c25e6d1506["evaluate()"]
  de76709c_7ae0_7ba1_eecf_1f23ef572fb0 -->|calls| c460607c_df6f_f0bc_cf31_b4c25e6d1506
  e9a2c29e_d0ca_ab9f_b86f_f22ff802db91["is_event_attribute()"]
  de76709c_7ae0_7ba1_eecf_1f23ef572fb0 -->|calls| e9a2c29e_d0ca_ab9f_b86f_f22ff802db91
  a997caf9_1d66_f005_5b11_675724bd0ed8["get_attribute_expression()"]
  de76709c_7ae0_7ba1_eecf_1f23ef572fb0 -->|calls| a997caf9_1d66_f005_5b11_675724bd0ed8
  bde97aff_493a_f552_a038_3e029fefca90["locate_node()"]
  de76709c_7ae0_7ba1_eecf_1f23ef572fb0 -->|calls| bde97aff_493a_f552_a038_3e029fefca90
  style de76709c_7ae0_7ba1_eecf_1f23ef572fb0 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

packages/svelte/src/compiler/phases/3-transform/client/visitors/AssignmentExpression.js lines 54–228

function build_assignment(operator, left, right, context) {
	if (context.state.analysis.runes && left.type === 'MemberExpression') {
		const name = get_name(left.property);
		const field = name && context.state.state_fields.get(name);

		if (field) {
			// special case — state declaration in class constructor
			if (field.node.type === 'AssignmentExpression' && left === field.node.left) {
				const rune = get_rune(right, context.state.scope);

				if (rune) {
					const child_state = {
						...context.state,
						in_constructor: rune !== '$derived' && rune !== '$derived.by'
					};

					let value = /** @type {Expression} */ (context.visit(right, child_state));

					if (dev) {
						const declaration = context.path.findLast(
							(parent) => parent.type === 'ClassDeclaration' || parent.type === 'ClassExpression'
						);
						value = b.call(
							'$.tag',
							value,
							b.literal(`${declaration?.id?.name ?? '[class]'}.${name}`)
						);
					}

					return b.assignment(operator, b.member(b.this, field.key), value);
				}
			}

			// special case — assignment to private state field
			if (left.property.type === 'PrivateIdentifier') {
				let value = /** @type {Expression} */ (
					context.visit(build_assignment_value(operator, left, right))
				);

				const needs_proxy =
					field.type === '$state' &&
					is_non_coercive_operator(operator) &&
					should_proxy(value, context.state.scope);

				return b.call('$.set', left, value, needs_proxy && b.true);
			}
		}
	}

	let object = left;

	while (object.type === 'MemberExpression') {
		// @ts-expect-error
		object = object.object;
	}

	if (object.type !== 'Identifier') {
		return null;
	}

	const binding = context.state.scope.get(object.name);
	if (!binding) return null;

	const transform = Object.hasOwn(context.state.transform, object.name)
		? context.state.transform[object.name]
		: null;

	const path = context.path.map((node) => node.type);

	// reassignment
	if (object === left && transform?.assign) {
		// special case — if an element binding, we know it's a primitive

		const is_primitive = path.at(-1) === 'BindDirective' && path.at(-2) === 'RegularElement';

		let value = /** @type {Expression} */ (
			context.visit(build_assignment_value(operator, left, right))
		);

		return transform.assign(
			object,

Domain

Subdomains

Frequently Asked Questions

What does build_assignment() do?
build_assignment() is a function in the svelte codebase, defined in packages/svelte/src/compiler/phases/3-transform/client/visitors/AssignmentExpression.js.
Where is build_assignment() defined?
build_assignment() is defined in packages/svelte/src/compiler/phases/3-transform/client/visitors/AssignmentExpression.js at line 54.
What does build_assignment() call?
build_assignment() calls 10 function(s): build_assignment_value, evaluate, get, get_attribute_expression, get_name, get_rune, is_event_attribute, is_non_coercive_operator, and 2 more.

Analyze Your Own Codebase

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

Try Supermodel Free