diff options
Diffstat (limited to 'crates/ra_assists/src/lib.rs')
-rw-r--r-- | crates/ra_assists/src/lib.rs | 66 |
1 files changed, 63 insertions, 3 deletions
diff --git a/crates/ra_assists/src/lib.rs b/crates/ra_assists/src/lib.rs index fc4e95303..2590faca9 100644 --- a/crates/ra_assists/src/lib.rs +++ b/crates/ra_assists/src/lib.rs | |||
@@ -65,7 +65,7 @@ where | |||
65 | Assist::Unresolved(..) => unreachable!(), | 65 | Assist::Unresolved(..) => unreachable!(), |
66 | }) | 66 | }) |
67 | .collect::<Vec<(AssistLabel, AssistAction)>>(); | 67 | .collect::<Vec<(AssistLabel, AssistAction)>>(); |
68 | a.sort_unstable_by(|a, b| match a { | 68 | a.sort_by(|a, b| match a { |
69 | // Some(y) < Some(x) < None for y < x | 69 | // Some(y) < Some(x) < None for y < x |
70 | (_, AssistAction { target: Some(a), .. }) => match b { | 70 | (_, AssistAction { target: Some(a), .. }) => match b { |
71 | (_, AssistAction { target: Some(b), .. }) => a.len().cmp(&b.len()), | 71 | (_, AssistAction { target: Some(b), .. }) => a.len().cmp(&b.len()), |
@@ -163,6 +163,45 @@ mod helpers { | |||
163 | assert_eq_text!(after, &actual); | 163 | assert_eq_text!(after, &actual); |
164 | } | 164 | } |
165 | 165 | ||
166 | pub(crate) fn check_assist_target( | ||
167 | assist: fn(AssistCtx<MockDatabase>) -> Option<Assist>, | ||
168 | before: &str, | ||
169 | target: &str, | ||
170 | ) { | ||
171 | let (before_cursor_pos, before) = extract_offset(before); | ||
172 | let (db, _source_root, file_id) = MockDatabase::with_single_file(&before); | ||
173 | let frange = | ||
174 | FileRange { file_id, range: TextRange::offset_len(before_cursor_pos, 0.into()) }; | ||
175 | let assist = | ||
176 | AssistCtx::with_ctx(&db, frange, true, assist).expect("code action is not applicable"); | ||
177 | let action = match assist { | ||
178 | Assist::Unresolved(_) => unreachable!(), | ||
179 | Assist::Resolved(_, it) => it, | ||
180 | }; | ||
181 | |||
182 | let range = action.target.expect("expected target on action"); | ||
183 | assert_eq_text!(&before[range.start().to_usize()..range.end().to_usize()], target); | ||
184 | } | ||
185 | |||
186 | pub(crate) fn check_assist_range_target( | ||
187 | assist: fn(AssistCtx<MockDatabase>) -> Option<Assist>, | ||
188 | before: &str, | ||
189 | target: &str, | ||
190 | ) { | ||
191 | let (range, before) = extract_range(before); | ||
192 | let (db, _source_root, file_id) = MockDatabase::with_single_file(&before); | ||
193 | let frange = FileRange { file_id, range }; | ||
194 | let assist = | ||
195 | AssistCtx::with_ctx(&db, frange, true, assist).expect("code action is not applicable"); | ||
196 | let action = match assist { | ||
197 | Assist::Unresolved(_) => unreachable!(), | ||
198 | Assist::Resolved(_, it) => it, | ||
199 | }; | ||
200 | |||
201 | let range = action.target.expect("expected target on action"); | ||
202 | assert_eq_text!(&before[range.start().to_usize()..range.end().to_usize()], target); | ||
203 | } | ||
204 | |||
166 | pub(crate) fn check_assist_not_applicable( | 205 | pub(crate) fn check_assist_not_applicable( |
167 | assist: fn(AssistCtx<MockDatabase>) -> Option<Assist>, | 206 | assist: fn(AssistCtx<MockDatabase>) -> Option<Assist>, |
168 | before: &str, | 207 | before: &str, |
@@ -181,10 +220,10 @@ mod tests { | |||
181 | use hir::mock::MockDatabase; | 220 | use hir::mock::MockDatabase; |
182 | use ra_syntax::TextRange; | 221 | use ra_syntax::TextRange; |
183 | use ra_db::FileRange; | 222 | use ra_db::FileRange; |
184 | use test_utils::extract_offset; | 223 | use test_utils::{extract_offset, extract_range}; |
185 | 224 | ||
186 | #[test] | 225 | #[test] |
187 | fn assist_order() { | 226 | fn assist_order_field_struct() { |
188 | let before = "struct Foo { <|>bar: u32 }"; | 227 | let before = "struct Foo { <|>bar: u32 }"; |
189 | let (before_cursor_pos, before) = extract_offset(before); | 228 | let (before_cursor_pos, before) = extract_offset(before); |
190 | let (db, _source_root, file_id) = MockDatabase::with_single_file(&before); | 229 | let (db, _source_root, file_id) = MockDatabase::with_single_file(&before); |
@@ -197,4 +236,25 @@ mod tests { | |||
197 | assert_eq!(assists.next().expect("expected assist").0.label, "add `#[derive]`"); | 236 | assert_eq!(assists.next().expect("expected assist").0.label, "add `#[derive]`"); |
198 | } | 237 | } |
199 | 238 | ||
239 | #[test] | ||
240 | fn assist_order_if_expr() { | ||
241 | let before = " | ||
242 | pub fn test_some_range(a: int) -> bool { | ||
243 | if let 2..6 = 5<|> { | ||
244 | true | ||
245 | } else { | ||
246 | false | ||
247 | } | ||
248 | }"; | ||
249 | let (before_cursor_pos, before) = extract_offset(before); | ||
250 | let (db, _source_root, file_id) = MockDatabase::with_single_file(&before); | ||
251 | let frange = | ||
252 | FileRange { file_id, range: TextRange::offset_len(before_cursor_pos, 0.into()) }; | ||
253 | let assists = super::assists(&db, frange); | ||
254 | let mut assists = assists.iter(); | ||
255 | |||
256 | assert_eq!(assists.next().expect("expected assist").0.label, "introduce variable"); | ||
257 | assert_eq!(assists.next().expect("expected assist").0.label, "replace with match"); | ||
258 | } | ||
259 | |||
200 | } | 260 | } |