diff options
Diffstat (limited to 'crates/ra_assists/src/lib.rs')
-rw-r--r-- | crates/ra_assists/src/lib.rs | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/crates/ra_assists/src/lib.rs b/crates/ra_assists/src/lib.rs index a00136da1..64bd87afb 100644 --- a/crates/ra_assists/src/lib.rs +++ b/crates/ra_assists/src/lib.rs | |||
@@ -17,9 +17,9 @@ mod doc_tests; | |||
17 | pub mod utils; | 17 | pub mod utils; |
18 | pub mod ast_transform; | 18 | pub mod ast_transform; |
19 | 19 | ||
20 | use ra_db::FileRange; | 20 | use ra_db::{FileId, FileRange}; |
21 | use ra_ide_db::RootDatabase; | 21 | use ra_ide_db::RootDatabase; |
22 | use ra_syntax::{TextRange, TextUnit}; | 22 | use ra_syntax::{TextRange, TextSize}; |
23 | use ra_text_edit::TextEdit; | 23 | use ra_text_edit::TextEdit; |
24 | 24 | ||
25 | pub(crate) use crate::assist_ctx::{Assist, AssistCtx, AssistHandler}; | 25 | pub(crate) use crate::assist_ctx::{Assist, AssistCtx, AssistHandler}; |
@@ -51,9 +51,10 @@ impl AssistLabel { | |||
51 | #[derive(Debug, Clone)] | 51 | #[derive(Debug, Clone)] |
52 | pub struct AssistAction { | 52 | pub struct AssistAction { |
53 | pub edit: TextEdit, | 53 | pub edit: TextEdit, |
54 | pub cursor_position: Option<TextUnit>, | 54 | pub cursor_position: Option<TextSize>, |
55 | // FIXME: This belongs to `AssistLabel` | 55 | // FIXME: This belongs to `AssistLabel` |
56 | pub target: Option<TextRange>, | 56 | pub target: Option<TextRange>, |
57 | pub file: AssistFile, | ||
57 | } | 58 | } |
58 | 59 | ||
59 | #[derive(Debug, Clone)] | 60 | #[derive(Debug, Clone)] |
@@ -63,6 +64,18 @@ pub struct ResolvedAssist { | |||
63 | pub action: AssistAction, | 64 | pub action: AssistAction, |
64 | } | 65 | } |
65 | 66 | ||
67 | #[derive(Debug, Clone, Copy)] | ||
68 | pub enum AssistFile { | ||
69 | CurrentFile, | ||
70 | TargetFile(FileId), | ||
71 | } | ||
72 | |||
73 | impl Default for AssistFile { | ||
74 | fn default() -> Self { | ||
75 | Self::CurrentFile | ||
76 | } | ||
77 | } | ||
78 | |||
66 | /// Return all the assists applicable at the given position. | 79 | /// Return all the assists applicable at the given position. |
67 | /// | 80 | /// |
68 | /// Assists are returned in the "unresolved" state, that is only labels are | 81 | /// Assists are returned in the "unresolved" state, that is only labels are |
@@ -91,7 +104,7 @@ pub fn resolved_assists(db: &RootDatabase, range: FileRange) -> Vec<ResolvedAssi | |||
91 | .flat_map(|it| it.0) | 104 | .flat_map(|it| it.0) |
92 | .map(|it| it.into_resolved().unwrap()) | 105 | .map(|it| it.into_resolved().unwrap()) |
93 | .collect::<Vec<_>>(); | 106 | .collect::<Vec<_>>(); |
94 | a.sort_by_key(|it| it.action.target.map_or(TextUnit::from(!0u32), |it| it.len())); | 107 | a.sort_by_key(|it| it.action.target.map_or(TextSize::from(!0u32), |it| it.len())); |
95 | a | 108 | a |
96 | } | 109 | } |
97 | 110 | ||
@@ -184,7 +197,7 @@ mod helpers { | |||
184 | use ra_ide_db::{symbol_index::SymbolsDatabase, RootDatabase}; | 197 | use ra_ide_db::{symbol_index::SymbolsDatabase, RootDatabase}; |
185 | use test_utils::{add_cursor, assert_eq_text, extract_range_or_offset, RangeOrOffset}; | 198 | use test_utils::{add_cursor, assert_eq_text, extract_range_or_offset, RangeOrOffset}; |
186 | 199 | ||
187 | use crate::{AssistCtx, AssistHandler}; | 200 | use crate::{AssistCtx, AssistFile, AssistHandler}; |
188 | use hir::Semantics; | 201 | use hir::Semantics; |
189 | 202 | ||
190 | pub(crate) fn with_single_file(text: &str) -> (RootDatabase, FileId) { | 203 | pub(crate) fn with_single_file(text: &str) -> (RootDatabase, FileId) { |
@@ -246,7 +259,13 @@ mod helpers { | |||
246 | (Some(assist), ExpectedResult::After(after)) => { | 259 | (Some(assist), ExpectedResult::After(after)) => { |
247 | let action = assist.0[0].action.clone().unwrap(); | 260 | let action = assist.0[0].action.clone().unwrap(); |
248 | 261 | ||
249 | let mut actual = action.edit.apply(&text_without_caret); | 262 | let assisted_file_text = if let AssistFile::TargetFile(file_id) = action.file { |
263 | db.file_text(file_id).as_ref().to_owned() | ||
264 | } else { | ||
265 | text_without_caret | ||
266 | }; | ||
267 | |||
268 | let mut actual = action.edit.apply(&assisted_file_text); | ||
250 | match action.cursor_position { | 269 | match action.cursor_position { |
251 | None => { | 270 | None => { |
252 | if let RangeOrOffset::Offset(before_cursor_pos) = range_or_offset { | 271 | if let RangeOrOffset::Offset(before_cursor_pos) = range_or_offset { |
@@ -289,8 +308,7 @@ mod tests { | |||
289 | let before = "struct Foo { <|>bar: u32 }"; | 308 | let before = "struct Foo { <|>bar: u32 }"; |
290 | let (before_cursor_pos, before) = extract_offset(before); | 309 | let (before_cursor_pos, before) = extract_offset(before); |
291 | let (db, file_id) = helpers::with_single_file(&before); | 310 | let (db, file_id) = helpers::with_single_file(&before); |
292 | let frange = | 311 | let frange = FileRange { file_id, range: TextRange::empty(before_cursor_pos) }; |
293 | FileRange { file_id, range: TextRange::offset_len(before_cursor_pos, 0.into()) }; | ||
294 | let assists = resolved_assists(&db, frange); | 312 | let assists = resolved_assists(&db, frange); |
295 | let mut assists = assists.iter(); | 313 | let mut assists = assists.iter(); |
296 | 314 | ||