fix: parse declaration tags with a division operator in the initializer#18353
Conversation
🦋 Changeset detectedLatest commit: d8e126d The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
parse_statement_at now drives the boundary with acorn, so an unterminated
declaration tag (e.g. `{let x = a /`) surfaced acorn's generic js_parse_error
instead of the unexpected_eof diagnostic the declaration-tag-trailing-slash
test (sveltejs#18350) relies on. Remap acorn's end-of-input error (err.pos at the end
of the source) back to unexpected_eof; other malformed-at-EOF inputs keep their
more specific acorn message.
Also cast the parsed Statement to acorn.Node for add_comments, resolving the
TS2345 from estree Statement.start being number|undefined.
|
Both review-bot findings were correct. Pushed ad576ed to address them. 1.
(One thing I also corrected: the catch variable was named 2. TS2345 on |
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## svelte@5.56.1 ### Patch Changes - fix: error at compile time on duplicate snippet/declaration tag definitions ([#18351](#18351)) - fix: parse declaration tag contents more robustly ([#18353](#18353)) - fix: correctly transform references to earlier declarators in a declaration tag (e.g. `{let a = $state(0), b = $derived(a * 2)}`) ([#18348](#18348)) - fix: avoid spurious `state_referenced_locally` warnings for `$derived` declarations in declaration tags ([#18348](#18348)) - fix: tolerate whitespace before `let`/`const` in declaration tags ([#18348](#18348)) - fix: prevent infinite loop when a tag's expression ends with a trailing `/` at the end of the input ([#18350](#18350)) - fix: more robust parsing of declaration tags with regards to `type` ([#18330](#18330)) - fix: preserve newlines in spread input values when the `type` attribute is applied after `value` ([#18345](#18345)) - fix: update `SvelteURLSearchParams` when setting duplicate keys to the same joined value ([#18336](#18336)) - fix: check references for blockers on server, too ([#18352](#18352)) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [svelte](https://svelte.dev) ([source](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte)) | [`5.56.0` → `5.56.1`](https://renovatebot.com/diffs/npm/svelte/5.56.0/5.56.1) |  |  | --- ### Release Notes <details> <summary>sveltejs/svelte (svelte)</summary> ### [`v5.56.1`](https://github.com/sveltejs/svelte/blob/HEAD/packages/svelte/CHANGELOG.md#5561) [Compare Source](https://github.com/sveltejs/svelte/compare/svelte@5.56.0...svelte@5.56.1) ##### Patch Changes - fix: error at compile time on duplicate snippet/declaration tag definitions ([#​18351](sveltejs/svelte#18351)) - fix: parse declaration tag contents more robustly ([#​18353](sveltejs/svelte#18353)) - fix: correctly transform references to earlier declarators in a declaration tag (e.g. `{let a = $state(0), b = $derived(a * 2)}`) ([#​18348](sveltejs/svelte#18348)) - fix: avoid spurious `state_referenced_locally` warnings for `$derived` declarations in declaration tags ([#​18348](sveltejs/svelte#18348)) - fix: tolerate whitespace before `let`/`const` in declaration tags ([#​18348](sveltejs/svelte#18348)) - fix: prevent infinite loop when a tag's expression ends with a trailing `/` at the end of the input ([#​18350](sveltejs/svelte#18350)) - fix: more robust parsing of declaration tags with regards to `type` ([#​18330](sveltejs/svelte#18330)) - fix: preserve newlines in spread input values when the `type` attribute is applied after `value` ([#​18345](sveltejs/svelte#18345)) - fix: update `SvelteURLSearchParams` when setting duplicate keys to the same joined value ([#​18336](sveltejs/svelte#18336)) - fix: check references for blockers on server, too ([#​18352](sveltejs/svelte#18352)) </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled because a matching PR was automerged previously. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xOTUuMCIsInVwZGF0ZWRJblZlciI6IjQzLjE5NS4wIiwidGFyZ2V0QnJhbmNoIjoiZGV2ZWxvcCIsImxhYmVscyI6W119--> Co-authored-by: huskas-2189 <huskas-2189@noreply.codeberg.org> Reviewed-on: https://codeberg.org/huskas-2189/Bookmark/pulls/82
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [svelte](https://svelte.dev) ([source](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte)) | [`5.56.0` → `5.56.1`](https://renovatebot.com/diffs/npm/svelte/5.56.0/5.56.1) |  |  | --- ### Release Notes <details> <summary>sveltejs/svelte (svelte)</summary> ### [`v5.56.1`](https://github.com/sveltejs/svelte/blob/HEAD/packages/svelte/CHANGELOG.md#5561) [Compare Source](https://github.com/sveltejs/svelte/compare/svelte@5.56.0...svelte@5.56.1) ##### Patch Changes - fix: error at compile time on duplicate snippet/declaration tag definitions ([#​18351](sveltejs/svelte#18351)) - fix: parse declaration tag contents more robustly ([#​18353](sveltejs/svelte#18353)) - fix: correctly transform references to earlier declarators in a declaration tag (e.g. `{let a = $state(0), b = $derived(a * 2)}`) ([#​18348](sveltejs/svelte#18348)) - fix: avoid spurious `state_referenced_locally` warnings for `$derived` declarations in declaration tags ([#​18348](sveltejs/svelte#18348)) - fix: tolerate whitespace before `let`/`const` in declaration tags ([#​18348](sveltejs/svelte#18348)) - fix: prevent infinite loop when a tag's expression ends with a trailing `/` at the end of the input ([#​18350](sveltejs/svelte#18350)) - fix: more robust parsing of declaration tags with regards to `type` ([#​18330](sveltejs/svelte#18330)) - fix: preserve newlines in spread input values when the `type` attribute is applied after `value` ([#​18345](sveltejs/svelte#18345)) - fix: update `SvelteURLSearchParams` when setting duplicate keys to the same joined value ([#​18336](sveltejs/svelte#18336)) - fix: check references for blockers on server, too ([#​18352](sveltejs/svelte#18352)) </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled because a matching PR was automerged previously. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xOTUuMCIsInVwZGF0ZWRJblZlciI6IjQzLjE5NS4wIiwidGFyZ2V0QnJhbmNoIjoiZGV2ZWxvcCIsImxhYmVscyI6W119--> Co-authored-by: huskas-2189 <huskas-2189@noreply.codeberg.org> Reviewed-on: https://codeberg.org/huskas-2189/Bookmark/pulls/82
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [svelte](https://svelte.dev) ([source](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte)) | [`5.56.0` → `5.56.1`](https://renovatebot.com/diffs/npm/svelte/5.56.0/5.56.1) |  |  | --- ### Release Notes <details> <summary>sveltejs/svelte (svelte)</summary> ### [`v5.56.1`](https://github.com/sveltejs/svelte/blob/HEAD/packages/svelte/CHANGELOG.md#5561) [Compare Source](https://github.com/sveltejs/svelte/compare/svelte@5.56.0...svelte@5.56.1) ##### Patch Changes - fix: error at compile time on duplicate snippet/declaration tag definitions ([#​18351](sveltejs/svelte#18351)) - fix: parse declaration tag contents more robustly ([#​18353](sveltejs/svelte#18353)) - fix: correctly transform references to earlier declarators in a declaration tag (e.g. `{let a = $state(0), b = $derived(a * 2)}`) ([#​18348](sveltejs/svelte#18348)) - fix: avoid spurious `state_referenced_locally` warnings for `$derived` declarations in declaration tags ([#​18348](sveltejs/svelte#18348)) - fix: tolerate whitespace before `let`/`const` in declaration tags ([#​18348](sveltejs/svelte#18348)) - fix: prevent infinite loop when a tag's expression ends with a trailing `/` at the end of the input ([#​18350](sveltejs/svelte#18350)) - fix: more robust parsing of declaration tags with regards to `type` ([#​18330](sveltejs/svelte#18330)) - fix: preserve newlines in spread input values when the `type` attribute is applied after `value` ([#​18345](sveltejs/svelte#18345)) - fix: update `SvelteURLSearchParams` when setting duplicate keys to the same joined value ([#​18336](sveltejs/svelte#18336)) - fix: check references for blockers on server, too ([#​18352](sveltejs/svelte#18352)) </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled because a matching PR was automerged previously. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xOTUuMCIsInVwZGF0ZWRJblZlciI6IjQzLjE5NS4wIiwidGFyZ2V0QnJhbmNoIjoiZGV2ZWxvcCIsImxhYmVscyI6W119--> Co-authored-by: huskas-2189 <huskas-2189@noreply.codeberg.org> Reviewed-on: https://codeberg.org/huskas-2189/Bookmark/pulls/82
{const ratio = width / height}, or any declaration tag with a top-level/in its initializer, currently fails to compile withunexpected_eof.parse_statement_atfigures out where the statement ends withfind_matching_bracket, and that scanner treats every/as the start of a regex literal, so it skips past the real}and runs to the next unrelated/or EOF.{@const}isn't affected because it reads its initializer through acorn'sparseExpressionAt, which knows a/after a value is division.This parses the declaration with acorn directly instead, so acorn decides regex-vs-division (and handles comments, keywords, TS annotations, destructuring and multi-declarator declarations) and reports the real statement end.
find_matching_bracketis unchanged and still used by the loose-parsing paths.Added a
printtest sample (declaration-tag-division) covering top-level division,$derived(a / b), member/call/string operands, a TS type annotation and a destructuring default, plus a regex containing}(/[}]/). Onmainthe division cases throwunexpected_eof; with the fix the sample parses and round-trips. The regex case matters: a regex containing}is exactly what a weaker fix would misread as the tag close.