1 | use syn::{ |
2 | visit_mut::{visit_item_mod_mut, VisitMut}, |
3 | Item, ItemMod, |
4 | }; |
5 | |
6 | pub(super) fn sort_semantically(item_mod: &mut ItemMod) { |
7 | Visitor.visit_item_mod_mut(item_mod) |
8 | } |
9 | |
10 | struct Visitor; |
11 | |
12 | impl 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 | |