clippy_utils/ast_utils/
ident_iter.rs

1use core::iter::FusedIterator;
2use rustc_ast::visit::{Visitor, walk_attribute, walk_expr};
3use rustc_ast::{Attribute, Expr};
4use rustc_span::symbol::Ident;
5
6pub struct IdentIter(std::vec::IntoIter<Ident>);
7
8impl Iterator for IdentIter {
9    type Item = Ident;
10
11    fn next(&mut self) -> Option<Self::Item> {
12        self.0.next()
13    }
14}
15
16impl FusedIterator for IdentIter {}
17
18impl From<&Expr> for IdentIter {
19    fn from(expr: &Expr) -> Self {
20        let mut visitor = IdentCollector::default();
21
22        walk_expr(&mut visitor, expr);
23
24        IdentIter(visitor.0.into_iter())
25    }
26}
27
28impl From<&Attribute> for IdentIter {
29    fn from(attr: &Attribute) -> Self {
30        let mut visitor = IdentCollector::default();
31
32        walk_attribute(&mut visitor, attr);
33
34        IdentIter(visitor.0.into_iter())
35    }
36}
37
38#[derive(Default)]
39struct IdentCollector(Vec<Ident>);
40
41impl Visitor<'_> for IdentCollector {
42    fn visit_ident(&mut self, ident: &Ident) {
43        self.0.push(*ident);
44    }
45}