diff options
Diffstat (limited to 'crates/ra_ide/src')
-rw-r--r-- | crates/ra_ide/src/assists.rs | 42 | ||||
-rw-r--r-- | crates/ra_ide/src/completion/completion_item.rs | 3 | ||||
-rw-r--r-- | crates/ra_ide/src/display/function_signature.rs | 8 | ||||
-rw-r--r-- | crates/ra_ide/src/hover.rs | 49 | ||||
-rw-r--r-- | crates/ra_ide/src/lib.rs | 31 | ||||
-rw-r--r-- | crates/ra_ide/src/references/rename.rs | 62 |
6 files changed, 140 insertions, 55 deletions
diff --git a/crates/ra_ide/src/assists.rs b/crates/ra_ide/src/assists.rs deleted file mode 100644 index 389339a03..000000000 --- a/crates/ra_ide/src/assists.rs +++ /dev/null | |||
@@ -1,42 +0,0 @@ | |||
1 | //! FIXME: write short doc here | ||
2 | |||
3 | use ra_assists::{resolved_assists, AssistAction}; | ||
4 | use ra_db::{FilePosition, FileRange}; | ||
5 | use ra_ide_db::RootDatabase; | ||
6 | |||
7 | use crate::{FileId, SourceChange, SourceFileEdit}; | ||
8 | |||
9 | pub use ra_assists::AssistId; | ||
10 | |||
11 | #[derive(Debug)] | ||
12 | pub struct Assist { | ||
13 | pub id: AssistId, | ||
14 | pub label: String, | ||
15 | pub group_label: Option<String>, | ||
16 | pub source_change: SourceChange, | ||
17 | } | ||
18 | |||
19 | pub(crate) fn assists(db: &RootDatabase, frange: FileRange) -> Vec<Assist> { | ||
20 | resolved_assists(db, frange) | ||
21 | .into_iter() | ||
22 | .map(|assist| { | ||
23 | let file_id = frange.file_id; | ||
24 | Assist { | ||
25 | id: assist.label.id, | ||
26 | label: assist.label.label.clone(), | ||
27 | group_label: assist.label.group.map(|it| it.0), | ||
28 | source_change: action_to_edit(assist.action, file_id, assist.label.label.clone()), | ||
29 | } | ||
30 | }) | ||
31 | .collect() | ||
32 | } | ||
33 | |||
34 | fn action_to_edit(action: AssistAction, file_id: FileId, label: String) -> SourceChange { | ||
35 | let file_id = match action.file { | ||
36 | ra_assists::AssistFile::TargetFile(it) => it, | ||
37 | _ => file_id, | ||
38 | }; | ||
39 | let file_edit = SourceFileEdit { file_id, edit: action.edit }; | ||
40 | SourceChange::source_file_edit(label, file_edit) | ||
41 | .with_cursor_opt(action.cursor_position.map(|offset| FilePosition { offset, file_id })) | ||
42 | } | ||
diff --git a/crates/ra_ide/src/completion/completion_item.rs b/crates/ra_ide/src/completion/completion_item.rs index 383b23ac4..6021f7279 100644 --- a/crates/ra_ide/src/completion/completion_item.rs +++ b/crates/ra_ide/src/completion/completion_item.rs | |||
@@ -2,11 +2,12 @@ | |||
2 | 2 | ||
3 | use std::fmt; | 3 | use std::fmt; |
4 | 4 | ||
5 | use super::completion_config::SnippetCap; | ||
6 | use hir::Documentation; | 5 | use hir::Documentation; |
7 | use ra_syntax::TextRange; | 6 | use ra_syntax::TextRange; |
8 | use ra_text_edit::TextEdit; | 7 | use ra_text_edit::TextEdit; |
9 | 8 | ||
9 | use crate::completion::completion_config::SnippetCap; | ||
10 | |||
10 | /// `CompletionItem` describes a single completion variant in the editor pop-up. | 11 | /// `CompletionItem` describes a single completion variant in the editor pop-up. |
11 | /// It is basically a POD with various properties. To construct a | 12 | /// It is basically a POD with various properties. To construct a |
12 | /// `CompletionItem`, use `new` method and the `Builder` struct. | 13 | /// `CompletionItem`, use `new` method and the `Builder` struct. |
diff --git a/crates/ra_ide/src/display/function_signature.rs b/crates/ra_ide/src/display/function_signature.rs index db3907fe6..f16d42276 100644 --- a/crates/ra_ide/src/display/function_signature.rs +++ b/crates/ra_ide/src/display/function_signature.rs | |||
@@ -1,5 +1,7 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! FIXME: write short doc here |
2 | 2 | ||
3 | // FIXME: this modules relies on strings and AST way too much, and it should be | ||
4 | // rewritten (matklad 2020-05-07) | ||
3 | use std::{ | 5 | use std::{ |
4 | convert::From, | 6 | convert::From, |
5 | fmt::{self, Display}, | 7 | fmt::{self, Display}, |
@@ -202,7 +204,11 @@ impl From<&'_ ast::FnDef> for FunctionSignature { | |||
202 | 204 | ||
203 | res.extend(param_list.params().map(|param| param.syntax().text().to_string())); | 205 | res.extend(param_list.params().map(|param| param.syntax().text().to_string())); |
204 | res_types.extend(param_list.params().map(|param| { | 206 | res_types.extend(param_list.params().map(|param| { |
205 | param.syntax().text().to_string().split(':').nth(1).unwrap()[1..].to_string() | 207 | let param_text = param.syntax().text().to_string(); |
208 | match param_text.split(':').nth(1) { | ||
209 | Some(it) => it[1..].to_string(), | ||
210 | None => param_text, | ||
211 | } | ||
206 | })); | 212 | })); |
207 | } | 213 | } |
208 | (has_self_param, res, res_types) | 214 | (has_self_param, res, res_types) |
diff --git a/crates/ra_ide/src/hover.rs b/crates/ra_ide/src/hover.rs index 54d318858..06d4f1c63 100644 --- a/crates/ra_ide/src/hover.rs +++ b/crates/ra_ide/src/hover.rs | |||
@@ -143,7 +143,7 @@ fn hover_text_from_name_kind(db: &RootDatabase, def: Definition) -> Option<Strin | |||
143 | ModuleDef::TypeAlias(it) => from_def_source(db, it, mod_path), | 143 | ModuleDef::TypeAlias(it) => from_def_source(db, it, mod_path), |
144 | ModuleDef::BuiltinType(it) => Some(it.to_string()), | 144 | ModuleDef::BuiltinType(it) => Some(it.to_string()), |
145 | }, | 145 | }, |
146 | Definition::Local(it) => Some(rust_code_markup(&it.ty(db).display_truncated(db, None))), | 146 | Definition::Local(it) => Some(rust_code_markup(&it.ty(db).display(db))), |
147 | Definition::TypeParam(_) | Definition::SelfType(_) => { | 147 | Definition::TypeParam(_) | Definition::SelfType(_) => { |
148 | // FIXME: Hover for generic param | 148 | // FIXME: Hover for generic param |
149 | None | 149 | None |
@@ -208,7 +208,7 @@ pub(crate) fn hover(db: &RootDatabase, position: FilePosition) -> Option<RangeIn | |||
208 | } | 208 | } |
209 | }?; | 209 | }?; |
210 | 210 | ||
211 | res.extend(Some(rust_code_markup(&ty.display_truncated(db, None)))); | 211 | res.extend(Some(rust_code_markup(&ty.display(db)))); |
212 | let range = sema.original_range(&node).range; | 212 | let range = sema.original_range(&node).range; |
213 | Some(RangeInfo::new(range, res)) | 213 | Some(RangeInfo::new(range, res)) |
214 | } | 214 | } |
@@ -280,6 +280,47 @@ mod tests { | |||
280 | } | 280 | } |
281 | 281 | ||
282 | #[test] | 282 | #[test] |
283 | fn hover_shows_long_type_of_an_expression() { | ||
284 | check_hover_result( | ||
285 | r#" | ||
286 | //- /main.rs | ||
287 | struct Scan<A, B, C> { | ||
288 | a: A, | ||
289 | b: B, | ||
290 | c: C, | ||
291 | } | ||
292 | |||
293 | struct FakeIter<I> { | ||
294 | inner: I, | ||
295 | } | ||
296 | |||
297 | struct OtherStruct<T> { | ||
298 | i: T, | ||
299 | } | ||
300 | |||
301 | enum FakeOption<T> { | ||
302 | Some(T), | ||
303 | None, | ||
304 | } | ||
305 | |||
306 | fn scan<A, B, C>(a: A, b: B, c: C) -> FakeIter<Scan<OtherStruct<A>, B, C>> { | ||
307 | FakeIter { inner: Scan { a, b, c } } | ||
308 | } | ||
309 | |||
310 | fn main() { | ||
311 | let num: i32 = 55; | ||
312 | let closure = |memo: &mut u32, value: &u32, _another: &mut u32| -> FakeOption<u32> { | ||
313 | FakeOption::Some(*memo + value) | ||
314 | }; | ||
315 | let number = 5u32; | ||
316 | let mut iter<|> = scan(OtherStruct { i: num }, closure, number); | ||
317 | } | ||
318 | "#, | ||
319 | &["FakeIter<Scan<OtherStruct<OtherStruct<i32>>, |&mut u32, &u32, &mut u32| -> FakeOption<u32>, u32>>"], | ||
320 | ); | ||
321 | } | ||
322 | |||
323 | #[test] | ||
283 | fn hover_shows_fn_signature() { | 324 | fn hover_shows_fn_signature() { |
284 | // Single file with result | 325 | // Single file with result |
285 | check_hover_result( | 326 | check_hover_result( |
@@ -405,7 +446,7 @@ mod tests { | |||
405 | } | 446 | } |
406 | 447 | ||
407 | #[test] | 448 | #[test] |
408 | fn hover_omits_default_generic_types() { | 449 | fn hover_default_generic_types() { |
409 | check_hover_result( | 450 | check_hover_result( |
410 | r#" | 451 | r#" |
411 | //- /main.rs | 452 | //- /main.rs |
@@ -417,7 +458,7 @@ struct Test<K, T = u8> { | |||
417 | fn main() { | 458 | fn main() { |
418 | let zz<|> = Test { t: 23, k: 33 }; | 459 | let zz<|> = Test { t: 23, k: 33 }; |
419 | }"#, | 460 | }"#, |
420 | &["Test<i32>"], | 461 | &["Test<i32, u8>"], |
421 | ); | 462 | ); |
422 | } | 463 | } |
423 | 464 | ||
diff --git a/crates/ra_ide/src/lib.rs b/crates/ra_ide/src/lib.rs index 4ed02f60e..915199bd8 100644 --- a/crates/ra_ide/src/lib.rs +++ b/crates/ra_ide/src/lib.rs | |||
@@ -31,7 +31,6 @@ mod syntax_highlighting; | |||
31 | mod parent_module; | 31 | mod parent_module; |
32 | mod references; | 32 | mod references; |
33 | mod impls; | 33 | mod impls; |
34 | mod assists; | ||
35 | mod diagnostics; | 34 | mod diagnostics; |
36 | mod syntax_tree; | 35 | mod syntax_tree; |
37 | mod folding_ranges; | 36 | mod folding_ranges; |
@@ -64,7 +63,6 @@ use ra_syntax::{SourceFile, TextRange, TextSize}; | |||
64 | use crate::display::ToNav; | 63 | use crate::display::ToNav; |
65 | 64 | ||
66 | pub use crate::{ | 65 | pub use crate::{ |
67 | assists::{Assist, AssistId}, | ||
68 | call_hierarchy::CallItem, | 66 | call_hierarchy::CallItem, |
69 | completion::{ | 67 | completion::{ |
70 | CompletionConfig, CompletionItem, CompletionItemKind, CompletionScore, InsertTextFormat, | 68 | CompletionConfig, CompletionItem, CompletionItemKind, CompletionScore, InsertTextFormat, |
@@ -84,6 +82,7 @@ pub use crate::{ | |||
84 | }; | 82 | }; |
85 | 83 | ||
86 | pub use hir::Documentation; | 84 | pub use hir::Documentation; |
85 | pub use ra_assists::AssistId; | ||
87 | pub use ra_db::{ | 86 | pub use ra_db::{ |
88 | Canceled, CrateGraph, CrateId, Edition, FileId, FilePosition, FileRange, SourceRootId, | 87 | Canceled, CrateGraph, CrateId, Edition, FileId, FilePosition, FileRange, SourceRootId, |
89 | }; | 88 | }; |
@@ -134,10 +133,12 @@ pub struct AnalysisHost { | |||
134 | db: RootDatabase, | 133 | db: RootDatabase, |
135 | } | 134 | } |
136 | 135 | ||
137 | impl Default for AnalysisHost { | 136 | #[derive(Debug)] |
138 | fn default() -> AnalysisHost { | 137 | pub struct Assist { |
139 | AnalysisHost::new(None) | 138 | pub id: AssistId, |
140 | } | 139 | pub label: String, |
140 | pub group_label: Option<String>, | ||
141 | pub source_change: SourceChange, | ||
141 | } | 142 | } |
142 | 143 | ||
143 | impl AnalysisHost { | 144 | impl AnalysisHost { |
@@ -187,6 +188,12 @@ impl AnalysisHost { | |||
187 | } | 188 | } |
188 | } | 189 | } |
189 | 190 | ||
191 | impl Default for AnalysisHost { | ||
192 | fn default() -> AnalysisHost { | ||
193 | AnalysisHost::new(None) | ||
194 | } | ||
195 | } | ||
196 | |||
190 | /// Analysis is a snapshot of a world state at a moment in time. It is the main | 197 | /// Analysis is a snapshot of a world state at a moment in time. It is the main |
191 | /// entry point for asking semantic information about the world. When the world | 198 | /// entry point for asking semantic information about the world. When the world |
192 | /// state is advanced using `AnalysisHost::apply_change` method, all existing | 199 | /// state is advanced using `AnalysisHost::apply_change` method, all existing |
@@ -464,7 +471,17 @@ impl Analysis { | |||
464 | /// Computes assists (aka code actions aka intentions) for the given | 471 | /// Computes assists (aka code actions aka intentions) for the given |
465 | /// position. | 472 | /// position. |
466 | pub fn assists(&self, frange: FileRange) -> Cancelable<Vec<Assist>> { | 473 | pub fn assists(&self, frange: FileRange) -> Cancelable<Vec<Assist>> { |
467 | self.with_db(|db| assists::assists(db, frange)) | 474 | self.with_db(|db| { |
475 | ra_assists::Assist::resolved(db, frange) | ||
476 | .into_iter() | ||
477 | .map(|assist| Assist { | ||
478 | id: assist.assist.id, | ||
479 | label: assist.assist.label, | ||
480 | group_label: assist.assist.group.map(|it| it.0), | ||
481 | source_change: assist.source_change, | ||
482 | }) | ||
483 | .collect() | ||
484 | }) | ||
468 | } | 485 | } |
469 | 486 | ||
470 | /// Computes the set of diagnostics for the given file. | 487 | /// Computes the set of diagnostics for the given file. |
diff --git a/crates/ra_ide/src/references/rename.rs b/crates/ra_ide/src/references/rename.rs index 0398d53bc..2cbb82c1a 100644 --- a/crates/ra_ide/src/references/rename.rs +++ b/crates/ra_ide/src/references/rename.rs | |||
@@ -712,6 +712,68 @@ mod tests { | |||
712 | "###); | 712 | "###); |
713 | } | 713 | } |
714 | 714 | ||
715 | #[test] | ||
716 | fn test_enum_variant_from_module_1() { | ||
717 | test_rename( | ||
718 | r#" | ||
719 | mod foo { | ||
720 | pub enum Foo { | ||
721 | Bar<|>, | ||
722 | } | ||
723 | } | ||
724 | |||
725 | fn func(f: foo::Foo) { | ||
726 | match f { | ||
727 | foo::Foo::Bar => {} | ||
728 | } | ||
729 | } | ||
730 | "#, | ||
731 | "Baz", | ||
732 | r#" | ||
733 | mod foo { | ||
734 | pub enum Foo { | ||
735 | Baz, | ||
736 | } | ||
737 | } | ||
738 | |||
739 | fn func(f: foo::Foo) { | ||
740 | match f { | ||
741 | foo::Foo::Baz => {} | ||
742 | } | ||
743 | } | ||
744 | "#, | ||
745 | ); | ||
746 | } | ||
747 | |||
748 | #[test] | ||
749 | fn test_enum_variant_from_module_2() { | ||
750 | test_rename( | ||
751 | r#" | ||
752 | mod foo { | ||
753 | pub struct Foo { | ||
754 | pub bar<|>: uint, | ||
755 | } | ||
756 | } | ||
757 | |||
758 | fn foo(f: foo::Foo) { | ||
759 | let _ = f.bar; | ||
760 | } | ||
761 | "#, | ||
762 | "baz", | ||
763 | r#" | ||
764 | mod foo { | ||
765 | pub struct Foo { | ||
766 | pub baz: uint, | ||
767 | } | ||
768 | } | ||
769 | |||
770 | fn foo(f: foo::Foo) { | ||
771 | let _ = f.baz; | ||
772 | } | ||
773 | "#, | ||
774 | ); | ||
775 | } | ||
776 | |||
715 | fn test_rename(text: &str, new_name: &str, expected: &str) { | 777 | fn test_rename(text: &str, new_name: &str, expected: &str) { |
716 | let (analysis, position) = single_file_with_position(text); | 778 | let (analysis, position) = single_file_with_position(text); |
717 | let source_change = analysis.rename(position, new_name).unwrap(); | 779 | let source_change = analysis.rename(position, new_name).unwrap(); |