Skip to content

Commit 7037f03

Browse files
authored
Merge pull request #3184 from mgreter/bugfix/x-mas-2023
Fix most urgent issues in 2023
2 parents 2102188 + 5bb0ea0 commit 7037f03

File tree

4 files changed

+19
-11
lines changed

4 files changed

+19
-11
lines changed

src/ast_selectors.cpp

+8-6
Original file line numberDiff line numberDiff line change
@@ -868,7 +868,7 @@ namespace Sass {
868868
for (SimpleSelectorObj simple : elements()) {
869869
if (PseudoSelector * pseudo = Cast<PseudoSelector>(simple)) {
870870
if (SelectorList* sel = Cast<SelectorList>(pseudo->selector())) {
871-
if (parent) {
871+
if (parent && !parent->has_real_parent_ref()) {
872872
pseudo->selector(sel->resolve_parent_refs(
873873
pstack, traces, implicit_parent));
874874
}
@@ -976,20 +976,22 @@ namespace Sass {
976976
}
977977

978978
/* better return sass::vector? only - is empty container anyway? */
979-
SelectorList* ComplexSelector::resolve_parent_refs(SelectorStack pstack, Backtraces& traces, bool implicit_parent)
979+
SelectorList* ComplexSelector::resolve_parent_refs(
980+
SelectorStack pstack, Backtraces& traces, bool implicit_parent)
980981
{
981982

982983
sass::vector<sass::vector<ComplexSelectorObj>> vars;
983984

984985
auto parent = pstack.back();
986+
auto hasRealParent = has_real_parent_ref();
985987

986-
if (has_real_parent_ref() && !parent) {
988+
if (hasRealParent && !parent) {
987989
throw Exception::TopLevelParent(traces, pstate());
988990
}
989991

990992
if (!chroots() && parent) {
991993

992-
if (!has_real_parent_ref() && !implicit_parent) {
994+
if (!hasRealParent && !implicit_parent) {
993995
SelectorList* retval = SASS_MEMORY_NEW(SelectorList, pstate(), 1);
994996
retval->append(this);
995997
return retval;
@@ -1020,10 +1022,10 @@ namespace Sass {
10201022
for (auto items : res) {
10211023
if (items.size() > 0) {
10221024
ComplexSelectorObj first = SASS_MEMORY_COPY(items[0]);
1023-
first->hasPreLineFeed(first->hasPreLineFeed() || (!has_real_parent_ref() && hasPreLineFeed()));
1025+
first->hasPreLineFeed(first->hasPreLineFeed() || (!hasRealParent && hasPreLineFeed()));
10241026
// ToDo: remove once we know how to handle line feeds
10251027
// ToDo: currently a mashup between ruby and dart sass
1026-
// if (has_real_parent_ref()) first->has_line_feed(false);
1028+
// if (hasRealParent) first->has_line_feed(false);
10271029
// first->has_line_break(first->has_line_break() || has_line_break());
10281030
first->chroots(true); // has been resolved by now
10291031
for (size_t i = 1; i < items.size(); i += 1) {

src/debugger.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@ inline void debug_ast(AST_Node* node, sass::string ind, Env* env)
430430
std::cerr << " <<" << selector->ns_name() << ">>";
431431
std::cerr << (selector->isClass() ? " [isClass]": " -");
432432
std::cerr << (selector->isSyntacticClass() ? " [isSyntacticClass]": " -");
433+
std::cerr << (selector->has_real_parent_ref(nullptr) ? " [real parent]" : " -");
433434
std::cerr << std::endl;
434435
debug_ast(selector->argument(), ind + " <= ", env);
435436
debug_ast(selector->selector(), ind + " || ", env);

src/fn_miscs.cpp

+8-4
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,14 @@ namespace Sass {
160160
ExpressionObj cond = ARG("$condition", Expression)->perform(&expand.eval);
161161
bool is_true = !cond->is_false();
162162
ExpressionObj res = ARG(is_true ? "$if-true" : "$if-false", Expression);
163-
ValueObj qwe = Cast<Value>(res->perform(&expand.eval));
164-
// res = res->perform(&expand.eval.val_eval);
165-
qwe->set_delayed(false); // clone?
166-
return qwe.detach();
163+
ExpressionObj rv = res->perform(&expand.eval);
164+
ValueObj value = Cast<Value>(rv);
165+
if (value != nullptr) {
166+
value->set_delayed(false);
167+
return value.detach();
168+
}
169+
rv->set_delayed(false);
170+
return nullptr;
167171
}
168172

169173
//////////////////////////

src/inspect.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,7 @@ namespace Sass {
463463
{ sep[0] = i % 2 ? ':' : ','; }
464464
ExpressionObj list_item = list->at(i);
465465
if (output_style() != TO_SASS) {
466+
if (list_item == nullptr) continue;
466467
if (list_item->is_invisible()) {
467468
// this fixes an issue with "" in a list
468469
if (!Cast<String_Constant>(list_item)) {
@@ -1088,7 +1089,7 @@ namespace Sass {
10881089

10891090
void Inspect::operator()(CompoundSelector* sel)
10901091
{
1091-
if (sel->hasRealParent()) {
1092+
if (sel->hasRealParent() /* || sel->has_real_parent_ref() */) {
10921093
append_string("&");
10931094
}
10941095
for (auto& item : sel->elements()) {

0 commit comments

Comments
 (0)