Skip to content

Commit b96723b

Browse files
committed
Fix media block propagation via @content nodes
1 parent ed5b844 commit b96723b

File tree

5 files changed

+16
-1
lines changed

5 files changed

+16
-1
lines changed

src/ast.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -856,6 +856,7 @@ namespace Sass {
856856
// The @content directive for mixin content blocks.
857857
///////////////////////////////////////////////////
858858
class Content : public Statement {
859+
ADD_PROPERTY(Media_Block*, media_block)
859860
public:
860861
Content(ParserState pstate) : Statement(pstate)
861862
{ statement_type(CONTENT); }

src/debugger.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
352352
Content* block = dynamic_cast<Content*>(node);
353353
std::cerr << ind << "Content " << block;
354354
std::cerr << " (" << pstate_source_position(node) << ")";
355+
std::cerr << " [@media:" << block->media_block() << "]";
355356
std::cerr << " " << block->tabs() << std::endl;
356357
} else if (dynamic_cast<Import_Stub*>(node)) {
357358
Import_Stub* block = dynamic_cast<Import_Stub*>(node);
@@ -564,6 +565,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
564565
Content* expression = dynamic_cast<Content*>(node);
565566
std::cerr << ind << "Content " << expression;
566567
std::cerr << " (" << pstate_source_position(node) << ")";
568+
std::cerr << " [@media:" << expression->media_block() << "]";
567569
std::cerr << " [Statement]" << std::endl;
568570
} else if (dynamic_cast<Boolean*>(node)) {
569571
Boolean* expression = dynamic_cast<Boolean*>(node);

src/expand.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ namespace Sass {
1919
call_stack(std::vector<AST_Node*>()),
2020
property_stack(std::vector<String*>()),
2121
selector_stack(std::vector<Selector_List*>()),
22+
media_block_stack(std::vector<Media_Block*>()),
2223
backtrace_stack(std::vector<Backtrace*>()),
2324
in_keyframes(false)
2425
{
@@ -29,6 +30,7 @@ namespace Sass {
2930
// import_stack.push_back(0);
3031
property_stack.push_back(0);
3132
selector_stack.push_back(0);
33+
media_block_stack.push_back(0);
3234
backtrace_stack.push_back(0);
3335
backtrace_stack.push_back(bt);
3436
}
@@ -195,6 +197,7 @@ namespace Sass {
195197

196198
Statement* Expand::operator()(Media_Block* m)
197199
{
200+
media_block_stack.push_back(m);
198201
Expression* mq = m->media_queries()->perform(&eval);
199202
std::string str_mq(mq->to_string(ctx.c_options));
200203
char* str = sass_copy_c_string(str_mq.c_str());
@@ -206,6 +209,7 @@ namespace Sass {
206209
static_cast<List*>(mq->perform(&eval)),
207210
m->block()->perform(this)->block(),
208211
0);
212+
media_block_stack.pop_back();
209213
mm->tabs(m->tabs());
210214
return mm;
211215
}
@@ -625,6 +629,13 @@ namespace Sass {
625629
if (Selector_Schema* schema = dynamic_cast<Selector_Schema*>(s)) {
626630
if (schema->has_parent_ref()) s = eval(schema);
627631
}
632+
if (Selector_List* sl = dynamic_cast<Selector_List*>(s)) {
633+
for (Complex_Selector* cs : *sl) {
634+
if (cs != NULL && cs->head() != NULL) {
635+
cs->head()->media_block(media_block_stack.back());
636+
}
637+
}
638+
}
628639
selector_stack.push_back(0);
629640
expand_selector_list(s, extender);
630641
selector_stack.pop_back();

src/expand.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ namespace Sass {
3333
std::vector<AST_Node*> call_stack;
3434
std::vector<String*> property_stack;
3535
std::vector<Selector_List*> selector_stack;
36+
std::vector<Media_Block*> media_block_stack;
3637
std::vector<Backtrace*>backtrace_stack;
3738
bool in_keyframes;
3839

src/extend.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1737,7 +1737,7 @@ namespace Sass {
17371737
SubsetMapEntries entries = subset_map.get_v(pHead->to_str_vec());
17381738
for (ExtensionPair ext : entries) {
17391739
// check if both selectors have the same media block parent
1740-
if (ext.first->media_block() == pComplexSelector->media_block()) continue;
1740+
// if (ext.first->media_block() == pComplexSelector->media_block()) continue;
17411741
if (ext.second->media_block() == 0) continue;
17421742
if (pComplexSelector->media_block() &&
17431743
ext.second->media_block()->media_queries() &&

0 commit comments

Comments
 (0)