fix: keep whitespace in extract function handler
This commit is contained in:
@@ -1799,7 +1799,8 @@ fn make_body(
|
|||||||
})
|
})
|
||||||
.collect::<Vec<SyntaxElement>>();
|
.collect::<Vec<SyntaxElement>>();
|
||||||
let tail_expr = tail_expr.map(|expr| expr.dedent(old_indent).indent(body_indent));
|
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()));
|
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 {
|
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]
|
#[test]
|
||||||
fn extract_function_does_not_preserve_whitespace() {
|
fn extract_function_does_preserve_whitespace() {
|
||||||
check_assist(
|
check_assist(
|
||||||
extract_function,
|
extract_function,
|
||||||
r#"
|
r#"
|
||||||
@@ -4999,6 +4999,7 @@ fn func() {
|
|||||||
|
|
||||||
fn $0fun_name() {
|
fn $0fun_name() {
|
||||||
let a = 0;
|
let a = 0;
|
||||||
|
|
||||||
let x = 0;
|
let x = 0;
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
|
|||||||
@@ -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.
|
/// 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
|
/// 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>,
|
elements: impl IntoIterator<Item = crate::SyntaxElement>,
|
||||||
tail_expr: Option<ast::Expr>,
|
tail_expr: Option<ast::Expr>,
|
||||||
) -> ast::BlockExpr {
|
) -> ast::BlockExpr {
|
||||||
@@ -350,10 +350,17 @@ pub fn hacky_block_expr_with_comments(
|
|||||||
for node_or_token in elements.into_iter() {
|
for node_or_token in elements.into_iter() {
|
||||||
match node_or_token {
|
match node_or_token {
|
||||||
rowan::NodeOrToken::Node(n) => format_to!(buf, " {n}\n"),
|
rowan::NodeOrToken::Node(n) => format_to!(buf, " {n}\n"),
|
||||||
rowan::NodeOrToken::Token(t) if t.kind() == SyntaxKind::COMMENT => {
|
rowan::NodeOrToken::Token(t) => {
|
||||||
|
let kind = t.kind();
|
||||||
|
if kind == SyntaxKind::COMMENT {
|
||||||
format_to!(buf, " {t}\n")
|
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 {
|
if let Some(tail_expr) = tail_expr {
|
||||||
|
|||||||
Reference in New Issue
Block a user