]> git.lizzy.rs Git - rust.git/commitdiff
fix: keep whitespace in extract function handler
authorbvanjoi <bohan-zhang@foxmail.com>
Wed, 4 Jan 2023 14:10:17 +0000 (22:10 +0800)
committerbvanjoi <bohan-zhang@foxmail.com>
Wed, 4 Jan 2023 14:10:17 +0000 (22:10 +0800)
crates/ide-assists/src/handlers/extract_function.rs
crates/syntax/src/ast/make.rs

index 4ee9d4638bbd57deca9d5b6c766b4351dfd1281d..94614360c7292408aec20589cf340b612aac14b2 100644 (file)
@@ -1799,7 +1799,8 @@ fn make_body(
                 })
                 .collect::<Vec<SyntaxElement>>();
             let tail_expr = tail_expr.map(|expr| expr.dedent(old_indent).indent(body_indent));
-            make::hacky_block_expr_with_comments(elements, tail_expr)
+
+            make::hacky_block_expr(elements, tail_expr)
         }
     };
 
@@ -1881,7 +1882,7 @@ fn with_tail_expr(block: ast::BlockExpr, tail_expr: ast::Expr) -> ast::BlockExpr
         elements.push(syntax::NodeOrToken::Node(stmt_tail.syntax().clone()));
     }
 
-    make::hacky_block_expr_with_comments(elements, Some(tail_expr))
+    make::hacky_block_expr(elements, Some(tail_expr))
 }
 
 fn format_type(ty: &hir::Type, ctx: &AssistContext<'_>, module: hir::Module) -> String {
@@ -4978,9 +4979,8 @@ fn $0fun_name() {
         );
     }
 
-    // FIXME: we do want to preserve whitespace
     #[test]
-    fn extract_function_does_not_preserve_whitespace() {
+    fn extract_function_does_preserve_whitespace() {
         check_assist(
             extract_function,
             r#"
@@ -4999,6 +4999,7 @@ fn func() {
 
 fn $0fun_name() {
     let a = 0;
+
     let x = 0;
 }
 "#,
index 8c26009add2bb04fbab8203720e32518213270bc..f17b7d8557df3510c90a6fec2c5a685355d52963 100644 (file)
@@ -339,10 +339,10 @@ pub fn tail_only_block_expr(tail_expr: ast::Expr) -> ast::BlockExpr {
 }
 
 /// Ideally this function wouldn't exist since it involves manual indenting.
-/// It differs from `make::block_expr` by also supporting comments.
+/// It differs from `make::block_expr` by also supporting comments and whitespace.
 ///
 /// FIXME: replace usages of this with the mutable syntax tree API
-pub fn hacky_block_expr_with_comments(
+pub fn hacky_block_expr(
     elements: impl IntoIterator<Item = crate::SyntaxElement>,
     tail_expr: Option<ast::Expr>,
 ) -> ast::BlockExpr {
@@ -350,10 +350,17 @@ pub fn hacky_block_expr_with_comments(
     for node_or_token in elements.into_iter() {
         match node_or_token {
             rowan::NodeOrToken::Node(n) => format_to!(buf, "    {n}\n"),
-            rowan::NodeOrToken::Token(t) if t.kind() == SyntaxKind::COMMENT => {
-                format_to!(buf, "    {t}\n")
+            rowan::NodeOrToken::Token(t) => {
+                let kind = t.kind();
+                if kind == SyntaxKind::COMMENT {
+                    format_to!(buf, "    {t}\n")
+                } else if kind == SyntaxKind::WHITESPACE {
+                    let content = t.text().trim_matches(|c| c != '\n');
+                    if content.len() >= 1 {
+                        format_to!(buf, "{}", &content[1..])
+                    }
+                }
             }
-            _ => (),
         }
     }
     if let Some(tail_expr) = tail_expr {