diff options
Diffstat (limited to 'crates/ra_assists/src/handlers/change_visibility.rs')
-rw-r--r-- | crates/ra_assists/src/handlers/change_visibility.rs | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/crates/ra_assists/src/handlers/change_visibility.rs b/crates/ra_assists/src/handlers/change_visibility.rs index c21d75be0..4343b423c 100644 --- a/crates/ra_assists/src/handlers/change_visibility.rs +++ b/crates/ra_assists/src/handlers/change_visibility.rs | |||
@@ -2,14 +2,13 @@ use ra_syntax::{ | |||
2 | ast::{self, NameOwner, VisibilityOwner}, | 2 | ast::{self, NameOwner, VisibilityOwner}, |
3 | AstNode, | 3 | AstNode, |
4 | SyntaxKind::{ | 4 | SyntaxKind::{ |
5 | ATTR, COMMENT, CONST_DEF, ENUM_DEF, FN_DEF, MODULE, STRUCT_DEF, TRAIT_DEF, VISIBILITY, | 5 | CONST_DEF, ENUM_DEF, FN_DEF, MODULE, STATIC_DEF, STRUCT_DEF, TRAIT_DEF, VISIBILITY, |
6 | WHITESPACE, | ||
7 | }, | 6 | }, |
8 | SyntaxNode, TextSize, T, | 7 | T, |
9 | }; | 8 | }; |
10 | use test_utils::mark; | 9 | use test_utils::mark; |
11 | 10 | ||
12 | use crate::{AssistContext, AssistId, Assists}; | 11 | use crate::{utils::vis_offset, AssistContext, AssistId, AssistKind, Assists}; |
13 | 12 | ||
14 | // Assist: change_visibility | 13 | // Assist: change_visibility |
15 | // | 14 | // |
@@ -30,14 +29,16 @@ pub(crate) fn change_visibility(acc: &mut Assists, ctx: &AssistContext) -> Optio | |||
30 | } | 29 | } |
31 | 30 | ||
32 | fn add_vis(acc: &mut Assists, ctx: &AssistContext) -> Option<()> { | 31 | fn add_vis(acc: &mut Assists, ctx: &AssistContext) -> Option<()> { |
33 | let item_keyword = ctx.token_at_offset().find(|leaf| match leaf.kind() { | 32 | let item_keyword = ctx.token_at_offset().find(|leaf| { |
34 | T![const] | T![fn] | T![mod] | T![struct] | T![enum] | T![trait] => true, | 33 | matches!( |
35 | _ => false, | 34 | leaf.kind(), |
35 | T![const] | T![static] | T![fn] | T![mod] | T![struct] | T![enum] | T![trait] | ||
36 | ) | ||
36 | }); | 37 | }); |
37 | 38 | ||
38 | let (offset, target) = if let Some(keyword) = item_keyword { | 39 | let (offset, target) = if let Some(keyword) = item_keyword { |
39 | let parent = keyword.parent(); | 40 | let parent = keyword.parent(); |
40 | let def_kws = vec![CONST_DEF, FN_DEF, MODULE, STRUCT_DEF, ENUM_DEF, TRAIT_DEF]; | 41 | let def_kws = vec![CONST_DEF, STATIC_DEF, FN_DEF, MODULE, STRUCT_DEF, ENUM_DEF, TRAIT_DEF]; |
41 | // Parent is not a definition, can't add visibility | 42 | // Parent is not a definition, can't add visibility |
42 | if !def_kws.iter().any(|&def_kw| def_kw == parent.kind()) { | 43 | if !def_kws.iter().any(|&def_kw| def_kw == parent.kind()) { |
43 | return None; | 44 | return None; |
@@ -66,27 +67,21 @@ fn add_vis(acc: &mut Assists, ctx: &AssistContext) -> Option<()> { | |||
66 | return None; | 67 | return None; |
67 | }; | 68 | }; |
68 | 69 | ||
69 | acc.add(AssistId("change_visibility"), "Change visibility to pub(crate)", target, |edit| { | 70 | acc.add( |
70 | edit.insert(offset, "pub(crate) "); | 71 | AssistId("change_visibility", AssistKind::RefactorRewrite), |
71 | }) | 72 | "Change visibility to pub(crate)", |
72 | } | 73 | target, |
73 | 74 | |edit| { | |
74 | fn vis_offset(node: &SyntaxNode) -> TextSize { | 75 | edit.insert(offset, "pub(crate) "); |
75 | node.children_with_tokens() | 76 | }, |
76 | .skip_while(|it| match it.kind() { | 77 | ) |
77 | WHITESPACE | COMMENT | ATTR => true, | ||
78 | _ => false, | ||
79 | }) | ||
80 | .next() | ||
81 | .map(|it| it.text_range().start()) | ||
82 | .unwrap_or_else(|| node.text_range().start()) | ||
83 | } | 78 | } |
84 | 79 | ||
85 | fn change_vis(acc: &mut Assists, vis: ast::Visibility) -> Option<()> { | 80 | fn change_vis(acc: &mut Assists, vis: ast::Visibility) -> Option<()> { |
86 | if vis.syntax().text() == "pub" { | 81 | if vis.syntax().text() == "pub" { |
87 | let target = vis.syntax().text_range(); | 82 | let target = vis.syntax().text_range(); |
88 | return acc.add( | 83 | return acc.add( |
89 | AssistId("change_visibility"), | 84 | AssistId("change_visibility", AssistKind::RefactorRewrite), |
90 | "Change Visibility to pub(crate)", | 85 | "Change Visibility to pub(crate)", |
91 | target, | 86 | target, |
92 | |edit| { | 87 | |edit| { |
@@ -97,7 +92,7 @@ fn change_vis(acc: &mut Assists, vis: ast::Visibility) -> Option<()> { | |||
97 | if vis.syntax().text() == "pub(crate)" { | 92 | if vis.syntax().text() == "pub(crate)" { |
98 | let target = vis.syntax().text_range(); | 93 | let target = vis.syntax().text_range(); |
99 | return acc.add( | 94 | return acc.add( |
100 | AssistId("change_visibility"), | 95 | AssistId("change_visibility", AssistKind::RefactorRewrite), |
101 | "Change visibility to pub", | 96 | "Change visibility to pub", |
102 | target, | 97 | target, |
103 | |edit| { | 98 | |edit| { |
@@ -162,6 +157,11 @@ mod tests { | |||
162 | } | 157 | } |
163 | 158 | ||
164 | #[test] | 159 | #[test] |
160 | fn change_visibility_static() { | ||
161 | check_assist(change_visibility, "<|>static FOO = 3u8;", "pub(crate) static FOO = 3u8;"); | ||
162 | } | ||
163 | |||
164 | #[test] | ||
165 | fn change_visibility_handles_comment_attrs() { | 165 | fn change_visibility_handles_comment_attrs() { |
166 | check_assist( | 166 | check_assist( |
167 | change_visibility, | 167 | change_visibility, |