1
1
use itertools:: Itertools ;
2
2
use syntax:: {
3
3
ast:: { self , AstNode , AstToken } ,
4
- match_ast, NodeOrToken , SyntaxElement , TextSize , T ,
4
+ match_ast, NodeOrToken , SyntaxElement , TextRange , TextSize , T ,
5
5
} ;
6
6
7
7
use crate :: { AssistContext , AssistId , AssistKind , Assists } ;
@@ -22,7 +22,36 @@ use crate::{AssistContext, AssistId, AssistKind, Assists};
22
22
// }
23
23
// ```
24
24
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 ) > {
26
55
let tt = macro_call. token_tree ( ) ?;
27
56
let r_delim = NodeOrToken :: Token ( tt. right_delimiter_token ( ) ?) ;
28
57
if macro_call. path ( ) ?. segment ( ) ?. name_ref ( ) ?. text ( ) != "dbg"
@@ -41,7 +70,7 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<(
41
70
42
71
let macro_expr = ast:: MacroExpr :: cast ( macro_call. syntax ( ) . parent ( ) ?) ?;
43
72
let parent = macro_expr. syntax ( ) . parent ( ) ?;
44
- let ( range , text ) = match & * input_expressions {
73
+ Some ( match & * input_expressions {
45
74
// dbg!()
46
75
[ ] => {
47
76
match_ast ! {
@@ -107,10 +136,6 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<(
107
136
}
108
137
// dbg!(expr0, expr1, ...)
109
138
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) ;
114
139
} )
115
140
}
116
141
@@ -238,4 +263,28 @@ fn foo() {
238
263
check ( r#"$0dbg!(0, 1)"# , r#"(0, 1)"# ) ;
239
264
check ( r#"$0dbg!(0, (1, 2))"# , r#"(0, (1, 2))"# ) ;
240
265
}
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
+ }
241
290
}
0 commit comments