11use itertools:: Itertools ;
22use syntax:: {
33 ast:: { self , AstNode , AstToken } ,
4- match_ast, NodeOrToken , SyntaxElement , TextSize , T ,
4+ match_ast, NodeOrToken , SyntaxElement , TextRange , TextSize , T ,
55} ;
66
77use crate :: { AssistContext , AssistId , AssistKind , Assists } ;
@@ -22,7 +22,36 @@ use crate::{AssistContext, AssistId, AssistKind, Assists};
2222// }
2323// ```
2424pub ( 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