Home / File/ expression.js — svelte Source File

expression.js — svelte Source File

Architecture documentation for expression.js, a javascript file in the svelte codebase. 7 imports, 2 dependents.

File javascript Compiler Transformer 7 imports 2 dependents 2 functions

Entity Profile

Dependency Diagram

graph LR
  8b705104_0cb9_c5c8_5bed_6dcfe73592d3["expression.js"]
  2627a38d_1d02_8fc1_b764_b2aaf06f372b["acorn.js"]
  8b705104_0cb9_c5c8_5bed_6dcfe73592d3 --> 2627a38d_1d02_8fc1_b764_b2aaf06f372b
  bb0eb4c2_ab75_feac_3814_01d1e4346bb8["parse_expression_at"]
  8b705104_0cb9_c5c8_5bed_6dcfe73592d3 --> bb0eb4c2_ab75_feac_3814_01d1e4346bb8
  ce051dbd_4cf1_f117_d66e_12cfa122de37["patterns.js"]
  8b705104_0cb9_c5c8_5bed_6dcfe73592d3 --> ce051dbd_4cf1_f117_d66e_12cfa122de37
  495501a4_a342_6a4d_ac11_e3e2fee8b218["errors.js"]
  8b705104_0cb9_c5c8_5bed_6dcfe73592d3 --> 495501a4_a342_6a4d_ac11_e3e2fee8b218
  a146f6ac_0088_8736_b6ce_318f9f115170["e"]
  8b705104_0cb9_c5c8_5bed_6dcfe73592d3 --> a146f6ac_0088_8736_b6ce_318f9f115170
  0d221a90_b1cc_5826_235e_98f5216d6400["bracket.js"]
  8b705104_0cb9_c5c8_5bed_6dcfe73592d3 --> 0d221a90_b1cc_5826_235e_98f5216d6400
  b3551700_3c95_8e19_dbb3_fb1e46ccae14["find_matching_bracket"]
  8b705104_0cb9_c5c8_5bed_6dcfe73592d3 --> b3551700_3c95_8e19_dbb3_fb1e46ccae14
  206889ff_1f9f_b6c1_d530_059d001e1cf4["element.js"]
  206889ff_1f9f_b6c1_d530_059d001e1cf4 --> 8b705104_0cb9_c5c8_5bed_6dcfe73592d3
  367a364a_2912_a1aa_b2e1_d97a82783c38["tag.js"]
  367a364a_2912_a1aa_b2e1_d97a82783c38 --> 8b705104_0cb9_c5c8_5bed_6dcfe73592d3
  style 8b705104_0cb9_c5c8_5bed_6dcfe73592d3 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

/** @import { Expression } from 'estree' */
/** @import { Parser } from '../index.js' */
import { parse_expression_at } from '../acorn.js';
import { regex_whitespace } from '../../patterns.js';
import * as e from '../../../errors.js';
import { find_matching_bracket } from '../utils/bracket.js';

/**
 * @param {Parser} parser
 * @param {string} [opening_token]
 * @returns {Expression | undefined}
 */
export function get_loose_identifier(parser, opening_token) {
	// Find the next } and treat it as the end of the expression
	const end = find_matching_bracket(parser.template, parser.index, opening_token ?? '{');
	if (end) {
		const start = parser.index;
		parser.index = end;
		// We don't know what the expression is and signal this by returning an empty identifier
		return {
			type: 'Identifier',
			start,
			end,
			name: ''
		};
	}
}

/**
 * @param {Parser} parser
 * @param {string} [opening_token]
 * @param {boolean} [disallow_loose]
 * @returns {Expression}
 */
export default function read_expression(parser, opening_token, disallow_loose) {
	try {
		let comment_index = parser.root.comments.length;

		const node = parse_expression_at(
			parser.template,
			parser.root.comments,
			parser.ts,
			parser.index
		);

		let num_parens = 0;

		let i = parser.root.comments.length;
		while (i-- > comment_index) {
			const comment = parser.root.comments[i];
			if (comment.end < node.start) {
				parser.index = comment.end;
				break;
			}
		}

		for (let i = parser.index; i < /** @type {number} */ (node.start); i += 1) {
			if (parser.template[i] === '(') num_parens += 1;
		}

		let index = /** @type {number} */ (node.end);

		const last_comment = parser.root.comments.at(-1);
		if (last_comment && last_comment.end > index) index = last_comment.end;

		while (num_parens > 0) {
			const char = parser.template[index];

			if (char === ')') {
				num_parens -= 1;
			} else if (!regex_whitespace.test(char)) {
				e.expected_token(index, ')');
			}

			index += 1;
		}

		parser.index = index;

		return /** @type {Expression} */ (node);
	} catch (err) {
		// If we are in an each loop we need the error to be thrown in cases like
		// `as { y = z }` so we still throw and handle the error there
		if (parser.loose && !disallow_loose) {
			const expression = get_loose_identifier(parser, opening_token);
			if (expression) {
				return expression;
			}
		}

		parser.acorn_error(err);
	}
}

Domain

Subdomains

Frequently Asked Questions

What does expression.js do?
expression.js is a source file in the svelte codebase, written in javascript. It belongs to the Compiler domain, Transformer subdomain.
What functions are defined in expression.js?
expression.js defines 2 function(s): get_loose_identifier, read_expression.
What does expression.js depend on?
expression.js imports 7 module(s): acorn.js, bracket.js, e, errors.js, find_matching_bracket, parse_expression_at, patterns.js.
What files import expression.js?
expression.js is imported by 2 file(s): element.js, tag.js.
Where is expression.js in the architecture?
expression.js is located at packages/svelte/src/compiler/phases/1-parse/read/expression.js (domain: Compiler, subdomain: Transformer, directory: packages/svelte/src/compiler/phases/1-parse/read).

Analyze Your Own Codebase

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

Try Supermodel Free