1
- use syntax:: { ast, AstNode , SyntaxKind , TextRange } ;
1
+ use syntax:: { ast, AstNode } ;
2
2
3
3
use crate :: { AssistContext , AssistId , AssistKind , Assists } ;
4
4
@@ -19,43 +19,28 @@ use crate::{AssistContext, AssistId, AssistKind, Assists};
19
19
// ```
20
20
pub ( crate ) fn remove_parentheses ( acc : & mut Assists , ctx : & AssistContext < ' _ > ) -> Option < ( ) > {
21
21
let parens = ctx. find_node_at_offset :: < ast:: ParenExpr > ( ) ?;
22
- let l_paren = parens. l_paren_token ( ) ?;
23
- let r_paren = parens. r_paren_token ( ) ?;
24
22
25
- let cursor_in_range = l_paren. text_range ( ) . contains_range ( ctx. selection_trimmed ( ) )
26
- || r_paren. text_range ( ) . contains_range ( ctx. selection_trimmed ( ) ) ;
23
+ let cursor_in_range =
24
+ parens. l_paren_token ( ) ?. text_range ( ) . contains_range ( ctx. selection_trimmed ( ) )
25
+ || parens. r_paren_token ( ) ?. text_range ( ) . contains_range ( ctx. selection_trimmed ( ) ) ;
27
26
if !cursor_in_range {
28
27
return None ;
29
28
}
30
29
31
30
let expr = parens. expr ( ) ?;
31
+
32
32
let parent = ast:: Expr :: cast ( parens. syntax ( ) . parent ( ) ?) ;
33
33
let is_ok_to_remove = expr. precedence ( ) >= parent. as_ref ( ) . and_then ( ast:: Expr :: precedence) ;
34
34
if !is_ok_to_remove {
35
35
return None ;
36
36
}
37
37
38
- let delete_from_l = l_paren. text_range ( ) . start ( ) ;
39
- let delete_to_l = match l_paren. next_token ( ) {
40
- Some ( it) if it. kind ( ) == SyntaxKind :: WHITESPACE => it. text_range ( ) . end ( ) ,
41
- _ => l_paren. text_range ( ) . end ( ) ,
42
- } ;
43
-
44
- let delete_from_r = match r_paren. prev_token ( ) {
45
- Some ( it) if it. kind ( ) == SyntaxKind :: WHITESPACE => it. text_range ( ) . start ( ) ,
46
- _ => r_paren. text_range ( ) . start ( ) ,
47
- } ;
48
- let delete_to_r = r_paren. text_range ( ) . end ( ) ;
49
-
50
38
let target = parens. syntax ( ) . text_range ( ) ;
51
39
acc. add (
52
40
AssistId ( "remove_parentheses" , AssistKind :: Refactor ) ,
53
41
"Remove redundant parentheses" ,
54
42
target,
55
- |builder| {
56
- builder. delete ( TextRange :: new ( delete_from_l, delete_to_l) ) ;
57
- builder. delete ( TextRange :: new ( delete_from_r, delete_to_r) ) ;
58
- } ,
43
+ |builder| builder. replace_ast ( parens. into ( ) , expr) ,
59
44
)
60
45
}
61
46
0 commit comments