swc_css_compat/compiler/
selector_not.rs1use swc_css_ast::{
2 CompoundSelector, PseudoClassSelector, PseudoClassSelectorChildren, SelectorList,
3 SubclassSelector,
4};
5
6use crate::compiler::Compiler;
7
8impl Compiler {
9 pub(crate) fn process_selector_not(&mut self, n: &mut CompoundSelector) {
10 let has_not = n.subclass_selectors.iter().any(|n| matches!(n, SubclassSelector::PseudoClass(PseudoClassSelector { name, children: Some(children), ..}) if name.value == "not"
11 && matches!(children.first(), Some(PseudoClassSelectorChildren::SelectorList(selector_list)) if selector_list.children.len() > 1)));
12
13 if !has_not {
14 return;
15 }
16
17 let mut new_subclass_selectors = Vec::with_capacity(n.subclass_selectors.len());
18
19 for selector in &mut n.subclass_selectors.drain(..) {
20 match selector {
21 SubclassSelector::PseudoClass(PseudoClassSelector {
22 span,
23 name,
24 children: Some(children),
25 ..
26 }) if name.value == "not"
27 && matches!(children.first(), Some(PseudoClassSelectorChildren::SelectorList(selector_list)) if selector_list.children.len() > 1) =>
28 {
29 if let Some(PseudoClassSelectorChildren::SelectorList(selector_list)) =
30 children.first()
31 {
32 for child in &selector_list.children {
33 new_subclass_selectors.push(SubclassSelector::PseudoClass(
34 PseudoClassSelector {
35 span,
36 name: name.clone(),
37 children: Some(vec![
38 PseudoClassSelectorChildren::SelectorList(SelectorList {
39 span: child.span,
40 children: vec![child.clone()],
41 }),
42 ]),
43 },
44 ));
45 }
46 }
47 }
48 _ => new_subclass_selectors.push(selector),
49 }
50 }
51
52 n.subclass_selectors = new_subclass_selectors;
53 }
54}