fix: correctly match :has()'s selector during css pruning

#15277

Closing issue

Pull request

Merged
7
7nik
Feb 12, 2025, 1:45 PM

Fixes #14072, alternative of #15207

:has() was matching only against descendants or siblings, but not sibling's descendants.

In this variant, I made apply_selector and related functions bidirectional. So the same logic can be applied to all selectors. Changing the direction for selectors passed into :has() broke p:has(+ y) for the test has-with-render-tag and to fix it I added diving into the @render() tags during gathering siblings, which fixed the render-tag-loop test.

I also tried to cache the function retrieving neighbor elements and got the following cache hits rates on the test cases: descendant_forward: 94,23% descendant_backward: 55,91% children_forward: 84,00% children_backward: 33,51% sibling_forward: 69,42% sibling_backward: 59,94% next_forward: 41,40% next_backward: 2,44% Though, I'm not sure how to measure performance change.

Before submitting the PR, please make sure you do the following

  • It's really useful if your PR references an issue where it is discussed ahead of time. In many cases, features are absent for a reason. For large changes, please create an RFC: https://github.com/sveltejs/rfcs
  • Prefix your PR title with feat:, fix:, chore:, or docs:.
  • This message body should clearly illustrate what problems it solves.
  • Ideally, include a test that fails without this PR but passes with it.
  • If this PR changes code within packages/svelte/src, add a changeset (npx changeset).

Tests and linting

  • Run the tests with pnpm test and lint the project with pnpm lint

Info

Merged at Mar 14, 2025, 9:44 PM
Merged by dummdidumm
Assignees None
Reviewers None
Labels None
Milestone None