aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_editor/src/assists/change_visibility.rs32
-rw-r--r--crates/ra_syntax/src/yellow/syntax_text.rs18
2 files changed, 48 insertions, 2 deletions
diff --git a/crates/ra_editor/src/assists/change_visibility.rs b/crates/ra_editor/src/assists/change_visibility.rs
index ac75f635e..6c8466394 100644
--- a/crates/ra_editor/src/assists/change_visibility.rs
+++ b/crates/ra_editor/src/assists/change_visibility.rs
@@ -7,10 +7,19 @@ use ra_syntax::{
7use crate::assists::{AssistCtx, Assist}; 7use crate::assists::{AssistCtx, Assist};
8 8
9pub fn change_visibility(ctx: AssistCtx) -> Option<Assist> { 9pub fn change_visibility(ctx: AssistCtx) -> Option<Assist> {
10 let offset = if let Some(keyword) = ctx.leaf_at_offset().find(|leaf| match leaf.kind() { 10 if let Some(vis) = ctx.node_at_offset::<ast::Visibility>() {
11 return change_vis(ctx, vis);
12 }
13 add_vis(ctx)
14}
15
16fn add_vis(ctx: AssistCtx) -> Option<Assist> {
17 let item_keyword = ctx.leaf_at_offset().find(|leaf| match leaf.kind() {
11 FN_KW | MOD_KW | STRUCT_KW | ENUM_KW | TRAIT_KW => true, 18 FN_KW | MOD_KW | STRUCT_KW | ENUM_KW | TRAIT_KW => true,
12 _ => false, 19 _ => false,
13 }) { 20 });
21
22 let offset = if let Some(keyword) = item_keyword {
14 let parent = keyword.parent()?; 23 let parent = keyword.parent()?;
15 let def_kws = vec![FN_DEF, MODULE, STRUCT_DEF, ENUM_DEF, TRAIT_DEF]; 24 let def_kws = vec![FN_DEF, MODULE, STRUCT_DEF, ENUM_DEF, TRAIT_DEF];
16 // Parent is not a definition, can't add visibility 25 // Parent is not a definition, can't add visibility
@@ -37,6 +46,16 @@ pub fn change_visibility(ctx: AssistCtx) -> Option<Assist> {
37 }) 46 })
38} 47}
39 48
49fn change_vis(ctx: AssistCtx, vis: ast::Visibility) -> Option<Assist> {
50 if vis.syntax().text() != "pub" {
51 return None;
52 }
53 ctx.build("chage to pub(crate)", |edit| {
54 edit.replace(vis.syntax().range(), "pub(crate)");
55 edit.set_cursor(vis.syntax().range().start());
56 })
57}
58
40#[cfg(test)] 59#[cfg(test)]
41mod tests { 60mod tests {
42 use super::*; 61 use super::*;
@@ -85,4 +104,13 @@ mod tests {
85 "struct S { <|>pub(crate) field: u32 }", 104 "struct S { <|>pub(crate) field: u32 }",
86 ) 105 )
87 } 106 }
107
108 #[test]
109 fn change_visibility_pub_to_pub_crate() {
110 check_assist(
111 change_visibility,
112 "<|>pub fn foo() {}",
113 "<|>pub(crate) fn foo() {}",
114 )
115 }
88} 116}
diff --git a/crates/ra_syntax/src/yellow/syntax_text.rs b/crates/ra_syntax/src/yellow/syntax_text.rs
index 783dca214..279a83b61 100644
--- a/crates/ra_syntax/src/yellow/syntax_text.rs
+++ b/crates/ra_syntax/src/yellow/syntax_text.rs
@@ -125,3 +125,21 @@ impl From<SyntaxText<'_>> for String {
125 text.to_string() 125 text.to_string()
126 } 126 }
127} 127}
128
129impl PartialEq<str> for SyntaxText<'_> {
130 fn eq(&self, mut rhs: &str) -> bool {
131 for chunk in self.chunks() {
132 if !rhs.starts_with(chunk) {
133 return false;
134 }
135 rhs = &rhs[chunk.len()..];
136 }
137 rhs.is_empty()
138 }
139}
140
141impl PartialEq<&'_ str> for SyntaxText<'_> {
142 fn eq(&self, rhs: &&str) -> bool {
143 self == *rhs
144 }
145}