From bcb2ea912bf96f38505c67a0b6896c6a5ac278ed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Felix=20Kohlgr=C3=BCber?= <felix.kohlgrueber@gmail.com>
Date: Wed, 20 Nov 2019 19:01:06 +0100
Subject: [PATCH] fix 2190; add test for "replace if let with match"

---
 .../src/assists/replace_if_let_with_match.rs  | 32 +++++++++++++++++--
 crates/ra_fmt/src/lib.rs                      |  3 --
 crates/ra_ide_api/src/join_lines.rs           | 28 ++++++++++++++++
 3 files changed, 58 insertions(+), 5 deletions(-)

diff --git a/crates/ra_assists/src/assists/replace_if_let_with_match.rs b/crates/ra_assists/src/assists/replace_if_let_with_match.rs
index dff84d86516..3272801ff81 100644
--- a/crates/ra_assists/src/assists/replace_if_let_with_match.rs
+++ b/crates/ra_assists/src/assists/replace_if_let_with_match.rs
@@ -66,8 +66,8 @@ fn build_match_expr(
 
 fn format_arm(block: &ast::BlockExpr) -> String {
     match extract_trivial_expression(block) {
-        None => block.syntax().text().to_string(),
-        Some(e) => format!("{},", e.syntax().text()),
+        Some(e) if !e.syntax().text().contains_char('\n') => format!("{},", e.syntax().text()),
+        _ => block.syntax().text().to_string(),
     }
 }
 
@@ -102,6 +102,34 @@ impl VariantData {
         )
     }
 
+    #[test]
+    fn test_replace_if_let_with_match_doesnt_unwrap_multiline_expressions() {
+        check_assist(
+            replace_if_let_with_match,
+            "
+fn foo() {
+    if <|>let VariantData::Struct(..) = a {
+        bar(
+            123
+        )
+    } else {
+        false
+    }
+}           ",
+            "
+fn foo() {
+    <|>match a {
+        VariantData::Struct(..) => {
+            bar(
+                123
+            )
+        }
+        _ => false,
+    }
+}           ",
+        )
+    }
+
     #[test]
     fn replace_if_let_with_match_target() {
         check_assist_target(
diff --git a/crates/ra_fmt/src/lib.rs b/crates/ra_fmt/src/lib.rs
index a30ed4cbb86..10f592257c1 100644
--- a/crates/ra_fmt/src/lib.rs
+++ b/crates/ra_fmt/src/lib.rs
@@ -38,9 +38,6 @@ fn prev_tokens(token: SyntaxToken) -> impl Iterator<Item = SyntaxToken> {
 pub fn extract_trivial_expression(expr: &ast::BlockExpr) -> Option<ast::Expr> {
     let block = expr.block()?;
     let expr = block.expr()?;
-    if expr.syntax().text().contains_char('\n') {
-        return None;
-    }
     let non_trivial_children = block.syntax().children().filter(|it| match it.kind() {
         WHITESPACE | T!['{'] | T!['}'] => false,
         _ => it != expr.syntax(),
diff --git a/crates/ra_ide_api/src/join_lines.rs b/crates/ra_ide_api/src/join_lines.rs
index 6f71b27db26..7deeb34947a 100644
--- a/crates/ra_ide_api/src/join_lines.rs
+++ b/crates/ra_ide_api/src/join_lines.rs
@@ -243,6 +243,34 @@ fn foo(e: Result<U, V>) {
         );
     }
 
+    #[test]
+    fn join_lines_multiline_in_block() {
+        check_join_lines(
+            r"
+fn foo() {
+    match ty {
+        <|> Some(ty) => {
+            match ty {
+                _ => false,
+            }
+        }
+        _ => true,
+    }
+}
+",
+            r"
+fn foo() {
+    match ty {
+        <|> Some(ty) => match ty {
+                _ => false,
+            },
+        _ => true,
+    }
+}
+",
+        );
+    }
+
     #[test]
     fn join_lines_keeps_comma_for_block_in_match_arm() {
         // We already have a comma