1 use syn::{
2     visit_mut::{visit_file_mut, visit_item_mod_mut, VisitMut},
3     File, Item, ItemMod,
4 };
5 
sort_semantically(file: &mut File)6 pub(super) fn sort_semantically(file: &mut File) {
7     Visitor.visit_file_mut(file)
8 }
9 
10 struct Visitor;
11 
12 impl VisitMut for Visitor {
visit_file_mut(&mut self, file: &mut File)13     fn visit_file_mut(&mut self, file: &mut File) {
14         visit_items(&mut file.items);
15         visit_file_mut(self, file)
16     }
17 
visit_item_mod_mut(&mut self, item_mod: &mut ItemMod)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 
visit_items(items: &mut [Item])26 fn 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 }
47