bindgen/codegen/postprocessing/
sort_semantically.rs

1use syn::{
2    visit_mut::{visit_file_mut, visit_item_mod_mut, VisitMut},
3    File, Item, ItemMod,
4};
5
6pub(super) fn sort_semantically(file: &mut File) {
7    Visitor.visit_file_mut(file);
8}
9
10struct Visitor;
11
12impl VisitMut for Visitor {
13    fn visit_file_mut(&mut self, file: &mut File) {
14        visit_items(&mut file.items);
15        visit_file_mut(self, file);
16    }
17
18    fn visit_item_mod_mut(&mut self, item_mod: &mut ItemMod) {
19        if let Some((_, ref mut items)) = item_mod.content {
20            visit_items(items);
21        }
22        visit_item_mod_mut(self, item_mod);
23    }
24}
25
26fn visit_items(items: &mut [Item]) {
27    items.sort_by_key(|item| match item {
28        Item::Type(_) => 0,
29        Item::Struct(_) => 1,
30        Item::Const(_) => 2,
31        Item::Fn(_) => 3,
32        Item::Enum(_) => 4,
33        Item::Union(_) => 5,
34        Item::Static(_) => 6,
35        Item::Trait(_) => 7,
36        Item::TraitAlias(_) => 8,
37        Item::Impl(_) => 9,
38        Item::Mod(_) => 10,
39        Item::Use(_) => 11,
40        Item::Verbatim(_) => 12,
41        Item::ExternCrate(_) => 13,
42        Item::ForeignMod(_) => 14,
43        Item::Macro(_) => 15,
44        _ => 18,
45    });
46}