aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/handlers/raw_string.rs
diff options
context:
space:
mode:
authorJeremy Kolb <[email protected]>2020-06-28 23:36:05 +0100
committerkjeremy <[email protected]>2020-07-02 22:13:02 +0100
commitb98c16a034620913f3dbc67bd3f48ad2686face7 (patch)
tree10f90c96791cfd82bb160a1a5c7474ccc17d5b8b /crates/ra_assists/src/handlers/raw_string.rs
parent4cb8bf03c588dcf244d25785de3878b6ef3f7958 (diff)
Categorize assists
Diffstat (limited to 'crates/ra_assists/src/handlers/raw_string.rs')
-rw-r--r--crates/ra_assists/src/handlers/raw_string.rs75
1 files changed, 48 insertions, 27 deletions
diff --git a/crates/ra_assists/src/handlers/raw_string.rs b/crates/ra_assists/src/handlers/raw_string.rs
index d22d0aa55..8d0dac528 100644
--- a/crates/ra_assists/src/handlers/raw_string.rs
+++ b/crates/ra_assists/src/handlers/raw_string.rs
@@ -5,7 +5,7 @@ use ra_syntax::{
5 TextSize, 5 TextSize,
6}; 6};
7 7
8use crate::{AssistContext, AssistId, Assists}; 8use crate::{AssistContext, AssistId, AssistKind, Assists};
9 9
10// Assist: make_raw_string 10// Assist: make_raw_string
11// 11//
@@ -26,14 +26,23 @@ pub(crate) fn make_raw_string(acc: &mut Assists, ctx: &AssistContext) -> Option<
26 let token = ctx.find_token_at_offset(STRING).and_then(ast::String::cast)?; 26 let token = ctx.find_token_at_offset(STRING).and_then(ast::String::cast)?;
27 let value = token.value()?; 27 let value = token.value()?;
28 let target = token.syntax().text_range(); 28 let target = token.syntax().text_range();
29 acc.add(AssistId("make_raw_string"), "Rewrite as raw string", target, |edit| { 29 acc.add(
30 let max_hash_streak = count_hashes(&value); 30 AssistId("make_raw_string"),
31 let mut hashes = String::with_capacity(max_hash_streak + 1); 31 AssistKind::RefactorRewrite,
32 for _ in 0..hashes.capacity() { 32 "Rewrite as raw string",
33 hashes.push('#'); 33 target,
34 } 34 |edit| {
35 edit.replace(token.syntax().text_range(), format!("r{}\"{}\"{}", hashes, value, hashes)); 35 let max_hash_streak = count_hashes(&value);
36 }) 36 let mut hashes = String::with_capacity(max_hash_streak + 1);
37 for _ in 0..hashes.capacity() {
38 hashes.push('#');
39 }
40 edit.replace(
41 token.syntax().text_range(),
42 format!("r{}\"{}\"{}", hashes, value, hashes),
43 );
44 },
45 )
37} 46}
38 47
39// Assist: make_usual_string 48// Assist: make_usual_string
@@ -55,11 +64,17 @@ pub(crate) fn make_usual_string(acc: &mut Assists, ctx: &AssistContext) -> Optio
55 let token = ctx.find_token_at_offset(RAW_STRING).and_then(ast::RawString::cast)?; 64 let token = ctx.find_token_at_offset(RAW_STRING).and_then(ast::RawString::cast)?;
56 let value = token.value()?; 65 let value = token.value()?;
57 let target = token.syntax().text_range(); 66 let target = token.syntax().text_range();
58 acc.add(AssistId("make_usual_string"), "Rewrite as regular string", target, |edit| { 67 acc.add(
59 // parse inside string to escape `"` 68 AssistId("make_usual_string"),
60 let escaped = value.escape_default().to_string(); 69 AssistKind::RefactorRewrite,
61 edit.replace(token.syntax().text_range(), format!("\"{}\"", escaped)); 70 "Rewrite as regular string",
62 }) 71 target,
72 |edit| {
73 // parse inside string to escape `"`
74 let escaped = value.escape_default().to_string();
75 edit.replace(token.syntax().text_range(), format!("\"{}\"", escaped));
76 },
77 )
63} 78}
64 79
65// Assist: add_hash 80// Assist: add_hash
@@ -80,7 +95,7 @@ pub(crate) fn make_usual_string(acc: &mut Assists, ctx: &AssistContext) -> Optio
80pub(crate) fn add_hash(acc: &mut Assists, ctx: &AssistContext) -> Option<()> { 95pub(crate) fn add_hash(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
81 let token = ctx.find_token_at_offset(RAW_STRING)?; 96 let token = ctx.find_token_at_offset(RAW_STRING)?;
82 let target = token.text_range(); 97 let target = token.text_range();
83 acc.add(AssistId("add_hash"), "Add # to raw string", target, |edit| { 98 acc.add(AssistId("add_hash"), AssistKind::Refactor, "Add # to raw string", target, |edit| {
84 edit.insert(token.text_range().start() + TextSize::of('r'), "#"); 99 edit.insert(token.text_range().start() + TextSize::of('r'), "#");
85 edit.insert(token.text_range().end(), "#"); 100 edit.insert(token.text_range().end(), "#");
86 }) 101 })
@@ -109,18 +124,24 @@ pub(crate) fn remove_hash(acc: &mut Assists, ctx: &AssistContext) -> Option<()>
109 return None; 124 return None;
110 } 125 }
111 let target = token.text_range(); 126 let target = token.text_range();
112 acc.add(AssistId("remove_hash"), "Remove hash from raw string", target, |edit| { 127 acc.add(
113 let result = &text[2..text.len() - 1]; 128 AssistId("remove_hash"),
114 let result = if result.starts_with('\"') { 129 AssistKind::RefactorRewrite,
115 // FIXME: this logic is wrong, not only the last has has to handled specially 130 "Remove hash from raw string",
116 // no more hash, escape 131 target,
117 let internal_str = &result[1..result.len() - 1]; 132 |edit| {
118 format!("\"{}\"", internal_str.escape_default().to_string()) 133 let result = &text[2..text.len() - 1];
119 } else { 134 let result = if result.starts_with('\"') {
120 result.to_owned() 135 // FIXME: this logic is wrong, not only the last has has to handled specially
121 }; 136 // no more hash, escape
122 edit.replace(token.text_range(), format!("r{}", result)); 137 let internal_str = &result[1..result.len() - 1];
123 }) 138 format!("\"{}\"", internal_str.escape_default().to_string())
139 } else {
140 result.to_owned()
141 };
142 edit.replace(token.text_range(), format!("r{}", result));
143 },
144 )
124} 145}
125 146
126fn count_hashes(s: &str) -> usize { 147fn count_hashes(s: &str) -> usize {