]> git.lizzy.rs Git - rust.git/commitdiff
Don't mutate the tree while traversing in reorder_impl
authorLukas Tobias Wirth <lukastw97@gmail.com>
Mon, 3 May 2021 16:22:18 +0000 (18:22 +0200)
committerLukas Tobias Wirth <lukastw97@gmail.com>
Mon, 3 May 2021 16:36:31 +0000 (18:36 +0200)
crates/ide_assists/src/handlers/reorder_impl.rs

index 72d8892481c87b77306b0a4398b97b9499ada0cd..54a9a468ecc68b7ed39b1a91ccaa765e6da2cc30 100644 (file)
@@ -79,9 +79,12 @@ pub(crate) fn reorder_impl(acc: &mut Assists, ctx: &AssistContext) -> Option<()>
         "Sort methods",
         target,
         |builder| {
-            methods.into_iter().zip(sorted).for_each(|(old, new)| {
-                ted::replace(builder.make_ast_mut(old).syntax(), new.clone_for_update().syntax())
-            });
+            let methods =
+                methods.into_iter().map(|fn_| builder.make_ast_mut(fn_)).collect::<Vec<_>>();
+            methods
+                .into_iter()
+                .zip(sorted)
+                .for_each(|(old, new)| ted::replace(old.syntax(), new.clone_for_update().syntax()));
         },
     )
 }
@@ -160,7 +163,7 @@ fn not_applicable_if_empty() {
     }
 
     #[test]
-    fn reorder_impl_trait_methods() {
+    fn reorder_impl_trait_functions() {
         check_assist(
             reorder_impl,
             r#"
@@ -197,4 +200,33 @@ fn d() {}
         "#,
         )
     }
+
+    #[test]
+    fn reorder_impl_trait_methods_uneven_ident_lengths() {
+        check_assist(
+            reorder_impl,
+            r#"
+trait Bar {
+    fn foo(&mut self) {}
+    fn fooo(&mut self) {}
+}
+
+struct Foo;
+impl Bar for Foo {
+    fn fooo(&mut self) {}
+    fn foo(&mut self) {$0}
+}"#,
+            r#"
+trait Bar {
+    fn foo(&mut self) {}
+    fn fooo(&mut self) {}
+}
+
+struct Foo;
+impl Bar for Foo {
+    fn foo(&mut self) {}
+    fn fooo(&mut self) {}
+}"#,
+        )
+    }
 }