From 87c4bd5a94cb40d49d7cac6e626f24421b5f43ce Mon Sep 17 00:00:00 2001 From: Seiichi Uchida Date: Thu, 26 Jul 2018 21:35:48 +0900 Subject: [PATCH 1/2] Add a test for #2863 --- tests/source/issue-2863.rs | 25 ++++++++++++++++++ tests/target/issue-2863.rs | 54 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 tests/source/issue-2863.rs create mode 100644 tests/target/issue-2863.rs diff --git a/tests/source/issue-2863.rs b/tests/source/issue-2863.rs new file mode 100644 index 00000000000..792ffdbac24 --- /dev/null +++ b/tests/source/issue-2863.rs @@ -0,0 +1,25 @@ +// rustfmt-reorder_impl_items: true + +impl IntoIterator for SafeVec { + existential type F: Trait; + type IntoIter = self::IntoIter; + type Item = T; + // comment on foo() + fn foo() {println!("hello, world");} + type Bar = u32; + fn foo1() {println!("hello, world");} + type FooBar = u32; + fn foo2() {println!("hello, world");} + fn foo3() {println!("hello, world");} + const SomeConst: i32 = 100; + fn foo4() {println!("hello, world");} + fn foo5() {println!("hello, world");} + // comment on FoooooBar + type FoooooBar = u32; + fn foo6() {println!("hello, world");} + fn foo7() {println!("hello, world");} + type BarFoo = u32; + existential type E: Trait; + const AnotherConst: i32 = 100; + fn foo8() {println!("hello, world");} +} diff --git a/tests/target/issue-2863.rs b/tests/target/issue-2863.rs new file mode 100644 index 00000000000..a53628e3ea9 --- /dev/null +++ b/tests/target/issue-2863.rs @@ -0,0 +1,54 @@ +// rustfmt-reorder_impl_items: true + +impl IntoIterator for SafeVec { + type Bar = u32; + type BarFoo = u32; + type FooBar = u32; + // comment on FoooooBar + type FoooooBar = u32; + type IntoIter = self::IntoIter; + type Item = T; + + existential type E: Trait; + existential type F: Trait; + + const AnotherConst: i32 = 100; + const SomeConst: i32 = 100; + + // comment on foo() + fn foo() { + println!("hello, world"); + } + + fn foo1() { + println!("hello, world"); + } + + fn foo2() { + println!("hello, world"); + } + + fn foo3() { + println!("hello, world"); + } + + fn foo4() { + println!("hello, world"); + } + + fn foo5() { + println!("hello, world"); + } + + fn foo6() { + println!("hello, world"); + } + + fn foo7() { + println!("hello, world"); + } + + fn foo8() { + println!("hello, world"); + } +} From 7b37776ade019d8aa6cf86c5bcb2d9f39c0121a5 Mon Sep 17 00:00:00 2001 From: Seiichi Uchida Date: Thu, 26 Jul 2018 21:35:56 +0900 Subject: [PATCH 2/2] Modify the rule for reordering impl items 1. If two items have the same kind, then reorder them based on its ident. 2. Handle existential type. --- src/items.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/items.rs b/src/items.rs index 7da84bfe68f..8c32d393df4 100644 --- a/src/items.rs +++ b/src/items.rs @@ -591,23 +591,31 @@ impl<'a> FmtVisitor<'a> { buffer.push((self.buffer.clone(), item.clone())); self.buffer.clear(); } - // type -> const -> macro -> method + // type -> existential -> const -> macro -> method use ast::ImplItemKind::*; fn need_empty_line(a: &ast::ImplItemKind, b: &ast::ImplItemKind) -> bool { match (a, b) { - (Type(..), Type(..)) | (Const(..), Const(..)) => false, + (Type(..), Type(..)) + | (Const(..), Const(..)) + | (Existential(..), Existential(..)) => false, _ => true, } } buffer.sort_by(|(_, a), (_, b)| match (&a.node, &b.node) { + (Type(..), Type(..)) + | (Const(..), Const(..)) + | (Macro(..), Macro(..)) + | (Existential(..), Existential(..)) => a.ident.as_str().cmp(&b.ident.as_str()), + (Method(..), Method(..)) => a.span.lo().cmp(&b.span.lo()), (Type(..), _) => Ordering::Less, (_, Type(..)) => Ordering::Greater, + (Existential(..), _) => Ordering::Less, + (_, Existential(..)) => Ordering::Greater, (Const(..), _) => Ordering::Less, (_, Const(..)) => Ordering::Greater, (Macro(..), _) => Ordering::Less, (_, Macro(..)) => Ordering::Greater, - _ => a.span.lo().cmp(&b.span.lo()), }); let mut prev_kind = None; for (buf, item) in buffer {