diff --git a/crates/ide_assists/src/handlers/replace_for_loop_with_for_each.rs b/crates/ide_assists/src/handlers/replace_for_loop_with_for_each.rs index 371223e79d..fcf7973bd0 100644 --- a/crates/ide_assists/src/handlers/replace_for_loop_with_for_each.rs +++ b/crates/ide_assists/src/handlers/replace_for_loop_with_for_each.rs @@ -50,14 +50,15 @@ pub(crate) fn replace_for_loop_with_for_each(acc: &mut Assists, ctx: &AssistCont // We have either "for x in &col" and col implements a method called iter // or "for x in &mut col" and col implements a method called iter_mut format_to!(buf, "{}.{}()", expr_behind_ref, method); + } else if let ast::Expr::RangeExpr(..) = iterable { + // range expressions need to be parenthesized for the syntax to be correct + format_to!(buf, "({})", iterable); } else if impls_core_iter(&ctx.sema, &iterable) { format_to!(buf, "{}", iterable); + } else if let ast::Expr::RefExpr(_) = iterable { + format_to!(buf, "({}).into_iter()", iterable); } else { - if let ast::Expr::RefExpr(_) = iterable { - format_to!(buf, "({}).into_iter()", iterable); - } else { - format_to!(buf, "{}.into_iter()", iterable); - } + format_to!(buf, "{}.into_iter()", iterable); } format_to!(buf, ".for_each(|{}| {});", pat, body); @@ -167,6 +168,42 @@ fn main() { ) } + #[test] + fn test_for_in_range() { + check_assist( + replace_for_loop_with_for_each, + r#" +//- minicore: range, iterators +impl core::iter::Iterator for core::ops::Range { + type Item = T; + + fn next(&mut self) -> Option { + None + } +} + +fn main() { + for $0x in 0..92 { + print!("{}", x); + } +}"#, + r#" +impl core::iter::Iterator for core::ops::Range { + type Item = T; + + fn next(&mut self) -> Option { + None + } +} + +fn main() { + (0..92).for_each(|x| { + print!("{}", x); + }); +}"#, + ) + } + #[test] fn not_available_in_body() { cov_mark::check!(not_available_in_body);