Skip to content

Commit a1330c8

Browse files
committed
another one
1 parent 6a4d1bb commit a1330c8

File tree

4 files changed

+35
-3
lines changed

4 files changed

+35
-3
lines changed

packages/svelte/src/compiler/phases/2-analyze/css/css-prune.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -825,9 +825,10 @@ function get_element_parent(node) {
825825
/**
826826
* @param {Compiler.AST.RegularElement | Compiler.AST.SvelteElement | Compiler.AST.RenderTag | Compiler.AST.Component | Compiler.AST.SvelteComponent | Compiler.AST.SvelteSelf} node
827827
* @param {boolean} adjacent_only
828+
* @param {Set<Compiler.AST.SnippetBlock>} seen
828829
* @returns {Map<Compiler.AST.RegularElement | Compiler.AST.SvelteElement | Compiler.AST.SlotElement | Compiler.AST.RenderTag, NodeExistsValue>}
829830
*/
830-
function get_possible_element_siblings(node, adjacent_only) {
831+
function get_possible_element_siblings(node, adjacent_only, seen = new Set()) {
831832
/** @type {Map<Compiler.AST.RegularElement | Compiler.AST.SvelteElement | Compiler.AST.SlotElement | Compiler.AST.RenderTag, NodeExistsValue>} */
832833
const result = new Map();
833834
const path = node.metadata.path;
@@ -886,8 +887,11 @@ function get_possible_element_siblings(node, adjacent_only) {
886887
}
887888

888889
if (current.type === 'SnippetBlock') {
890+
if (seen.has(current)) break;
891+
seen.add(current);
892+
889893
for (const site of current.metadata.sites) {
890-
const siblings = get_possible_element_siblings(site, adjacent_only);
894+
const siblings = get_possible_element_siblings(site, adjacent_only, seen);
891895
add_to_map(siblings, result);
892896

893897
if (adjacent_only && current.metadata.sites.size === 1 && has_definite_elements(siblings)) {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
warnings: [
5+
{
6+
code: 'css_unused_selector',
7+
message: 'Unused CSS selector "div + div"',
8+
start: {
9+
line: 19,
10+
column: 1,
11+
character: 185
12+
},
13+
end: {
14+
line: 19,
15+
column: 10,
16+
character: 194
17+
}
18+
}
19+
]
20+
});
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11

2-
div.svelte-xyz div:where(.svelte-xyz) {
2+
div div.svelte-xyz {
33
color: green;
44
}
5+
/* (unused) div + div {
6+
color: red; /* this is marked as unused, but only because we've written an infinite loop - worth fixing? *\/
7+
}*/
58
div.svelte-xyz:has(div:where(.svelte-xyz)) {
69
color: green;
710
}

packages/svelte/tests/css/samples/render-tag-loop/input.svelte

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
{#snippet a()}
2+
{@render b()}
23
<div>
34
{@render b()}
45
</div>
56
{/snippet}
67

78
{#snippet b()}
9+
{@render a()}
810
<div>
911
{@render a()}
1012
</div>
@@ -14,6 +16,9 @@
1416
div div {
1517
color: green;
1618
}
19+
div + div {
20+
color: red; /* this is marked as unused, but only because we've written an infinite loop - worth fixing? */
21+
}
1722
div:has(div) {
1823
color: green;
1924
}

0 commit comments

Comments
 (0)