aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_assists/src/lib.rs')
-rw-r--r--crates/ra_assists/src/lib.rs66
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}