diff options
-rw-r--r-- | crates/ra_analysis/src/completion.rs | 23 | ||||
-rw-r--r-- | crates/ra_analysis/src/completion/completion_item.rs | 44 | ||||
-rw-r--r-- | crates/ra_analysis/src/completion/reference_completion.rs | 8 |
3 files changed, 54 insertions, 21 deletions
diff --git a/crates/ra_analysis/src/completion.rs b/crates/ra_analysis/src/completion.rs index f480af611..ed1b6dd0c 100644 --- a/crates/ra_analysis/src/completion.rs +++ b/crates/ra_analysis/src/completion.rs | |||
@@ -1,3 +1,4 @@ | |||
1 | mod completion_item; | ||
1 | mod reference_completion; | 2 | mod reference_completion; |
2 | 3 | ||
3 | use ra_editor::find_node_at_offset; | 4 | use ra_editor::find_node_at_offset; |
@@ -17,15 +18,7 @@ use crate::{ | |||
17 | Cancelable, FilePosition | 18 | Cancelable, FilePosition |
18 | }; | 19 | }; |
19 | 20 | ||
20 | #[derive(Debug)] | 21 | pub use crate::completion::completion_item::CompletionItem; |
21 | pub struct CompletionItem { | ||
22 | /// What user sees in pop-up | ||
23 | pub label: String, | ||
24 | /// What string is used for filtering, defaults to label | ||
25 | pub lookup: Option<String>, | ||
26 | /// What is inserted, defaults to label | ||
27 | pub snippet: Option<String>, | ||
28 | } | ||
29 | 22 | ||
30 | pub(crate) fn completions( | 23 | pub(crate) fn completions( |
31 | db: &db::RootDatabase, | 24 | db: &db::RootDatabase, |
@@ -63,6 +56,10 @@ pub(crate) fn completions( | |||
63 | Ok(res) | 56 | Ok(res) |
64 | } | 57 | } |
65 | 58 | ||
59 | /// Complete repeated parametes, both name and type. For example, if all | ||
60 | /// functions in a file have a `spam: &mut Spam` parameter, a completion with | ||
61 | /// `spam: &mut Spam` insert text/label and `spam` lookup string will be | ||
62 | /// suggested. | ||
66 | fn param_completions(ctx: SyntaxNodeRef, acc: &mut Vec<CompletionItem>) { | 63 | fn param_completions(ctx: SyntaxNodeRef, acc: &mut Vec<CompletionItem>) { |
67 | let mut params = FxHashMap::default(); | 64 | let mut params = FxHashMap::default(); |
68 | for node in ctx.ancestors() { | 65 | for node in ctx.ancestors() { |
@@ -81,13 +78,7 @@ fn param_completions(ctx: SyntaxNodeRef, acc: &mut Vec<CompletionItem>) { | |||
81 | Some((label, lookup)) | 78 | Some((label, lookup)) |
82 | } | 79 | } |
83 | }) | 80 | }) |
84 | .for_each(|(label, lookup)| { | 81 | .for_each(|(label, lookup)| CompletionItem::new(label).lookup_by(lookup).add_to(acc)); |
85 | acc.push(CompletionItem { | ||
86 | label, | ||
87 | lookup: Some(lookup), | ||
88 | snippet: None, | ||
89 | }) | ||
90 | }); | ||
91 | 82 | ||
92 | fn process<'a, N: ast::FnDefOwner<'a>>( | 83 | fn process<'a, N: ast::FnDefOwner<'a>>( |
93 | node: N, | 84 | node: N, |
diff --git a/crates/ra_analysis/src/completion/completion_item.rs b/crates/ra_analysis/src/completion/completion_item.rs new file mode 100644 index 000000000..309b0108d --- /dev/null +++ b/crates/ra_analysis/src/completion/completion_item.rs | |||
@@ -0,0 +1,44 @@ | |||
1 | #[derive(Debug)] | ||
2 | pub struct CompletionItem { | ||
3 | /// What user sees in pop-up in the UI. | ||
4 | pub label: String, | ||
5 | /// What string is used for filtering, defaults to label. | ||
6 | pub lookup: Option<String>, | ||
7 | /// What is inserted, defaults to label. | ||
8 | pub snippet: Option<String>, | ||
9 | } | ||
10 | |||
11 | impl CompletionItem { | ||
12 | pub(crate) fn new(label: impl Into<String>) -> Builder { | ||
13 | let label = label.into(); | ||
14 | Builder { | ||
15 | label, | ||
16 | lookup: None, | ||
17 | snippet: None, | ||
18 | } | ||
19 | } | ||
20 | } | ||
21 | |||
22 | pub(crate) struct Builder { | ||
23 | label: String, | ||
24 | lookup: Option<String>, | ||
25 | snippet: Option<String>, | ||
26 | } | ||
27 | |||
28 | impl Builder { | ||
29 | pub fn add_to(self, acc: &mut Vec<CompletionItem>) { | ||
30 | acc.push(self.build()) | ||
31 | } | ||
32 | |||
33 | pub fn build(self) -> CompletionItem { | ||
34 | CompletionItem { | ||
35 | label: self.label, | ||
36 | lookup: self.lookup, | ||
37 | snippet: self.snippet, | ||
38 | } | ||
39 | } | ||
40 | pub fn lookup_by(mut self, lookup: impl Into<String>) -> Builder { | ||
41 | self.lookup = Some(lookup.into()); | ||
42 | self | ||
43 | } | ||
44 | } | ||
diff --git a/crates/ra_analysis/src/completion/reference_completion.rs b/crates/ra_analysis/src/completion/reference_completion.rs index f483ed045..457ca13cc 100644 --- a/crates/ra_analysis/src/completion/reference_completion.rs +++ b/crates/ra_analysis/src/completion/reference_completion.rs | |||
@@ -6,11 +6,9 @@ use ra_syntax::{ | |||
6 | ast::{self, LoopBodyOwner}, | 6 | ast::{self, LoopBodyOwner}, |
7 | SyntaxKind::*, | 7 | SyntaxKind::*, |
8 | }; | 8 | }; |
9 | use hir::{ | 9 | use hir::{ |
10 | self, | 10 | self, |
11 | FnScopes, | 11 | FnScopes, Def, Path |
12 | Def, | ||
13 | Path, | ||
14 | }; | 12 | }; |
15 | 13 | ||
16 | use crate::{ | 14 | use crate::{ |