/
order.rs
71 lines (67 loc) · 2.28 KB
/
order.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use itertools::Itertools;
use super::settings::Settings;
use super::sorting::{member_key, module_key};
use super::types::{AliasData, CommentSet, ImportBlock, ImportFromStatement, OrderedImportBlock};
pub(crate) fn order_imports<'a>(
block: ImportBlock<'a>,
settings: &Settings,
) -> OrderedImportBlock<'a> {
let mut ordered = OrderedImportBlock::default();
// Sort `Stmt::Import`.
ordered
.import
.extend(block.import.into_iter().sorted_by_cached_key(|(alias, _)| {
module_key(Some(alias.name), alias.asname, None, None, settings)
}));
// Sort `Stmt::ImportFrom`.
ordered.import_from.extend(
// Include all non-re-exports.
block
.import_from
.into_iter()
.chain(
// Include all re-exports.
block
.import_from_as
.into_iter()
.map(|((import_from, ..), body)| (import_from, body)),
)
.chain(
// Include all star imports.
block.import_from_star,
)
.map(
|(
import_from,
ImportFromStatement {
comments,
aliases,
trailing_comma,
},
)| {
// Within each `Stmt::ImportFrom`, sort the members.
(
import_from,
comments,
trailing_comma,
aliases
.into_iter()
.sorted_by_cached_key(|(alias, _)| {
member_key(alias.name, alias.asname, settings)
})
.collect::<Vec<(AliasData, CommentSet)>>(),
)
},
)
.sorted_by_cached_key(|(import_from, _, _, aliases)| {
module_key(
import_from.module,
None,
import_from.level,
aliases.first().map(|(alias, _)| (alias.name, alias.asname)),
settings,
)
}),
);
ordered
}