diff options
| author | Yacin Tmimi <yacintmimi@gmail.com> | 2023-02-12 13:51:50 -0500 |
|---|---|---|
| committer | Caleb Cartwright <calebcartwright@users.noreply.github.com> | 2023-06-20 08:26:11 -0500 |
| commit | 75870c55b94b1b927445a35131462fb9db402fd3 (patch) | |
| tree | 3c0dac6a523fb6e67afea4fa5d15f46f848d0264 | |
| parent | 3f7c366fc0464e01ddcaefbd70647cb3da4202be (diff) | |
| download | rust-75870c55b94b1b927445a35131462fb9db402fd3.tar.gz rust-75870c55b94b1b927445a35131462fb9db402fd3.zip | |
Extract logic for rewriting `else` keyword into function
The function properly handles recovering comments before and after the `else` keyword, and properly handles how to write the else when users configure `control_brace_style`.
| -rw-r--r-- | src/expr.rs | 80 | ||||
| -rw-r--r-- | tests/source/let_else.rs | 3 | ||||
| -rw-r--r-- | tests/target/let_else.rs | 3 |
3 files changed, 46 insertions, 40 deletions
diff --git a/src/expr.rs b/src/expr.rs index e179b4646ef..aa81d6a93cc 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -1004,6 +1004,46 @@ impl<'a> ControlFlow<'a> { } } +/// Rewrite the `else` keyword with surrounding comments. +/// +/// is_last: true if this is an `else` and `false` if this is an `else if` block. +/// context: rewrite context +/// span: Span between the end of the last expression and the start of the else block, +/// which contains the `else` keyword +/// shape: Shape +pub(crate) fn rewrite_else_kw_with_comments( + is_last: bool, + context: &RewriteContext<'_>, + span: Span, + shape: Shape, +) -> String { + let else_kw_lo = context.snippet_provider.span_before(span, "else"); + let before_else_kw = mk_sp(span.lo(), else_kw_lo); + let before_else_kw_comment = extract_comment(before_else_kw, context, shape); + + let else_kw_hi = context.snippet_provider.span_after(span, "else"); + let after_else_kw = mk_sp(else_kw_hi, span.hi()); + let after_else_kw_comment = extract_comment(after_else_kw, context, shape); + + let newline_sep = &shape.indent.to_string_with_newline(context.config); + let before_sep = match context.config.control_brace_style() { + ControlBraceStyle::AlwaysNextLine | ControlBraceStyle::ClosingNextLine => { + newline_sep.as_ref() + } + ControlBraceStyle::AlwaysSameLine => " ", + }; + let after_sep = match context.config.control_brace_style() { + ControlBraceStyle::AlwaysNextLine if is_last => newline_sep.as_ref(), + _ => " ", + }; + + format!( + "{}else{}", + before_else_kw_comment.as_ref().map_or(before_sep, |s| &**s), + after_else_kw_comment.as_ref().map_or(after_sep, |s| &**s), + ) +} + impl<'a> Rewrite for ControlFlow<'a> { fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option<String> { debug!("ControlFlow::rewrite {:?} {:?}", self, shape); @@ -1070,41 +1110,13 @@ impl<'a> Rewrite for ControlFlow<'a> { } }; - let between_kwd_else_block = mk_sp( - self.block.span.hi(), - context - .snippet_provider - .span_before(mk_sp(self.block.span.hi(), else_block.span.lo()), "else"), - ); - let between_kwd_else_block_comment = - extract_comment(between_kwd_else_block, context, shape); - - let after_else = mk_sp( - context - .snippet_provider - .span_after(mk_sp(self.block.span.hi(), else_block.span.lo()), "else"), - else_block.span.lo(), + let else_kw = rewrite_else_kw_with_comments( + last_in_chain, + context, + self.block.span.between(else_block.span), + shape, ); - let after_else_comment = extract_comment(after_else, context, shape); - - let between_sep = match context.config.control_brace_style() { - ControlBraceStyle::AlwaysNextLine | ControlBraceStyle::ClosingNextLine => { - &*alt_block_sep - } - ControlBraceStyle::AlwaysSameLine => " ", - }; - let after_sep = match context.config.control_brace_style() { - ControlBraceStyle::AlwaysNextLine if last_in_chain => &*alt_block_sep, - _ => " ", - }; - - result.push_str(&format!( - "{}else{}", - between_kwd_else_block_comment - .as_ref() - .map_or(between_sep, |s| &**s), - after_else_comment.as_ref().map_or(after_sep, |s| &**s), - )); + result.push_str(&else_kw); result.push_str(&rewrite?); } diff --git a/tests/source/let_else.rs b/tests/source/let_else.rs deleted file mode 100644 index a6e816fb524..00000000000 --- a/tests/source/let_else.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - let Some(1) = Some(1) else { return }; -} diff --git a/tests/target/let_else.rs b/tests/target/let_else.rs deleted file mode 100644 index a6e816fb524..00000000000 --- a/tests/target/let_else.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - let Some(1) = Some(1) else { return }; -} |
