Skip to content

Commit 78a6a77

Browse files
committed
Merge pull request #2032 from mgreter/bugfix/issue_2031
Fix extending inner of wrapped selectors (unwrap)
2 parents 57fbfb9 + 4796e00 commit 78a6a77

File tree

4 files changed

+56
-15
lines changed

4 files changed

+56
-15
lines changed

src/extend.cpp

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "parser.hpp"
77
#include "node.hpp"
88
#include "sass_util.hpp"
9+
#include "remove_placeholders.hpp"
910
#include "debug.hpp"
1011
#include <iostream>
1112
#include <deque>
@@ -1944,19 +1945,57 @@ namespace Sass {
19441945
}
19451946
}
19461947

1947-
for (Complex_Selector* cs : *pNewSelectors) {
1948-
while (cs) {
1949-
if (cs->head()) {
1950-
for (Simple_Selector* ss : *cs->head()) {
1951-
if (Wrapped_Selector* ws = dynamic_cast<Wrapped_Selector*>(ss)) {
1952-
if (Selector_List* sl = dynamic_cast<Selector_List*>(ws->selector())) {
1953-
bool extended = false;
1954-
ws->selector(extendSelectorList(sl, ctx, subset_map, false, extended));
1948+
Remove_Placeholders remove_placeholders(ctx);
1949+
// it seems that we have to remove the place holders early here
1950+
// normally we do this as the very last step (compare to ruby sass)
1951+
pNewSelectors = remove_placeholders.remove_placeholders(pNewSelectors);
1952+
1953+
// unwrap all wrapped selectors with inner lists
1954+
for (Complex_Selector* cur : *pNewSelectors) {
1955+
// process tails
1956+
while (cur) {
1957+
// process header
1958+
if (cur->head()) {
1959+
// create a copy since we add multiple items if stuff get unwrapped
1960+
Compound_Selector* cpy_head = SASS_MEMORY_NEW(ctx.mem, Compound_Selector, cur->pstate());
1961+
for (Simple_Selector* hs : *cur->head()) {
1962+
if (Wrapped_Selector* ws = dynamic_cast<Wrapped_Selector*>(hs)) {
1963+
if (Selector_List* sl = dynamic_cast<Selector_List*>(ws->selector())) {
1964+
// special case for ruby ass
1965+
if (sl->empty()) {
1966+
// this seems inconsistent but it is how ruby sass seems to remove parentheses
1967+
*cpy_head << SASS_MEMORY_NEW(ctx.mem, Type_Selector, hs->pstate(), ws->name());
1968+
}
1969+
// has wrapped selectors
1970+
else {
1971+
// extend the inner list of wrapped selector
1972+
Selector_List* ext_sl = extendSelectorList(sl, ctx, subset_map);
1973+
for (size_t i = 0; i < ext_sl->length(); i += 1) {
1974+
if (Complex_Selector* ext_cs = ext_sl->at(i)) {
1975+
// create clones for wrapped selector and the inner list
1976+
Wrapped_Selector* cpy_ws = SASS_MEMORY_NEW(ctx.mem, Wrapped_Selector, *ws);
1977+
Selector_List* cpy_ws_sl = SASS_MEMORY_NEW(ctx.mem, Selector_List, sl->pstate());
1978+
// remove parent selectors from inner selector
1979+
if (ext_cs->first()) *cpy_ws_sl << ext_cs->first();
1980+
// assign list to clone
1981+
cpy_ws->selector(cpy_ws_sl);
1982+
// append the clone
1983+
*cpy_head << cpy_ws;
1984+
}
1985+
}
1986+
}
1987+
} else {
1988+
*cpy_head << hs;
1989+
}
1990+
} else {
1991+
*cpy_head << hs;
19551992
}
19561993
}
1994+
// replace header
1995+
cur->head(cpy_head);
19571996
}
1958-
}
1959-
cs = cs->tail();
1997+
// process tail
1998+
cur = cur->tail();
19601999
}
19612000
}
19622001
return pNewSelectors;

src/extend.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ namespace Sass {
2424
public:
2525
static Node subweave(Node& one, Node& two, Context& ctx);
2626
static Selector_List* extendSelectorList(Selector_List* pSelectorList, Context& ctx, ExtensionSubsetMap& subset_map, bool isReplace, bool& extendedSomething);
27+
static Selector_List* extendSelectorList(Selector_List* pSelectorList, Context& ctx, ExtensionSubsetMap& subset_map, bool isReplace = false) {
28+
bool extendedSomething = false;
29+
return extendSelectorList(pSelectorList, ctx, subset_map, isReplace, extendedSomething);
30+
}
2731
Extend(Context&, ExtensionSubsetMap&);
2832
~Extend() { }
2933

src/functions.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1889,8 +1889,7 @@ namespace Sass {
18891889
ExtensionSubsetMap subset_map;
18901890
extender->populate_extends(extendee, ctx, subset_map);
18911891

1892-
bool extendedSomething;
1893-
Selector_List* result = Extend::extendSelectorList(selector, ctx, subset_map, false, extendedSomething);
1892+
Selector_List* result = Extend::extendSelectorList(selector, ctx, subset_map, false);
18941893

18951894
Listize listize(ctx.mem);
18961895
return result->perform(&listize);
@@ -1906,8 +1905,7 @@ namespace Sass {
19061905
ExtensionSubsetMap subset_map;
19071906
replacement->populate_extends(original, ctx, subset_map);
19081907

1909-
bool extendedSomething;
1910-
Selector_List* result = Extend::extendSelectorList(selector, ctx, subset_map, true, extendedSomething);
1908+
Selector_List* result = Extend::extendSelectorList(selector, ctx, subset_map, true);
19111909

19121910
Listize listize(ctx.mem);
19131911
return result->perform(&listize);

src/remove_placeholders.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace Sass {
1717

1818
void fallback_impl(AST_Node* n) {}
1919

20-
private:
20+
public:
2121
Selector_List* remove_placeholders(Selector_List*);
2222

2323
public:

0 commit comments

Comments
 (0)