change where parent selectors are resolved

This commit is contained in:
ConnorSkees 2020-06-23 01:36:22 -04:00
parent 991be977ac
commit e94dd80a53
2 changed files with 12 additions and 30 deletions

View File

@ -80,23 +80,11 @@ impl Css {
fn parse_stmt(&mut self, stmt: Stmt, extender: &mut Extender) -> SassResult<Vec<Toplevel>> {
Ok(match stmt {
Stmt::RuleSet {
selector,
super_selector,
body,
} => {
Stmt::RuleSet { selector, body } => {
if body.is_empty() {
return Ok(Vec::new());
}
let selector = if extender.is_empty() {
selector.resolve_parent_selectors(&super_selector, true)?
} else {
Selector(extender.add_selector(
selector.resolve_parent_selectors(&super_selector, true)?.0,
None,
))
}
.remove_placeholders();
let selector = selector.remove_placeholders();
if selector.is_empty() {
return Ok(Vec::new());
}

View File

@ -40,7 +40,6 @@ pub(crate) enum Comment {
#[derive(Debug, Clone)]
pub(crate) enum Stmt {
RuleSet {
super_selector: Selector,
selector: Selector,
body: Vec<Self>,
},
@ -272,11 +271,7 @@ impl<'a> Parser<'a> {
self.scopes.pop();
self.super_selectors.pop();
self.at_root = self.super_selectors.is_empty();
stmts.push(Stmt::RuleSet {
selector,
body,
super_selector,
});
stmts.push(Stmt::RuleSet { selector, body });
}
},
}
@ -378,7 +373,10 @@ impl<'a> Parser<'a> {
// todo: we should be registering the selector here, but that would require being given
// an `Rc<RefCell<Selector>>`, which we haven't implemented yet.
Ok(Selector(selector))
Ok(Selector(selector).resolve_parent_selectors(
self.super_selectors.last(),
!self.at_root || self.at_root_has_selector,
)?)
}
/// Eat and return the contents of a comment.
@ -1029,7 +1027,6 @@ impl<'a> Parser<'a> {
body = vec![Stmt::RuleSet {
selector: self.super_selectors.last().clone(),
body,
super_selector: Selector::new(self.span_before),
}];
}
@ -1082,7 +1079,6 @@ impl<'a> Parser<'a> {
body = vec![Stmt::RuleSet {
selector: self.super_selectors.last().clone(),
body,
super_selector: Selector::new(self.span_before),
}];
}
@ -1144,11 +1140,11 @@ impl<'a> Parser<'a> {
}
Stmt::RuleSet { selector, body, .. } if !at_root_has_selector => {
Some(Ok(Stmt::RuleSet {
super_selector: Selector::new(self.span_before),
selector: match selector.resolve_parent_selectors(&at_rule_selector, false) {
Ok(v) => v,
Err(e) => return Some(Err(e)),
},
selector,
// selector: match selector.resolve_parent_selectors(&at_rule_selector, false) {
// Ok(v) => v,
// Err(e) => return Some(Err(e)),
// },
body,
}))
}
@ -1158,7 +1154,6 @@ impl<'a> Parser<'a> {
let mut stmts = vec![Stmt::RuleSet {
selector: at_rule_selector,
body: styles,
super_selector: Selector::new(self.span_before),
}];
stmts.extend(raw_stmts);
Ok(stmts)
@ -1279,7 +1274,6 @@ impl<'a> Parser<'a> {
body = vec![Stmt::RuleSet {
selector: self.super_selectors.last().clone(),
body,
super_selector: Selector::new(self.span_before),
}];
}