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