diff --git a/src/expr.rs b/src/expr.rs index 01cc388c186..dc152e46a40 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -820,9 +820,20 @@ impl<'a> ControlFlow<'a> { .offset_left(matcher.len())? .sub_width(self.connector.len())?; let pat_string = pat.rewrite(context, pat_shape)?; - let comments_lo = context - .snippet_provider - .span_after(self.span, self.connector.trim()); + // When handling for loops we want to avoid incorrectly finding "in" + // inside the pattern so we first offset the span to start after the pattern + // see https://github.com/rust-lang/rustfmt/issues/5009 + let comments_lo = if self.keyword == "for" { + let lo_after_pat = context.snippet_provider.span_after(self.span, &pat_string); + + context + .snippet_provider + .span_after(self.span.with_lo(lo_after_pat), self.connector.trim()) + } else { + context + .snippet_provider + .span_after(self.span, self.connector.trim()) + }; let comments_span = mk_sp(comments_lo, expr.span.lo()); return rewrite_assign_rhs_with_comments( context, diff --git a/tests/target/issue-5009/1_minimum_example.rs b/tests/target/issue-5009/1_minimum_example.rs new file mode 100644 index 00000000000..55836f4bf52 --- /dev/null +++ b/tests/target/issue-5009/1_minimum_example.rs @@ -0,0 +1,4 @@ +fn main() { + // the "in" inside the pattern produced invalid syntax + for variable_in_here /* ... */ in 0..1 {} +} diff --git a/tests/target/issue-5009/2_many_in_connectors_in_pattern.rs b/tests/target/issue-5009/2_many_in_connectors_in_pattern.rs new file mode 100644 index 00000000000..d83590c6852 --- /dev/null +++ b/tests/target/issue-5009/2_many_in_connectors_in_pattern.rs @@ -0,0 +1,3 @@ +fn main() { + for in_in_in_in_in_in_in_in /* ... */ in 0..1 {} +} diff --git a/tests/target/issue-5009/3_nested_for_loop_with_connector_in_pattern.rs b/tests/target/issue-5009/3_nested_for_loop_with_connector_in_pattern.rs new file mode 100644 index 00000000000..9c800723939 --- /dev/null +++ b/tests/target/issue-5009/3_nested_for_loop_with_connector_in_pattern.rs @@ -0,0 +1,5 @@ +fn main() { + for variable_in_x /* ... */ in 0..1 { + for variable_in_y /* ... */ in 0..1 {} + } +} diff --git a/tests/target/issue-5009/4_nested_for_loop_with_if_elseif_else.rs b/tests/target/issue-5009/4_nested_for_loop_with_if_elseif_else.rs new file mode 100644 index 00000000000..a716d0d3082 --- /dev/null +++ b/tests/target/issue-5009/4_nested_for_loop_with_if_elseif_else.rs @@ -0,0 +1,13 @@ +fn main() { + for variable_in_x /* ... */ in 0..1 { + for variable_in_y /* ... */ in 0..1 { + if false { + + } else if false { + + } else { + + } + } + } +} diff --git a/tests/target/issue-5009/5_nested_for_loop_with_connector_in_if_elseif_else.rs b/tests/target/issue-5009/5_nested_for_loop_with_connector_in_if_elseif_else.rs new file mode 100644 index 00000000000..41ea46d4cb9 --- /dev/null +++ b/tests/target/issue-5009/5_nested_for_loop_with_connector_in_if_elseif_else.rs @@ -0,0 +1,15 @@ +fn main() { + let in_ = false; + + for variable_in_x /* ... */ in 0..1 { + for variable_in_y /* ... */ in 0..1 { + if in_ { + + } else if in_ { + + } else { + + } + } + } +} diff --git a/tests/target/issue-5009/6_deeply_nested_for_loop_with_connector_in_pattern.rs b/tests/target/issue-5009/6_deeply_nested_for_loop_with_connector_in_pattern.rs new file mode 100644 index 00000000000..789e54f7e5f --- /dev/null +++ b/tests/target/issue-5009/6_deeply_nested_for_loop_with_connector_in_pattern.rs @@ -0,0 +1,32 @@ +fn main() { + for variable_in_a /* ... */ in 0..1 { + for variable_in_b /* ... */ in 0..1 { + for variable_in_c /* ... */ in 0..1 { + for variable_in_d /* ... */ in 0..1 { + for variable_in_e /* ... */ in 0..1 { + for variable_in_f /* ... */ in 0..1 { + for variable_in_g /* ... */ in 0..1 { + for variable_in_h /* ... */ in 0..1 { + for variable_in_i /* ... */ in 0..1 { + for variable_in_j /* ... */ in 0..1 { + for variable_in_k /* ... */ in 0..1 { + for variable_in_l /* ... */ in 0..1 { + for variable_in_m /* ... */ in 0..1 { + for variable_in_n /* ... */ in 0..1 { + for variable_in_o /* ... */ in 0..1 { + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} diff --git a/tests/target/issue-5009/7_for_loop_without_connector_in_pattern.rs b/tests/target/issue-5009/7_for_loop_without_connector_in_pattern.rs new file mode 100644 index 00000000000..cb95cecf715 --- /dev/null +++ b/tests/target/issue-5009/7_for_loop_without_connector_in_pattern.rs @@ -0,0 +1,4 @@ +// should not reformat +fn main() { + for x /* ... */ in 0..1 {} +} diff --git a/tests/target/issue-5009/8_nested_for_loop_without_connector_in_pattern.rs b/tests/target/issue-5009/8_nested_for_loop_without_connector_in_pattern.rs new file mode 100644 index 00000000000..389c524b2c1 --- /dev/null +++ b/tests/target/issue-5009/8_nested_for_loop_without_connector_in_pattern.rs @@ -0,0 +1,6 @@ +// should not reformat +fn main() { + for x /* ... */ in 0..1 { + for y /* ... */ in 0..1 {} + } +}