Skip to content

Commit fbb6fb6

Browse files
committed
Merge pull request #1593 from xzyfer/fix/issue-1562
Fix regression is allowing `@extend`ing across media queries
2 parents df2bfd0 + 61b6d56 commit fbb6fb6

File tree

5 files changed

+28
-4
lines changed

5 files changed

+28
-4
lines changed

src/ast.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,6 +1121,7 @@ namespace Sass {
11211121
Complex_Selector* Complex_Selector::clone(Context& ctx) const
11221122
{
11231123
Complex_Selector* cpy = SASS_MEMORY_NEW(ctx.mem, Complex_Selector, *this);
1124+
cpy->media_block(this->media_block());
11241125
if (tail()) cpy->tail(tail()->clone(ctx));
11251126
return cpy;
11261127
}
@@ -1143,12 +1144,14 @@ namespace Sass {
11431144
Compound_Selector* Compound_Selector::clone(Context& ctx) const
11441145
{
11451146
Compound_Selector* cpy = SASS_MEMORY_NEW(ctx.mem, Compound_Selector, *this);
1147+
cpy->media_block(this->media_block());
11461148
return cpy;
11471149
}
11481150

11491151
Selector_List* Selector_List::clone(Context& ctx) const
11501152
{
11511153
Selector_List* cpy = SASS_MEMORY_NEW(ctx.mem, Selector_List, *this);
1154+
cpy->media_block(this->media_block());
11521155
return cpy;
11531156
}
11541157

src/eval.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1395,6 +1395,7 @@ namespace Sass {
13951395
{
13961396
std::vector<Selector_List*> rv;
13971397
Selector_List* sl = SASS_MEMORY_NEW(ctx.mem, Selector_List, s->pstate());
1398+
sl->media_block(s->media_block());
13981399
for (size_t i = 0, iL = s->length(); i < iL; ++i) {
13991400
rv.push_back(operator()((*s)[i]));
14001401
}

src/expand.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -550,9 +550,13 @@ namespace Sass {
550550
dynamic_cast<Parent_Selector*>((*sel->head())[0])))
551551
{
552552
Compound_Selector* hh = SASS_MEMORY_NEW(ctx.mem, Compound_Selector, (*extender)[i]->pstate());
553+
hh->media_block((*extender)[i]->media_block());
553554
Complex_Selector* ssel = SASS_MEMORY_NEW(ctx.mem, Complex_Selector, (*extender)[i]->pstate());
555+
ssel->media_block((*extender)[i]->media_block());
554556
if (sel->has_line_feed()) ssel->has_line_feed(true);
555-
*hh << SASS_MEMORY_NEW(ctx.mem, Parent_Selector, (*extender)[i]->pstate());
557+
Parent_Selector* ps = SASS_MEMORY_NEW(ctx.mem, Parent_Selector, (*extender)[i]->pstate());
558+
ps->media_block((*extender)[i]->media_block());
559+
*hh << ps;
556560
ssel->tail(sel);
557561
ssel->head(hh);
558562
sel = ssel;

src/parser.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,7 @@ namespace Sass {
609609
String_Schema* schema = SASS_MEMORY_NEW(ctx.mem, String_Schema, pstate);
610610
// the selector schema is pretty much just a wrapper for the string schema
611611
Selector_Schema* selector_schema = SASS_MEMORY_NEW(ctx.mem, Selector_Schema, pstate, schema);
612+
selector_schema->media_block(last_media_block);
612613

613614
// process until end
614615
while (i < end_of_selector) {
@@ -693,6 +694,7 @@ namespace Sass {
693694
Complex_Selector* sel = 0;
694695
To_String to_string(&ctx);
695696
Selector_List* group = SASS_MEMORY_NEW(ctx.mem, Selector_List, pstate);
697+
group->media_block(last_media_block);
696698

697699
do {
698700
reloop = false;
@@ -774,6 +776,8 @@ namespace Sass {
774776
// source position of a complex selector points to the combinator
775777
// ToDo: make sure we update pstate for ancestor of (lex < zero >());
776778
Complex_Selector* sel = SASS_MEMORY_NEW(ctx.mem, Complex_Selector, pstate, combinator, lhs);
779+
sel->media_block(last_media_block);
780+
777781
if (combinator == Complex_Selector::REFERENCE) sel->reference(reference);
778782
// has linfeed after combinator?
779783
sel->has_line_break(peek_newline());
@@ -795,13 +799,18 @@ namespace Sass {
795799
if (!sel->has_reference() && !in_at_root && !in_root) {
796800
// create the objects to wrap parent selector reference
797801
Parent_Selector* parent = SASS_MEMORY_NEW(ctx.mem, Parent_Selector, pstate);
802+
parent->media_block(last_media_block);
798803
Compound_Selector* head = SASS_MEMORY_NEW(ctx.mem, Compound_Selector, pstate);
804+
head->media_block(last_media_block);
799805
// add simple selector
800806
(*head) << parent;
801807
// selector may not have any head yet
802808
if (!sel->head()) { sel->head(head); }
803809
// otherwise we need to create a new complex selector and set the old one as its tail
804-
else { sel = SASS_MEMORY_NEW(ctx.mem, Complex_Selector, pstate, Complex_Selector::ANCESTOR_OF, head, sel); }
810+
else {
811+
sel = SASS_MEMORY_NEW(ctx.mem, Complex_Selector, pstate, Complex_Selector::ANCESTOR_OF, head, sel);
812+
sel->media_block(last_media_block);
813+
}
805814
// peek for linefeed and remember result on head
806815
// if (peek_newline()) head->has_line_break(true);
807816
}
@@ -818,6 +827,7 @@ namespace Sass {
818827
{
819828
// init an empty compound selector wrapper
820829
Compound_Selector* seq = SASS_MEMORY_NEW(ctx.mem, Compound_Selector, pstate);
830+
seq->media_block(last_media_block);
821831

822832
// skip initial white-space
823833
lex< css_whitespace >();
@@ -892,7 +902,9 @@ namespace Sass {
892902
return parse_attribute_selector();
893903
}
894904
else if (lex< placeholder >()) {
895-
return SASS_MEMORY_NEW(ctx.mem, Selector_Placeholder, pstate, lexed);
905+
Selector_Placeholder* sel = SASS_MEMORY_NEW(ctx.mem, Selector_Placeholder, pstate, lexed);
906+
sel->media_block(last_media_block);
907+
return sel;
896908
}
897909
// failed
898910
return 0;
@@ -1912,7 +1924,10 @@ namespace Sass {
19121924
Media_Block* media_block = SASS_MEMORY_NEW(ctx.mem, Media_Block, pstate, 0, 0);
19131925
media_block->media_queries(parse_media_queries());
19141926

1927+
Media_Block* prev_media_block = last_media_block;
1928+
last_media_block = media_block;
19151929
media_block->block(parse_css_block());
1930+
last_media_block = prev_media_block;
19161931

19171932
return media_block;
19181933
}

src/parser.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ namespace Sass {
3232
Context& ctx;
3333
std::vector<Block*> block_stack;
3434
std::vector<Syntactic_Context> stack;
35+
Media_Block* last_media_block;
3536
const char* source;
3637
const char* position;
3738
const char* end;
@@ -45,7 +46,7 @@ namespace Sass {
4546
bool in_at_root;
4647

4748
Parser(Context& ctx, const ParserState& pstate)
48-
: ParserState(pstate), ctx(ctx), block_stack(0), stack(0),
49+
: ParserState(pstate), ctx(ctx), block_stack(0), stack(0), last_media_block(0),
4950
source(0), position(0), end(0), before_token(pstate), after_token(pstate), pstate(pstate), indentation(0)
5051
{ in_at_root = false; stack.push_back(nothing); }
5152

0 commit comments

Comments
 (0)