Skip to content

Commit 3ba77f3

Browse files
committed
Don't drop pseudo elements in wrapped selectors
The extend visitor currently mutates some selectors, even ones that get extended. This patch works around a specific use case that breaks foundation. Spec sass/sass-spec#949 Fixes #2200
1 parent 50a628f commit 3ba77f3

File tree

2 files changed

+10
-19
lines changed

2 files changed

+10
-19
lines changed

src/debugger.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
116116
std::cerr << ind << "Sequence_Selector " << selector
117117
<< " (" << pstate_source_position(node) << ")"
118118
<< " <" << selector->hash() << ">"
119+
<< " [length:" << longToHex(selector->length()) << "]"
119120
<< " [weight:" << longToHex(selector->specificity()) << "]"
120121
<< " [@media:" << selector->media_block() << "]"
121122
<< (selector->is_invisible() ? " [INVISIBLE]": " -")

src/extend.cpp

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1722,23 +1722,6 @@ namespace Sass {
17221722
SimpleSequence_Selector* pHead = pIter->head();
17231723

17241724
if (pHead) {
1725-
if (seen.find(*pHead) == seen.end()) {
1726-
for (Simple_Selector* pSimple : *pHead) {
1727-
if (Wrapped_Selector* ws = dynamic_cast<Wrapped_Selector*>(pSimple)) {
1728-
if (CommaSequence_Selector* sl = dynamic_cast<CommaSequence_Selector*>(ws->selector())) {
1729-
for (Sequence_Selector* cs : sl->elements()) {
1730-
while (cs) {
1731-
if (complexSelectorHasExtension(cs, ctx, subset_map, seen)) {
1732-
hasExtension = true;
1733-
break;
1734-
}
1735-
cs = cs->tail();
1736-
}
1737-
}
1738-
}
1739-
}
1740-
}
1741-
}
17421725
SubsetMapEntries entries = subset_map.get_v(pHead->to_str_vec());
17431726
for (ExtensionPair ext : entries) {
17441727
// check if both selectors have the same media block parent
@@ -1989,8 +1972,15 @@ namespace Sass {
19891972
CommaSequence_Selector* cpy_ws_sl = SASS_MEMORY_NEW(ctx.mem, CommaSequence_Selector, sl->pstate());
19901973
// remove parent selectors from inner selector
19911974
if (ext_cs->first()) {
1992-
if (ext_cs->first()->has_wrapped_selector()) {
1993-
continue; // ignore this case for now
1975+
Wrapped_Selector* ext_ws = dynamic_cast<Wrapped_Selector*>(ext_cs->first()->head()->first());
1976+
if (ext_ws/* && ext_cs->length() == 1*/) {
1977+
CommaSequence_Selector* ws_cs = dynamic_cast<CommaSequence_Selector*>(ext_ws->selector());
1978+
SimpleSequence_Selector* ws_ss = ws_cs->first()->head();
1979+
if (!(
1980+
dynamic_cast<Pseudo_Selector*>(ws_ss->first()) ||
1981+
dynamic_cast<Element_Selector*>(ws_ss->first()) ||
1982+
dynamic_cast<Placeholder_Selector*>(ws_ss->first())
1983+
)) continue;
19941984
}
19951985
*cpy_ws_sl << ext_cs->first();
19961986
}

0 commit comments

Comments
 (0)