From 2a15f2f79613d32645bd2f171ce61d351ff2b23a Mon Sep 17 00:00:00 2001 From: Nic <162764842+Nic-Polumeyv@users.noreply.github.com> Date: Sun, 6 Sep 2026 20:01:10 -0400 Subject: [PATCH] chore: parser helpers next to their users --- .../src/compiler/phases/1-parse/index.js | 3 +- .../compiler/phases/1-parse/state/element.js | 8 +++-- .../src/compiler/phases/1-parse/state/tag.js | 3 +- .../compiler/phases/1-parse/utils/create.js | 16 ---------- .../2-analyze/visitors/BindDirective.js | 2 +- .../phases/2-analyze/visitors/SvelteBody.js | 2 +- .../2-analyze/visitors/SvelteDocument.js | 2 +- .../phases/2-analyze/visitors/SvelteWindow.js | 2 +- .../2-analyze/visitors/shared/a11y/index.js | 2 +- .../visitors/shared/special-element.js | 16 ---------- packages/svelte/src/compiler/phases/nodes.js | 30 +++++++++++++++++++ .../compiler/utils/extract_svelte_ignore.js | 2 +- .../{phases/1-parse => }/utils/fuzzymatch.js | 0 .../svelte/src/compiler/utils/mapped_code.js | 14 ++++++++- .../svelte/src/compiler/utils/push_array.js | 13 -------- 15 files changed, 57 insertions(+), 58 deletions(-) delete mode 100644 packages/svelte/src/compiler/phases/1-parse/utils/create.js delete mode 100644 packages/svelte/src/compiler/phases/2-analyze/visitors/shared/special-element.js rename packages/svelte/src/compiler/{phases/1-parse => }/utils/fuzzymatch.js (100%) delete mode 100644 packages/svelte/src/compiler/utils/push_array.js diff --git a/packages/svelte/src/compiler/phases/1-parse/index.js b/packages/svelte/src/compiler/phases/1-parse/index.js index 8edd403487..64a03630ab 100644 --- a/packages/svelte/src/compiler/phases/1-parse/index.js +++ b/packages/svelte/src/compiler/phases/1-parse/index.js @@ -5,10 +5,9 @@ import { isIdentifierStart, isIdentifierChar } from 'acorn'; import fragment from './state/fragment.js'; import * as e from '../../errors.js'; -import { create_fragment } from './utils/create.js'; +import { create_fragment, disallow_children } from '../nodes.js'; import read_options from './read/options.js'; import { is_reserved } from '../../../utils.js'; -import { disallow_children } from '../2-analyze/visitors/shared/special-element.js'; import * as state from '../../state.js'; import { is_whitespace } from './utils/whitespace.js'; diff --git a/packages/svelte/src/compiler/phases/1-parse/state/element.js b/packages/svelte/src/compiler/phases/1-parse/state/element.js index 220fe24b9d..d6871bc01e 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -9,8 +9,12 @@ import read_style from '../read/style.js'; import { decode_character_references } from '../utils/html.js'; import * as e from '../../../errors.js'; import * as w from '../../../warnings.js'; -import { create_fragment } from '../utils/create.js'; -import { create_attribute, ExpressionMetadata, is_element_node } from '../../nodes.js'; +import { + create_attribute, + create_fragment, + ExpressionMetadata, + is_element_node +} from '../../nodes.js'; import { get_attribute_expression, is_expression_attribute } from '../../../utils/ast.js'; import { closing_tag_omitted } from '../../../../html-tree-validation.js'; import { list } from '../../../utils/string.js'; diff --git a/packages/svelte/src/compiler/phases/1-parse/state/tag.js b/packages/svelte/src/compiler/phases/1-parse/state/tag.js index 9cc0a41375..97095e993a 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/tag.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/tag.js @@ -3,11 +3,10 @@ /** @import { Parser } from '../index.js' */ import { walk } from 'zimmerframe'; import * as e from '../../../errors.js'; -import { ExpressionMetadata } from '../../nodes.js'; +import { create_fragment, ExpressionMetadata } from '../../nodes.js'; import { parse_expression_at, parse_statement_at } from '../acorn.js'; import read_pattern from '../read/context.js'; import read_expression, { get_loose_identifier } from '../read/expression.js'; -import { create_fragment } from '../utils/create.js'; import { find_matching_bracket, match_bracket } from '../utils/bracket.js'; const regex_whitespace_with_closing_curly_brace = /\s*}/y; diff --git a/packages/svelte/src/compiler/phases/1-parse/utils/create.js b/packages/svelte/src/compiler/phases/1-parse/utils/create.js deleted file mode 100644 index 6030f1bd7b..0000000000 --- a/packages/svelte/src/compiler/phases/1-parse/utils/create.js +++ /dev/null @@ -1,16 +0,0 @@ -/** @import { AST } from '#compiler' */ - -/** - * @param {any} transparent - * @returns {AST.Fragment} - */ -export function create_fragment(transparent = false) { - return { - type: 'Fragment', - nodes: [], - metadata: { - transparent, - dynamic: false - } - }; -} diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/BindDirective.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/BindDirective.js index ab541703a0..559681cacd 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/BindDirective.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/BindDirective.js @@ -9,7 +9,7 @@ import { validate_assignment } from './shared/utils.js'; import * as e from '../../../errors.js'; import * as w from '../../../warnings.js'; import { binding_properties } from '../../bindings.js'; -import fuzzymatch from '../../1-parse/utils/fuzzymatch.js'; +import fuzzymatch from '../../../utils/fuzzymatch.js'; import { is_content_editable_binding, is_svg } from '../../../../utils.js'; import { mark_subtree_dynamic } from './shared/fragment.js'; diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteBody.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteBody.js index 39b559b32f..fcadc12708 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteBody.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteBody.js @@ -2,7 +2,7 @@ /** @import { Context } from '../types' */ import * as e from '../../../errors.js'; import { is_event_attribute } from '../../../utils/ast.js'; -import { disallow_children } from './shared/special-element.js'; +import { disallow_children } from '../../nodes.js'; import { check_global_event_reference } from './shared/utils.js'; /** diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteDocument.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteDocument.js index 23e984f607..f2acc93e1e 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteDocument.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteDocument.js @@ -1,6 +1,6 @@ /** @import { AST } from '#compiler' */ /** @import { Context } from '../types' */ -import { disallow_children } from './shared/special-element.js'; +import { disallow_children } from '../../nodes.js'; import * as e from '../../../errors.js'; import { is_event_attribute } from '../../../utils/ast.js'; import { check_global_event_reference } from './shared/utils.js'; diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteWindow.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteWindow.js index 5281c7a635..8bba0d8d2d 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteWindow.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteWindow.js @@ -1,6 +1,6 @@ /** @import { AST } from '#compiler' */ /** @import { Context } from '../types' */ -import { disallow_children } from './shared/special-element.js'; +import { disallow_children } from '../../nodes.js'; import * as e from '../../../errors.js'; import { is_event_attribute } from '../../../utils/ast.js'; import { check_global_event_reference } from './shared/utils.js'; diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/a11y/index.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/a11y/index.js index e09ab018a8..f06a41d088 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/a11y/index.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/a11y/index.js @@ -45,7 +45,7 @@ import { import { is_event_attribute, is_text_attribute } from '../../../../../utils/ast.js'; import { list } from '../../../../../utils/string.js'; import { walk } from 'zimmerframe'; -import fuzzymatch from '../../../../1-parse/utils/fuzzymatch.js'; +import fuzzymatch from '../../../../../utils/fuzzymatch.js'; import { is_content_editable_binding } from '../../../../../../utils.js'; import * as w from '../../../../../warnings.js'; diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/special-element.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/special-element.js deleted file mode 100644 index e72b3c6b2a..0000000000 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/special-element.js +++ /dev/null @@ -1,16 +0,0 @@ -/** @import { AST } from '#compiler' */ -import * as e from '../../../../errors.js'; - -/** - * @param {AST.SvelteBody | AST.SvelteDocument | AST.SvelteOptionsRaw | AST.SvelteWindow} node - */ -export function disallow_children(node) { - const { nodes } = node.fragment; - - if (nodes.length > 0) { - const first = nodes[0]; - const last = nodes[nodes.length - 1]; - - e.svelte_meta_invalid_content({ start: first.start, end: last.end }, node.name); - } -} diff --git a/packages/svelte/src/compiler/phases/nodes.js b/packages/svelte/src/compiler/phases/nodes.js index fea447a7c5..eda31b3e50 100644 --- a/packages/svelte/src/compiler/phases/nodes.js +++ b/packages/svelte/src/compiler/phases/nodes.js @@ -1,6 +1,7 @@ /** @import { Expression, PrivateIdentifier, SourceLocation } from 'estree' */ /** @import { AST, Binding } from '#compiler' */ import * as b from '#compiler/builders'; +import * as e from '../errors.js'; /** * All nodes that can appear elsewhere than the top level, have attributes and can contain children @@ -45,6 +46,35 @@ export function is_custom_element_node(node) { ); } +/** + * @param {boolean} transparent + * @returns {AST.Fragment} + */ +export function create_fragment(transparent = false) { + return { + type: 'Fragment', + nodes: [], + metadata: { + transparent, + dynamic: false + } + }; +} + +/** + * @param {AST.SvelteBody | AST.SvelteDocument | AST.SvelteOptionsRaw | AST.SvelteWindow} node + */ +export function disallow_children(node) { + const { nodes } = node.fragment; + + if (nodes.length > 0) { + const first = nodes[0]; + const last = nodes[nodes.length - 1]; + + e.svelte_meta_invalid_content({ start: first.start, end: last.end }, node.name); + } +} + /** * @param {string} name * @param {SourceLocation | null} name_loc diff --git a/packages/svelte/src/compiler/utils/extract_svelte_ignore.js b/packages/svelte/src/compiler/utils/extract_svelte_ignore.js index 2f0d387307..587f919f91 100644 --- a/packages/svelte/src/compiler/utils/extract_svelte_ignore.js +++ b/packages/svelte/src/compiler/utils/extract_svelte_ignore.js @@ -1,5 +1,5 @@ import { IGNORABLE_RUNTIME_WARNINGS } from '../../constants.js'; -import fuzzymatch from '../phases/1-parse/utils/fuzzymatch.js'; +import fuzzymatch from './fuzzymatch.js'; import * as w from '../warnings.js'; const regex_svelte_ignore = /^\s*svelte-ignore\s/; diff --git a/packages/svelte/src/compiler/phases/1-parse/utils/fuzzymatch.js b/packages/svelte/src/compiler/utils/fuzzymatch.js similarity index 100% rename from packages/svelte/src/compiler/phases/1-parse/utils/fuzzymatch.js rename to packages/svelte/src/compiler/utils/fuzzymatch.js diff --git a/packages/svelte/src/compiler/utils/mapped_code.js b/packages/svelte/src/compiler/utils/mapped_code.js index 635743c0c4..201ee8e6e9 100644 --- a/packages/svelte/src/compiler/utils/mapped_code.js +++ b/packages/svelte/src/compiler/utils/mapped_code.js @@ -1,10 +1,10 @@ /** @import { ValidatedCompileOptions } from '#compiler' */ + /** @import { Processed } from '../preprocess/public.js' */ /** @import { SourceMap } from 'magic-string' */ /** @import { Source } from '../preprocess/private.js' */ /** @import { DecodedSourceMap, SourceMapSegment, RawSourceMap } from '@jridgewell/remapping' */ import remapping from '@jridgewell/remapping'; -import { push_array } from './push_array.js'; /** * @param {string} s @@ -12,6 +12,18 @@ import { push_array } from './push_array.js'; function last_line_length(s) { return s.length - s.lastIndexOf('\n') - 1; } + +/** + * `array.push(...items)` overflows the stack for large `items`. + * @template T + * @param {T[]} array + * @param {T[]} items + */ +function push_array(array, items) { + for (let i = 0; i < items.length; i++) { + array.push(items[i]); + } +} // mutate map in-place /** diff --git a/packages/svelte/src/compiler/utils/push_array.js b/packages/svelte/src/compiler/utils/push_array.js deleted file mode 100644 index ee6a9f7c26..0000000000 --- a/packages/svelte/src/compiler/utils/push_array.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Pushes all `items` into `array` using `push`, therefore mutating the array. - * We do this for memory and perf reasons, and because `array.push(...items)` would - * run into a "max call stack size exceeded" error with too many items (~65k). - * @template T - * @param {T[]} array - * @param {T[]} items - */ -export function push_array(array, items) { - for (let i = 0; i < items.length; i++) { - array.push(items[i]); - } -}