From 05c86cdca8aaa9dab04ee63828d745afc8bfc860 Mon Sep 17 00:00:00 2001 From: Marcel Greter Date: Wed, 14 Dec 2016 19:24:32 +0100 Subject: [PATCH] Fixes extensions with selector schema in at-root Fixes https://github.com/sass/libsass/issues/2246 --- src/expand.cpp | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/expand.cpp b/src/expand.cpp index bf782ccc53..d71c6e4340 100644 --- a/src/expand.cpp +++ b/src/expand.cpp @@ -611,18 +611,29 @@ namespace Sass { { if (CommaSequence_Selector* extender = dynamic_cast(selector())) { Selector* s = e->selector(); - if (Selector_Schema* schema = dynamic_cast(s)) { - if (schema->has_parent_ref()) s = eval(schema); + CommaSequence_Selector* sl = NULL; + // check if we already have a valid selector list + if ((sl = dynamic_cast(s))) {} + // convert selector schema to a selector list + else if (Selector_Schema* schema = dynamic_cast(s)) { + if (schema->has_real_parent_ref()) { + sl = eval(schema); + } else { + selector_stack.push_back(0); + sl = eval(schema); + sl->remove_parent_selectors(); + selector_stack.pop_back(); + } } - if (CommaSequence_Selector* sl = dynamic_cast(s)) { - for (Sequence_Selector* cs : *sl) { - if (cs != NULL && cs->head() != NULL) { - cs->head()->media_block(media_block_stack.back()); - } + // abort on invalid selector + if (sl == NULL) return NULL; + for (Sequence_Selector* cs : *sl) { + if (cs != NULL && cs->head() != NULL) { + cs->head()->media_block(media_block_stack.back()); } } selector_stack.push_back(0); - expand_selector_list(s, extender); + expand_selector_list(sl, extender); selector_stack.pop_back(); } return 0;