Skip to content

Commit e162d58

Browse files
committed
Auto merge of rust-lang#13629 - jonas-schievink:remove-dbg-selection, r=jonas-schievink
feat: Make "Remove dbg!()" assist work on selections Fixes rust-lang/rust-analyzer#12114
2 parents 9cf5c22 + cd6459e commit e162d58

File tree

1 file changed

+56
-7
lines changed

1 file changed

+56
-7
lines changed

crates/ide-assists/src/handlers/remove_dbg.rs

+56-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use itertools::Itertools;
22
use syntax::{
33
ast::{self, AstNode, AstToken},
4-
match_ast, NodeOrToken, SyntaxElement, TextSize, T,
4+
match_ast, NodeOrToken, SyntaxElement, TextRange, TextSize, T,
55
};
66

77
use crate::{AssistContext, AssistId, AssistKind, Assists};
@@ -22,7 +22,36 @@ use crate::{AssistContext, AssistId, AssistKind, Assists};
2222
// }
2323
// ```
2424
pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
25-
let macro_call = ctx.find_node_at_offset::<ast::MacroCall>()?;
25+
let macro_calls = if ctx.has_empty_selection() {
26+
vec![ctx.find_node_at_offset::<ast::MacroCall>()?]
27+
} else {
28+
ctx.covering_element()
29+
.as_node()?
30+
.descendants()
31+
.filter(|node| ctx.selection_trimmed().contains_range(node.text_range()))
32+
.filter_map(ast::MacroCall::cast)
33+
.collect()
34+
};
35+
36+
let replacements =
37+
macro_calls.into_iter().filter_map(compute_dbg_replacement).collect::<Vec<_>>();
38+
if replacements.is_empty() {
39+
return None;
40+
}
41+
42+
acc.add(
43+
AssistId("remove_dbg", AssistKind::Refactor),
44+
"Remove dbg!()",
45+
ctx.selection_trimmed(),
46+
|builder| {
47+
for (range, text) in replacements {
48+
builder.replace(range, text);
49+
}
50+
},
51+
)
52+
}
53+
54+
fn compute_dbg_replacement(macro_call: ast::MacroCall) -> Option<(TextRange, String)> {
2655
let tt = macro_call.token_tree()?;
2756
let r_delim = NodeOrToken::Token(tt.right_delimiter_token()?);
2857
if macro_call.path()?.segment()?.name_ref()?.text() != "dbg"
@@ -41,7 +70,7 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<(
4170

4271
let macro_expr = ast::MacroExpr::cast(macro_call.syntax().parent()?)?;
4372
let parent = macro_expr.syntax().parent()?;
44-
let (range, text) = match &*input_expressions {
73+
Some(match &*input_expressions {
4574
// dbg!()
4675
[] => {
4776
match_ast! {
@@ -107,10 +136,6 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<(
107136
}
108137
// dbg!(expr0, expr1, ...)
109138
exprs => (macro_call.syntax().text_range(), format!("({})", exprs.iter().format(", "))),
110-
};
111-
112-
acc.add(AssistId("remove_dbg", AssistKind::Refactor), "Remove dbg!()", range, |builder| {
113-
builder.replace(range, text);
114139
})
115140
}
116141

@@ -238,4 +263,28 @@ fn foo() {
238263
check(r#"$0dbg!(0, 1)"#, r#"(0, 1)"#);
239264
check(r#"$0dbg!(0, (1, 2))"#, r#"(0, (1, 2))"#);
240265
}
266+
267+
#[test]
268+
fn test_range() {
269+
check(
270+
r#"
271+
fn f() {
272+
dbg!(0) + $0dbg!(1);
273+
dbg!(())$0
274+
}
275+
"#,
276+
r#"
277+
fn f() {
278+
dbg!(0) + 1;
279+
()
280+
}
281+
"#,
282+
);
283+
}
284+
285+
#[test]
286+
fn test_range_partial() {
287+
check_assist_not_applicable(remove_dbg, r#"$0dbg$0!(0)"#);
288+
check_assist_not_applicable(remove_dbg, r#"$0dbg!(0$0)"#);
289+
}
241290
}

0 commit comments

Comments
 (0)