1
- use syntax:: { ast, AstNode } ;
1
+ use syntax:: { ast, AstNode , SyntaxKind , T } ;
2
2
3
3
use crate :: { AssistContext , AssistId , AssistKind , Assists } ;
4
4
@@ -34,12 +34,27 @@ pub(crate) fn remove_parentheses(acc: &mut Assists, ctx: &AssistContext<'_>) ->
34
34
return None ;
35
35
}
36
36
37
+ // we should use `find_node_at_offset` at `SourceFile` level to get expectant `Between`
38
+ let token_at_offset = ctx
39
+ . find_node_at_offset :: < ast:: SourceFile > ( ) ?
40
+ . syntax ( )
41
+ . token_at_offset ( parens. syntax ( ) . text_range ( ) . start ( ) ) ;
42
+ let need_to_add_ws = match token_at_offset {
43
+ syntax:: TokenAtOffset :: Between ( before, _after) => {
44
+ // anyother `SyntaxKind` we missing here?
45
+ let tokens = vec ! [ T ![ & ] , T ![ !] , T ![ '(' ] , T ![ '[' ] , T ![ '{' ] ] ;
46
+ before. kind ( ) != SyntaxKind :: WHITESPACE && !tokens. contains ( & before. kind ( ) )
47
+ }
48
+ _ => false ,
49
+ } ;
50
+ let expr = if need_to_add_ws { format ! ( " {}" , expr) } else { expr. to_string ( ) } ;
51
+
37
52
let target = parens. syntax ( ) . text_range ( ) ;
38
53
acc. add (
39
54
AssistId ( "remove_parentheses" , AssistKind :: Refactor ) ,
40
55
"Remove redundant parentheses" ,
41
56
target,
42
- |builder| builder. replace_ast ( parens. into ( ) , expr) ,
57
+ |builder| builder. replace ( parens. syntax ( ) . text_range ( ) , expr) ,
43
58
)
44
59
}
45
60
@@ -49,6 +64,15 @@ mod tests {
49
64
50
65
use super :: * ;
51
66
67
+ #[ test]
68
+ fn remove_parens_space ( ) {
69
+ check_assist (
70
+ remove_parentheses,
71
+ r#"fn f() { match$0(true) {} }"# ,
72
+ r#"fn f() { match true {} }"# ,
73
+ ) ;
74
+ }
75
+
52
76
#[ test]
53
77
fn remove_parens_simple ( ) {
54
78
check_assist ( remove_parentheses, r#"fn f() { $0(2) + 2; }"# , r#"fn f() { 2 + 2; }"# ) ;
@@ -94,8 +118,8 @@ mod tests {
94
118
check_assist ( remove_parentheses, r#"fn f() { f(($02 + 2)); }"# , r#"fn f() { f(2 + 2); }"# ) ;
95
119
check_assist (
96
120
remove_parentheses,
97
- r#"fn f() { (1<2)&&$0(3>4); }"# ,
98
- r#"fn f() { (1<2)&& 3>4; }"# ,
121
+ r#"fn f() { (1<2) &&$0(3>4); }"# ,
122
+ r#"fn f() { (1<2) && 3>4; }"# ,
99
123
) ;
100
124
}
101
125
@@ -164,8 +188,8 @@ mod tests {
164
188
fn remove_parens_weird_places ( ) {
165
189
check_assist (
166
190
remove_parentheses,
167
- r#"fn f() { match () { _=>$0(()) } }"# ,
168
- r#"fn f() { match () { _=> () } }"# ,
191
+ r#"fn f() { match () { _ =>$0(()) } }"# ,
192
+ r#"fn f() { match () { _ => () } }"# ,
169
193
) ;
170
194
171
195
check_assist (
0 commit comments