diff --git a/internal/css_ast/css_ast.go b/internal/css_ast/css_ast.go index b7a17316210..556ce36e1d5 100644 --- a/internal/css_ast/css_ast.go +++ b/internal/css_ast/css_ast.go @@ -799,6 +799,14 @@ func (s ComplexSelector) CloneWithoutLeadingCombinator() ComplexSelector { return clone } +func (s ComplexSelector) Clone() ComplexSelector { + clone := ComplexSelector{Selectors: make([]CompoundSelector, len(s.Selectors))} + for i, sel := range s.Selectors { + clone.Selectors[i] = sel.Clone() + } + return clone +} + func (sel ComplexSelector) IsRelative() bool { if sel.Selectors[0].Combinator.Byte == 0 { for _, inner := range sel.Selectors { @@ -1199,7 +1207,7 @@ func (ss *SSPseudoClassWithSelectorList) Clone() SS { clone := *ss clone.Selectors = make([]ComplexSelector, len(ss.Selectors)) for i, sel := range ss.Selectors { - clone.Selectors[i] = sel.CloneWithoutLeadingCombinator() + clone.Selectors[i] = sel.Clone() } return &clone } diff --git a/internal/css_parser/css_parser_test.go b/internal/css_parser/css_parser_test.go index c4daa21fd9e..fc721e9433c 100644 --- a/internal/css_parser/css_parser_test.go +++ b/internal/css_parser/css_parser_test.go @@ -1261,6 +1261,7 @@ func TestNestedSelector(t *testing.T) { expectPrintedLowerUnsupported(t, nesting, ".demo { .lg { &.triangle, &.circle { color: red } } }", ".demo .lg:is(.triangle, .circle) {\n color: red;\n}\n", "") expectPrintedLowerUnsupported(t, nesting, ".demo { .lg { .triangle, .circle { color: red } } }", ".demo .lg :is(.triangle, .circle) {\n color: red;\n}\n", "") expectPrintedLowerUnsupported(t, nesting, ".card { .featured & & & { color: red } }", ".featured .card .card .card {\n color: red;\n}\n", "") + expectPrintedLowerUnsupported(t, nesting, ".a :has(> .c) { .b & { background-color: green; } }", ".b :is(.a :has(> .c)) {\n background-color: green;\n}\n", "") // These are invalid SASS-style nested suffixes expectPrintedLower(t, ".card { &--header { color: red } }", ".card {\n &--header {\n color: red;\n }\n}\n",