frs/cmds/rsl/rules/common/
scope_bindings.rs1use 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}