@@ -2,13 +2,14 @@ use ra_syntax::{
2
2
ast:: { self , NameOwner , VisibilityOwner } ,
3
3
AstNode ,
4
4
SyntaxKind :: {
5
- ATTR , COMMENT , CONST_DEF , ENUM_DEF , FN_DEF , IDENT , MODULE , STRUCT_DEF , TRAIT_DEF ,
6
- VISIBILITY , WHITESPACE ,
5
+ ATTR , COMMENT , CONST_DEF , ENUM_DEF , FN_DEF , MODULE , STRUCT_DEF , TRAIT_DEF , VISIBILITY ,
6
+ WHITESPACE ,
7
7
} ,
8
8
SyntaxNode , TextUnit , T ,
9
9
} ;
10
10
11
11
use crate :: { Assist , AssistCtx , AssistId } ;
12
+ use test_utils:: tested_by;
12
13
13
14
// Assist: change_visibility
14
15
//
@@ -47,13 +48,16 @@ fn add_vis(ctx: AssistCtx) -> Option<Assist> {
47
48
}
48
49
( vis_offset ( & parent) , keyword. text_range ( ) )
49
50
} else {
50
- let ident = ctx. token_at_offset ( ) . find ( |leaf| leaf . kind ( ) == IDENT ) ?;
51
- let field = ident . parent ( ) . ancestors ( ) . find_map ( ast:: RecordFieldDef :: cast) ?;
52
- if field. name ( ) ?. syntax ( ) . text_range ( ) != ident . text_range ( ) && field . visibility ( ) . is_some ( )
53
- {
51
+ let field_name : ast :: Name = ctx. find_node_at_offset ( ) ?;
52
+ let field = field_name . syntax ( ) . ancestors ( ) . find_map ( ast:: RecordFieldDef :: cast) ?;
53
+ if field. name ( ) ? != field_name {
54
+ tested_by ! ( change_visibility_field_false_positive ) ;
54
55
return None ;
55
56
}
56
- ( vis_offset ( field. syntax ( ) ) , ident. text_range ( ) )
57
+ if field. visibility ( ) . is_some ( ) {
58
+ return None ;
59
+ }
60
+ ( vis_offset ( field. syntax ( ) ) , field_name. syntax ( ) . text_range ( ) )
57
61
} ;
58
62
59
63
ctx. add_assist ( AssistId ( "change_visibility" ) , "Change visibility to pub(crate)" , |edit| {
@@ -98,8 +102,11 @@ fn change_vis(ctx: AssistCtx, vis: ast::Visibility) -> Option<Assist> {
98
102
99
103
#[ cfg( test) ]
100
104
mod tests {
105
+ use test_utils:: covers;
106
+
107
+ use crate :: helpers:: { check_assist, check_assist_not_applicable, check_assist_target} ;
108
+
101
109
use super :: * ;
102
- use crate :: helpers:: { check_assist, check_assist_target} ;
103
110
104
111
#[ test]
105
112
fn change_visibility_adds_pub_crate_to_items ( ) {
@@ -120,8 +127,17 @@ mod tests {
120
127
fn change_visibility_works_with_struct_fields ( ) {
121
128
check_assist (
122
129
change_visibility,
123
- "struct S { <|>field: u32 }" ,
124
- "struct S { <|>pub(crate) field: u32 }" ,
130
+ r"struct S { <|>field: u32 }" ,
131
+ r"struct S { <|>pub(crate) field: u32 }" ,
132
+ )
133
+ }
134
+
135
+ #[ test]
136
+ fn change_visibility_field_false_positive ( ) {
137
+ covers ! ( change_visibility_field_false_positive) ;
138
+ check_assist_not_applicable (
139
+ change_visibility,
140
+ r"struct S { field: [(); { let <|>x = ();}] }" ,
125
141
)
126
142
}
127
143
@@ -144,15 +160,15 @@ mod tests {
144
160
fn change_visibility_handles_comment_attrs ( ) {
145
161
check_assist (
146
162
change_visibility,
147
- "
163
+ r "
148
164
/// docs
149
165
150
166
// comments
151
167
152
168
#[derive(Debug)]
153
169
<|>struct Foo;
154
170
" ,
155
- "
171
+ r "
156
172
/// docs
157
173
158
174
// comments
0 commit comments