@@ -93,8 +93,9 @@ fn needs_parentheses_around_macro_contents(macro_contents: Vec<SyntaxElement>) -
93
93
if macro_contents. len ( ) < 2 {
94
94
return false ;
95
95
}
96
+ let mut macro_contents = macro_contents. into_iter ( ) . peekable ( ) ;
96
97
let mut unpaired_brackets_in_contents = Vec :: new ( ) ;
97
- for element in macro_contents {
98
+ while let Some ( element) = macro_contents. next ( ) {
98
99
match element. kind ( ) {
99
100
T ! [ '(' ] | T ! [ '[' ] | T ! [ '{' ] => unpaired_brackets_in_contents. push ( element) ,
100
101
T ! [ ')' ] => {
@@ -118,8 +119,14 @@ fn needs_parentheses_around_macro_contents(macro_contents: Vec<SyntaxElement>) -
118
119
symbol_kind => {
119
120
let symbol_not_in_bracket = unpaired_brackets_in_contents. is_empty ( ) ;
120
121
if symbol_not_in_bracket
121
- && symbol_kind != SyntaxKind :: COLON
122
- && symbol_kind. is_punct ( )
122
+ && symbol_kind != SyntaxKind :: COLON // paths
123
+ && ( symbol_kind != SyntaxKind :: DOT // field/method access
124
+ || macro_contents // range expressions consist of two SyntaxKind::Dot in macro invocations
125
+ . peek ( )
126
+ . map ( |element| element. kind ( ) == SyntaxKind :: DOT )
127
+ . unwrap_or ( false ) )
128
+ && symbol_kind != SyntaxKind :: QUESTION // try operator
129
+ && ( symbol_kind. is_punct ( ) || symbol_kind == SyntaxKind :: AS_KW )
123
130
{
124
131
return true ;
125
132
}
@@ -242,6 +249,25 @@ fn main() {
242
249
check_assist ( remove_dbg, r#"let res = <|>dbg![2 + 2] * 5"# , r#"let res = (2 + 2) * 5"# ) ;
243
250
}
244
251
252
+ #[ test]
253
+ fn test_remove_dbg_method_chaining ( ) {
254
+ check_assist (
255
+ remove_dbg,
256
+ r#"let res = <|>dbg!(foo().bar()).baz();"# ,
257
+ r#"let res = foo().bar().baz();"# ,
258
+ ) ;
259
+ check_assist (
260
+ remove_dbg,
261
+ r#"let res = <|>dbg!(foo.bar()).baz();"# ,
262
+ r#"let res = foo.bar().baz();"# ,
263
+ ) ;
264
+ }
265
+
266
+ #[ test]
267
+ fn test_remove_dbg_field_chaining ( ) {
268
+ check_assist ( remove_dbg, r#"let res = <|>dbg!(foo.bar).baz;"# , r#"let res = foo.bar.baz;"# ) ;
269
+ }
270
+
245
271
#[ test]
246
272
fn test_remove_dbg_from_inside_fn ( ) {
247
273
check_assist_target (
@@ -280,4 +306,59 @@ fn main() {
280
306
}"# ,
281
307
) ;
282
308
}
309
+
310
+ #[ test]
311
+ fn test_remove_dbg_try_expr ( ) {
312
+ check_assist (
313
+ remove_dbg,
314
+ r#"let res = <|>dbg!(result?).foo();"# ,
315
+ r#"let res = result?.foo();"# ,
316
+ ) ;
317
+ }
318
+
319
+ #[ test]
320
+ fn test_remove_dbg_await_expr ( ) {
321
+ check_assist (
322
+ remove_dbg,
323
+ r#"let res = <|>dbg!(fut.await).foo();"# ,
324
+ r#"let res = fut.await.foo();"# ,
325
+ ) ;
326
+ }
327
+
328
+ #[ test]
329
+ fn test_remove_dbg_as_cast ( ) {
330
+ check_assist (
331
+ remove_dbg,
332
+ r#"let res = <|>dbg!(3 as usize).foo();"# ,
333
+ r#"let res = (3 as usize).foo();"# ,
334
+ ) ;
335
+ }
336
+
337
+ #[ test]
338
+ fn test_remove_dbg_index_expr ( ) {
339
+ check_assist (
340
+ remove_dbg,
341
+ r#"let res = <|>dbg!(array[3]).foo();"# ,
342
+ r#"let res = array[3].foo();"# ,
343
+ ) ;
344
+ check_assist (
345
+ remove_dbg,
346
+ r#"let res = <|>dbg!(tuple.3).foo();"# ,
347
+ r#"let res = tuple.3.foo();"# ,
348
+ ) ;
349
+ }
350
+
351
+ #[ test]
352
+ fn test_remove_dbg_range_expr ( ) {
353
+ check_assist (
354
+ remove_dbg,
355
+ r#"let res = <|>dbg!(foo..bar).foo();"# ,
356
+ r#"let res = (foo..bar).foo();"# ,
357
+ ) ;
358
+ check_assist (
359
+ remove_dbg,
360
+ r#"let res = <|>dbg!(foo..=bar).foo();"# ,
361
+ r#"let res = (foo..=bar).foo();"# ,
362
+ ) ;
363
+ }
283
364
}
0 commit comments