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, node:file)
16 }
17
18 fn visit_item_mod_mut(&mut self, item_mod: &mut ItemMod) {
19 if let Some((_, ref mut items: &mut Vec)) = item_mod.content {
20 visit_items(items);
21 }
22 visit_item_mod_mut(self, node:item_mod)
23 }
24}
25
26fn visit_items(items: &mut [Item]) {
27 items.sort_by_key(|item: &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