diff options
Diffstat (limited to 'crates/ra_assists/src/handlers/raw_string.rs')
-rw-r--r-- | crates/ra_assists/src/handlers/raw_string.rs | 75 |
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 | ||
8 | use crate::{AssistContext, AssistId, Assists}; | 8 | use 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 | |||
80 | pub(crate) fn add_hash(acc: &mut Assists, ctx: &AssistContext) -> Option<()> { | 95 | pub(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 | ||
126 | fn count_hashes(s: &str) -> usize { | 147 | fn count_hashes(s: &str) -> usize { |