Skip to content

Commit

Permalink
Merge pull request #1593 from xzyfer/fix/issue-1562
Browse files Browse the repository at this point in the history
Fix regression is allowing `@extend`ing across media queries
  • Loading branch information
xzyfer committed Oct 11, 2015
2 parents df2bfd0 + 61b6d56 commit fbb6fb6
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 4 deletions.
3 changes: 3 additions & 0 deletions src/ast.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1121,6 +1121,7 @@ namespace Sass {
Complex_Selector* Complex_Selector::clone(Context& ctx) const
{
Complex_Selector* cpy = SASS_MEMORY_NEW(ctx.mem, Complex_Selector, *this);
cpy->media_block(this->media_block());
if (tail()) cpy->tail(tail()->clone(ctx));
return cpy;
}
Expand All @@ -1143,12 +1144,14 @@ namespace Sass {
Compound_Selector* Compound_Selector::clone(Context& ctx) const
{
Compound_Selector* cpy = SASS_MEMORY_NEW(ctx.mem, Compound_Selector, *this);
cpy->media_block(this->media_block());
return cpy;
}

Selector_List* Selector_List::clone(Context& ctx) const
{
Selector_List* cpy = SASS_MEMORY_NEW(ctx.mem, Selector_List, *this);
cpy->media_block(this->media_block());
return cpy;
}

Expand Down
1 change: 1 addition & 0 deletions src/eval.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1395,6 +1395,7 @@ namespace Sass {
{
std::vector<Selector_List*> rv;
Selector_List* sl = SASS_MEMORY_NEW(ctx.mem, Selector_List, s->pstate());
sl->media_block(s->media_block());
for (size_t i = 0, iL = s->length(); i < iL; ++i) {
rv.push_back(operator()((*s)[i]));
}
Expand Down
6 changes: 5 additions & 1 deletion src/expand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -550,9 +550,13 @@ namespace Sass {
dynamic_cast<Parent_Selector*>((*sel->head())[0])))
{
Compound_Selector* hh = SASS_MEMORY_NEW(ctx.mem, Compound_Selector, (*extender)[i]->pstate());
hh->media_block((*extender)[i]->media_block());
Complex_Selector* ssel = SASS_MEMORY_NEW(ctx.mem, Complex_Selector, (*extender)[i]->pstate());
ssel->media_block((*extender)[i]->media_block());
if (sel->has_line_feed()) ssel->has_line_feed(true);
*hh << SASS_MEMORY_NEW(ctx.mem, Parent_Selector, (*extender)[i]->pstate());
Parent_Selector* ps = SASS_MEMORY_NEW(ctx.mem, Parent_Selector, (*extender)[i]->pstate());
ps->media_block((*extender)[i]->media_block());
*hh << ps;
ssel->tail(sel);
ssel->head(hh);
sel = ssel;
Expand Down
19 changes: 17 additions & 2 deletions src/parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -609,6 +609,7 @@ namespace Sass {
String_Schema* schema = SASS_MEMORY_NEW(ctx.mem, String_Schema, pstate);
// the selector schema is pretty much just a wrapper for the string schema
Selector_Schema* selector_schema = SASS_MEMORY_NEW(ctx.mem, Selector_Schema, pstate, schema);
selector_schema->media_block(last_media_block);

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

do {
reloop = false;
Expand Down Expand Up @@ -774,6 +776,8 @@ namespace Sass {
// source position of a complex selector points to the combinator
// ToDo: make sure we update pstate for ancestor of (lex < zero >());
Complex_Selector* sel = SASS_MEMORY_NEW(ctx.mem, Complex_Selector, pstate, combinator, lhs);
sel->media_block(last_media_block);

if (combinator == Complex_Selector::REFERENCE) sel->reference(reference);
// has linfeed after combinator?
sel->has_line_break(peek_newline());
Expand All @@ -795,13 +799,18 @@ namespace Sass {
if (!sel->has_reference() && !in_at_root && !in_root) {
// create the objects to wrap parent selector reference
Parent_Selector* parent = SASS_MEMORY_NEW(ctx.mem, Parent_Selector, pstate);
parent->media_block(last_media_block);
Compound_Selector* head = SASS_MEMORY_NEW(ctx.mem, Compound_Selector, pstate);
head->media_block(last_media_block);
// add simple selector
(*head) << parent;
// selector may not have any head yet
if (!sel->head()) { sel->head(head); }
// otherwise we need to create a new complex selector and set the old one as its tail
else { sel = SASS_MEMORY_NEW(ctx.mem, Complex_Selector, pstate, Complex_Selector::ANCESTOR_OF, head, sel); }
else {
sel = SASS_MEMORY_NEW(ctx.mem, Complex_Selector, pstate, Complex_Selector::ANCESTOR_OF, head, sel);
sel->media_block(last_media_block);
}
// peek for linefeed and remember result on head
// if (peek_newline()) head->has_line_break(true);
}
Expand All @@ -818,6 +827,7 @@ namespace Sass {
{
// init an empty compound selector wrapper
Compound_Selector* seq = SASS_MEMORY_NEW(ctx.mem, Compound_Selector, pstate);
seq->media_block(last_media_block);

// skip initial white-space
lex< css_whitespace >();
Expand Down Expand Up @@ -892,7 +902,9 @@ namespace Sass {
return parse_attribute_selector();
}
else if (lex< placeholder >()) {
return SASS_MEMORY_NEW(ctx.mem, Selector_Placeholder, pstate, lexed);
Selector_Placeholder* sel = SASS_MEMORY_NEW(ctx.mem, Selector_Placeholder, pstate, lexed);
sel->media_block(last_media_block);
return sel;
}
// failed
return 0;
Expand Down Expand Up @@ -1912,7 +1924,10 @@ namespace Sass {
Media_Block* media_block = SASS_MEMORY_NEW(ctx.mem, Media_Block, pstate, 0, 0);
media_block->media_queries(parse_media_queries());

Media_Block* prev_media_block = last_media_block;
last_media_block = media_block;
media_block->block(parse_css_block());
last_media_block = prev_media_block;

return media_block;
}
Expand Down
3 changes: 2 additions & 1 deletion src/parser.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ namespace Sass {
Context& ctx;
std::vector<Block*> block_stack;
std::vector<Syntactic_Context> stack;
Media_Block* last_media_block;
const char* source;
const char* position;
const char* end;
Expand All @@ -45,7 +46,7 @@ namespace Sass {
bool in_at_root;

Parser(Context& ctx, const ParserState& pstate)
: ParserState(pstate), ctx(ctx), block_stack(0), stack(0),
: ParserState(pstate), ctx(ctx), block_stack(0), stack(0), last_media_block(0),
source(0), position(0), end(0), before_token(pstate), after_token(pstate), pstate(pstate), indentation(0)
{ in_at_root = false; stack.push_back(nothing); }

Expand Down

0 comments on commit fbb6fb6

Please sign in to comment.