Skip to content

Commit 91a3324

Browse files
authored
Merge pull request #2316 from topecongiro/issue-2315
Remove trailing comma from extern items snippet before comparing
2 parents fad9076 + 405360a commit 91a3324

File tree

5 files changed

+39
-22
lines changed

5 files changed

+39
-22
lines changed

src/imports.rs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,32 @@ fn compare_use_trees(a: &ast::UseTree, b: &ast::UseTree, nested: bool) -> Orderi
105105
}
106106
}
107107

108-
fn compare_use_items(context: &RewriteContext, a: &ast::Item, b: &ast::Item) -> Option<Ordering> {
108+
fn compare_use_items(a: &ast::Item, b: &ast::Item) -> Option<Ordering> {
109109
match (&a.node, &b.node) {
110110
(&ast::ItemKind::Use(ref a_tree), &ast::ItemKind::Use(ref b_tree)) => {
111111
Some(compare_use_trees(a_tree, b_tree, false))
112112
}
113-
(&ast::ItemKind::ExternCrate(..), &ast::ItemKind::ExternCrate(..)) => {
114-
Some(context.snippet(a.span).cmp(context.snippet(b.span)))
113+
(&ast::ItemKind::ExternCrate(ref a_name), &ast::ItemKind::ExternCrate(ref b_name)) => {
114+
// `extern crate foo as bar;`
115+
// ^^^ Comparing this.
116+
let a_orig_name =
117+
a_name.map_or_else(|| a.ident.name.as_str(), |symbol| symbol.as_str());
118+
let b_orig_name =
119+
b_name.map_or_else(|| b.ident.name.as_str(), |symbol| symbol.as_str());
120+
let result = a_orig_name.cmp(&b_orig_name);
121+
if result != Ordering::Equal {
122+
return Some(result);
123+
}
124+
125+
// `extern crate foo as bar;`
126+
// ^^^ Comparing this.
127+
let result = match (a_name, b_name) {
128+
(Some(..), None) => Ordering::Greater,
129+
(None, Some(..)) => Ordering::Less,
130+
(None, None) => Ordering::Equal,
131+
(Some(..), Some(..)) => a.ident.name.cmp(&b.ident.name),
132+
};
133+
Some(result)
115134
}
116135
_ => None,
117136
}
@@ -257,7 +276,7 @@ fn rewrite_imports(
257276
false,
258277
);
259278
let mut item_pair_vec: Vec<_> = items.zip(use_items.iter()).collect();
260-
item_pair_vec.sort_by(|a, b| compare_use_items(context, a.1, b.1).unwrap());
279+
item_pair_vec.sort_by(|a, b| compare_use_items(a.1, b.1).unwrap());
261280
let item_vec: Vec<_> = item_pair_vec.into_iter().map(|pair| pair.0).collect();
262281

263282
let fmt = ListFormatting {

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11+
#![feature(match_default_bindings)]
1112
#![feature(rustc_private)]
1213
#![feature(type_ascription)]
1314

src/visitor.rs

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,27 +1056,16 @@ fn format_derive(context: &RewriteContext, derive_args: &[&str], shape: Shape) -
10561056
}
10571057

10581058
fn is_derive(attr: &ast::Attribute) -> bool {
1059-
match attr.meta() {
1060-
Some(meta_item) => match meta_item.node {
1061-
ast::MetaItemKind::List(..) => meta_item.name.as_str() == "derive",
1062-
_ => false,
1063-
},
1064-
_ => false,
1065-
}
1059+
attr.check_name("derive")
10661060
}
10671061

10681062
/// Returns the arguments of `#[derive(...)]`.
10691063
fn get_derive_args<'a>(context: &'a RewriteContext, attr: &ast::Attribute) -> Option<Vec<&'a str>> {
1070-
attr.meta().and_then(|meta_item| match meta_item.node {
1071-
ast::MetaItemKind::List(ref args) if meta_item.name.as_str() == "derive" => {
1072-
// Every argument of `derive` should be `NestedMetaItemKind::Literal`.
1073-
Some(
1074-
args.iter()
1075-
.map(|a| context.snippet(a.span))
1076-
.collect::<Vec<_>>(),
1077-
)
1078-
}
1079-
_ => None,
1064+
attr.meta_item_list().map(|meta_item_list| {
1065+
meta_item_list
1066+
.iter()
1067+
.map(|nested_meta_item| context.snippet(nested_meta_item.span))
1068+
.collect()
10801069
})
10811070
}
10821071

tests/source/extern.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ extern crate chrono;
1010
extern crate foo;
1111
extern crate bar;
1212

13+
// #2315
14+
extern crate proc_macro2;
15+
extern crate proc_macro;
16+
1317
extern "C" {
1418
fn c_func(x: *mut *mut libc::c_void);
1519

tests/target/extern.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// rustfmt-normalize_comments: true
22

3-
extern crate foo as bar;
43
extern crate foo;
4+
extern crate foo as bar;
55

66
extern crate chrono;
77
extern crate dotenv;
@@ -10,6 +10,10 @@ extern crate futures;
1010
extern crate bar;
1111
extern crate foo;
1212

13+
// #2315
14+
extern crate proc_macro;
15+
extern crate proc_macro2;
16+
1317
extern "C" {
1418
fn c_func(x: *mut *mut libc::c_void);
1519

0 commit comments

Comments
 (0)