Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/remove_dbg.rs')
-rw-r--r--crates/ide-assists/src/handlers/remove_dbg.rs67
1 files changed, 66 insertions, 1 deletions
diff --git a/crates/ide-assists/src/handlers/remove_dbg.rs b/crates/ide-assists/src/handlers/remove_dbg.rs
index 9356d02706..08779a3ed1 100644
--- a/crates/ide-assists/src/handlers/remove_dbg.rs
+++ b/crates/ide-assists/src/handlers/remove_dbg.rs
@@ -83,7 +83,9 @@ fn compute_dbg_replacement(
let input_expressions = input_expressions
.into_iter()
.filter_map(|(is_sep, group)| (!is_sep).then_some(group))
- .map(|mut tokens| syntax::hacks::parse_expr_from_str(&tokens.join(""), Edition::CURRENT))
+ .map(|tokens| tokens.collect::<Vec<_>>())
+ .filter(|tokens| !tokens.iter().all(|it| it.kind().is_trivia()))
+ .map(|tokens| syntax::hacks::parse_expr_from_str(&tokens.iter().join(""), Edition::CURRENT))
.collect::<Option<Vec<ast::Expr>>>()?;
let parent = macro_expr.syntax().parent()?;
@@ -112,6 +114,16 @@ fn compute_dbg_replacement(
}
}
}
+ // dbg!(2, 'x', &x, x, ...);
+ exprs if ast::ExprStmt::can_cast(parent.kind()) && exprs.iter().all(pure_expr) => {
+ let mut replace = vec![parent.clone().into()];
+ if let Some(prev_sibling) = parent.prev_sibling_or_token()
+ && prev_sibling.kind() == syntax::SyntaxKind::WHITESPACE
+ {
+ replace.push(prev_sibling);
+ }
+ (replace, None)
+ }
// dbg!(expr0)
[expr] => {
// dbg!(expr, &parent);
@@ -163,6 +175,20 @@ fn compute_dbg_replacement(
})
}
+fn pure_expr(expr: &ast::Expr) -> bool {
+ match_ast! {
+ match (expr.syntax()) {
+ ast::Literal(_) => true,
+ ast::RefExpr(it) => {
+ matches!(it.expr(), Some(ast::Expr::PathExpr(p))
+ if p.path().and_then(|p| p.as_single_name_ref()).is_some())
+ },
+ ast::PathExpr(it) => it.path().and_then(|it| it.as_single_name_ref()).is_some(),
+ _ => false,
+ }
+ }
+}
+
fn replace_nested_dbgs(expanded: ast::Expr) -> ast::Expr {
if let ast::Expr::MacroExpr(mac) = &expanded {
// Special-case when `expanded` itself is `dbg!()` since we cannot replace the whole tree
@@ -232,6 +258,45 @@ mod tests {
}
#[test]
+ fn test_remove_simple_dbg_statement() {
+ check_assist(
+ remove_dbg,
+ r#"
+fn foo() {
+ let n = 2;
+ $0dbg!(3);
+ dbg!(2.6);
+ dbg!(1, 2.5);
+ dbg!('x');
+ dbg!(&n);
+ dbg!(n);
+ dbg!(n,);
+ dbg!(n, );
+ // needless comment
+ dbg!("foo");$0
+}
+"#,
+ r#"
+fn foo() {
+ let n = 2;
+ // needless comment
+}
+"#,
+ );
+ }
+
+ #[test]
+ fn test_remove_trailing_comma_dbg() {
+ check("$0dbg!(1 + 1,)", "1 + 1");
+ check("$0dbg!(1 + 1, )", "1 + 1");
+ check("$0dbg!(1 + 1,\n)", "1 + 1");
+ check("$0dbg!(1 + 1, 2 + 3)", "(1 + 1, 2 + 3)");
+ check("$0dbg!(1 + 1, 2 + 3 )", "(1 + 1, 2 + 3)");
+ check("$0dbg!(1 + 1, 2 + 3, )", "(1 + 1, 2 + 3)");
+ check("$0dbg!(1 + 1, 2 + 3 ,)", "(1 + 1, 2 + 3)");
+ }
+
+ #[test]
fn test_remove_dbg_not_applicable() {
check_assist_not_applicable(remove_dbg, "fn main() {$0vec![1, 2, 3]}");
check_assist_not_applicable(remove_dbg, "fn main() {$0dbg(5, 6, 7)}");