1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use swc_atoms::JsWord;
use swc_common::{SyntaxContext, Visit, VisitWith};
use swc_ecma_ast::*;

pub struct VarCollector<'a> {
    pub to: &'a mut Vec<(JsWord, SyntaxContext)>,
}

impl<'a> Visit<VarDeclarator> for VarCollector<'a> {
    fn visit(&mut self, node: &VarDeclarator) {
        node.name.visit_with(self);
    }
}

impl<'a> Visit<Ident> for VarCollector<'a> {
    fn visit(&mut self, i: &Ident) {
        self.to.push((i.sym.clone(), i.span.ctxt()))
    }
}

macro_rules! var_noop {
    ($T:path) => {
        impl<'a> Visit<$T> for VarCollector<'a> {
            fn visit(&mut self, _: &$T) {}
        }
    };

    ($T:path, $($rest:tt)*) => {
        var_noop!($T);
        var_noop!($($rest)*);
    };
}

var_noop!(Expr, ArrowExpr, Function, Constructor);

var_noop!(TsType, TsTypeAnn, TsTypeParam);