Skip to main content

frs/cmds/rsl/rules/common/
scope_bindings.rs

1use std::collections::HashSet;
2
3use syn::Item;
4use syn::visit::Visit;
5
6struct BindingCollector<'bindings> {
7    bindings: &'bindings mut HashSet<String>,
8}
9
10impl<'ast> Visit<'ast> for BindingCollector<'_> {
11    fn visit_pat_ident(&mut self, pattern: &'ast syn::PatIdent) {
12        self.bindings.insert(pattern.ident.to_string());
13        syn::visit::visit_pat_ident(self, pattern);
14    }
15}
16
17pub fn add_pattern_bindings(bindings: &mut HashSet<String>, pattern: &syn::Pat) {
18    let mut collector = BindingCollector { bindings };
19    collector.visit_pat(pattern);
20}
21
22pub fn pattern_bindings(pattern: &syn::Pat) -> HashSet<String> {
23    let mut bindings = HashSet::new();
24    add_pattern_bindings(&mut bindings, pattern);
25    bindings
26}
27
28pub fn closure_bindings(inputs: &syn::punctuated::Punctuated<syn::Pat, syn::token::Comma>) -> HashSet<String> {
29    let mut bindings = HashSet::new();
30    for input in inputs {
31        add_pattern_bindings(&mut bindings, input);
32    }
33    bindings
34}
35
36pub fn parameter_bindings(inputs: &syn::punctuated::Punctuated<syn::FnArg, syn::token::Comma>) -> HashSet<String> {
37    let mut bindings = HashSet::new();
38    for input in inputs {
39        match input {
40            syn::FnArg::Receiver(_) => {
41                bindings.insert("self".to_owned());
42            }
43            syn::FnArg::Typed(input) => add_pattern_bindings(&mut bindings, &input.pat),
44        }
45    }
46    bindings
47}
48
49pub fn block_fn_bindings(block: &syn::Block) -> HashSet<String> {
50    block
51        .stmts
52        .iter()
53        .filter_map(|statement| match statement {
54            syn::Stmt::Item(Item::Fn(fn_item)) => Some(fn_item.sig.ident.to_string()),
55            syn::Stmt::Expr(_, _) | syn::Stmt::Item(_) | syn::Stmt::Local(_) | syn::Stmt::Macro(_) => None,
56        })
57        .collect()
58}