swc_css_lints/rules/
custom_property_no_missing_var_function.rs

1use swc_css_ast::*;
2use swc_css_visit::{Visit, VisitWith};
3
4use crate::rule::{visitor_rule, LintRule, LintRuleContext};
5
6pub fn custom_property_no_missing_var_function(ctx: LintRuleContext<()>) -> Box<dyn LintRule> {
7    visitor_rule(
8        ctx.reaction(),
9        CustomPropertyNoMissingVarFunction {
10            ctx,
11            ..Default::default()
12        },
13    )
14}
15
16#[derive(Debug, Default)]
17struct CustomPropertyNoMissingVarFunction {
18    ctx: LintRuleContext<()>,
19
20    in_declaration: Vec<bool>,
21    in_declaration_value: Vec<bool>,
22    in_var_function: Vec<bool>,
23}
24
25impl Visit for CustomPropertyNoMissingVarFunction {
26    fn visit_declaration(&mut self, declaration: &Declaration) {
27        self.in_declaration.push(true);
28        declaration.visit_children_with(self);
29        self.in_declaration.pop();
30    }
31
32    fn visit_component_value(&mut self, component_value: &ComponentValue) {
33        self.in_declaration_value
34            .push(self.in_declaration.last().copied().unwrap_or_default());
35        component_value.visit_children_with(self);
36        self.in_declaration_value.pop();
37    }
38
39    fn visit_function(&mut self, function: &Function) {
40        self.in_var_function.push(function.name == *"var");
41        function.visit_children_with(self);
42        self.in_var_function.pop();
43    }
44
45    fn visit_dashed_ident(&mut self, dashed_ident: &DashedIdent) {
46        if let (Some(true), Some(false) | None) = (
47            self.in_declaration_value.last(),
48            self.in_var_function.last(),
49        ) {
50            self.ctx.report(
51                dashed_ident,
52                format!(
53                    "Unexpected missing var function for '--{}'.",
54                    dashed_ident.value
55                ),
56            );
57        }
58
59        dashed_ident.visit_children_with(self);
60    }
61}