swc_css_lints/rules/
custom_property_no_missing_var_function.rs1use 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}