swc_css_compat/compiler/
selector_not.rs

1use 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}