Compare extern crate items with its name instead of span
When we use span, bugs easily sneak in.
This commit is contained in:
parent
0f24bc0d44
commit
75cb236711
4 changed files with 33 additions and 5 deletions
|
@ -105,13 +105,32 @@ fn compare_use_trees(a: &ast::UseTree, b: &ast::UseTree, nested: bool) -> Orderi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compare_use_items(context: &RewriteContext, a: &ast::Item, b: &ast::Item) -> Option<Ordering> {
|
fn compare_use_items(a: &ast::Item, b: &ast::Item) -> Option<Ordering> {
|
||||||
match (&a.node, &b.node) {
|
match (&a.node, &b.node) {
|
||||||
(&ast::ItemKind::Use(ref a_tree), &ast::ItemKind::Use(ref b_tree)) => {
|
(&ast::ItemKind::Use(ref a_tree), &ast::ItemKind::Use(ref b_tree)) => {
|
||||||
Some(compare_use_trees(a_tree, b_tree, false))
|
Some(compare_use_trees(a_tree, b_tree, false))
|
||||||
}
|
}
|
||||||
(&ast::ItemKind::ExternCrate(..), &ast::ItemKind::ExternCrate(..)) => {
|
(&ast::ItemKind::ExternCrate(ref a_name), &ast::ItemKind::ExternCrate(ref b_name)) => {
|
||||||
Some(context.snippet(a.span).cmp(context.snippet(b.span)))
|
// `extern crate foo as bar;`
|
||||||
|
// ^^^ Comparing this.
|
||||||
|
let a_orig_name =
|
||||||
|
a_name.map_or_else(|| a.ident.name.as_str(), |symbol| symbol.as_str());
|
||||||
|
let b_orig_name =
|
||||||
|
b_name.map_or_else(|| b.ident.name.as_str(), |symbol| symbol.as_str());
|
||||||
|
let result = a_orig_name.cmp(&b_orig_name);
|
||||||
|
if result != Ordering::Equal {
|
||||||
|
return Some(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// `extern crate foo as bar;`
|
||||||
|
// ^^^ Comparing this.
|
||||||
|
let result = match (a_name, b_name) {
|
||||||
|
(Some(..), None) => Ordering::Greater,
|
||||||
|
(None, Some(..)) => Ordering::Less,
|
||||||
|
(None, None) => Ordering::Equal,
|
||||||
|
(Some(..), Some(..)) => a.ident.name.cmp(&b.ident.name),
|
||||||
|
};
|
||||||
|
Some(result)
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
|
@ -257,7 +276,7 @@ fn rewrite_imports(
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
let mut item_pair_vec: Vec<_> = items.zip(use_items.iter()).collect();
|
let mut item_pair_vec: Vec<_> = items.zip(use_items.iter()).collect();
|
||||||
item_pair_vec.sort_by(|a, b| compare_use_items(context, a.1, b.1).unwrap());
|
item_pair_vec.sort_by(|a, b| compare_use_items(a.1, b.1).unwrap());
|
||||||
let item_vec: Vec<_> = item_pair_vec.into_iter().map(|pair| pair.0).collect();
|
let item_vec: Vec<_> = item_pair_vec.into_iter().map(|pair| pair.0).collect();
|
||||||
|
|
||||||
let fmt = ListFormatting {
|
let fmt = ListFormatting {
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(match_default_bindings)]
|
||||||
#![feature(rustc_private)]
|
#![feature(rustc_private)]
|
||||||
#![feature(type_ascription)]
|
#![feature(type_ascription)]
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,10 @@ extern crate chrono;
|
||||||
extern crate foo;
|
extern crate foo;
|
||||||
extern crate bar;
|
extern crate bar;
|
||||||
|
|
||||||
|
// #2315
|
||||||
|
extern crate proc_macro2;
|
||||||
|
extern crate proc_macro;
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn c_func(x: *mut *mut libc::c_void);
|
fn c_func(x: *mut *mut libc::c_void);
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// rustfmt-normalize_comments: true
|
// rustfmt-normalize_comments: true
|
||||||
|
|
||||||
extern crate foo as bar;
|
|
||||||
extern crate foo;
|
extern crate foo;
|
||||||
|
extern crate foo as bar;
|
||||||
|
|
||||||
extern crate chrono;
|
extern crate chrono;
|
||||||
extern crate dotenv;
|
extern crate dotenv;
|
||||||
|
@ -10,6 +10,10 @@ extern crate futures;
|
||||||
extern crate bar;
|
extern crate bar;
|
||||||
extern crate foo;
|
extern crate foo;
|
||||||
|
|
||||||
|
// #2315
|
||||||
|
extern crate proc_macro;
|
||||||
|
extern crate proc_macro2;
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn c_func(x: *mut *mut libc::c_void);
|
fn c_func(x: *mut *mut libc::c_void);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue