forked from rust-lang/rust-bindgen
/
remove_alias.rs
55 lines (49 loc) · 1.58 KB
/
remove_alias.rs
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
use syn::visit_mut::{visit_type_mut, VisitMut};
use syn::{Item, ItemMod, Type};
use crate::BindgenOptions;
pub(super) fn remove_alias(item_mod: &mut ItemMod, options: &BindgenOptions) {
if let Some((_, items)) = item_mod.content.as_mut() {
let visitors: Vec<_> = items
.iter()
.enumerate()
.rev()
.filter_map(|(index, item)| {
if let Item::Type(alias_item) = item {
if alias_item.generics.params.is_empty() {
let ident = alias_item.ident.to_string();
if options.remove_alias.matches(&ident) {
return Some((
index,
Visitor {
ident,
ty: alias_item.ty.clone(),
},
));
}
}
}
None
})
.collect();
for (index, mut visitor) in visitors {
items.remove(index);
for item in items.iter_mut() {
visitor.visit_item_mut(item);
}
}
}
}
struct Visitor {
ident: String,
ty: Box<Type>,
}
impl VisitMut for Visitor {
fn visit_type_mut(&mut self, ty: &mut Type) {
if let Type::Path(type_path) = ty {
if type_path.path.is_ident(&self.ident) {
*ty = self.ty.as_ref().clone();
}
}
visit_type_mut::<_>(self, ty)
}
}