diff options
author | uHOOCCOOHu <[email protected]> | 2019-09-10 06:32:47 +0100 |
---|---|---|
committer | uHOOCCOOHu <[email protected]> | 2019-09-10 06:32:47 +0100 |
commit | 7de9537cccc7a6338bcd9c892a1fdb4a6008dc1a (patch) | |
tree | 8c6a25f27708815935511897071c749ecd6111e3 /crates/ra_ide_api/src/completion/presentation.rs | |
parent | e2ebb467bdf3ebb7d29260adb95c56594c6db282 (diff) |
Support completion for macros
Diffstat (limited to 'crates/ra_ide_api/src/completion/presentation.rs')
-rw-r--r-- | crates/ra_ide_api/src/completion/presentation.rs | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/crates/ra_ide_api/src/completion/presentation.rs b/crates/ra_ide_api/src/completion/presentation.rs index db7e8348e..1b706bb13 100644 --- a/crates/ra_ide_api/src/completion/presentation.rs +++ b/crates/ra_ide_api/src/completion/presentation.rs | |||
@@ -8,7 +8,7 @@ use crate::completion::{ | |||
8 | CompletionContext, CompletionItem, CompletionItemKind, CompletionKind, Completions, | 8 | CompletionContext, CompletionItem, CompletionItemKind, CompletionKind, Completions, |
9 | }; | 9 | }; |
10 | 10 | ||
11 | use crate::display::{const_label, function_label, type_label}; | 11 | use crate::display::{const_label, function_label, macro_label, type_label}; |
12 | 12 | ||
13 | impl Completions { | 13 | impl Completions { |
14 | pub(crate) fn add_field( | 14 | pub(crate) fn add_field( |
@@ -43,8 +43,14 @@ impl Completions { | |||
43 | ) { | 43 | ) { |
44 | use hir::ModuleDef::*; | 44 | use hir::ModuleDef::*; |
45 | 45 | ||
46 | if let Some(macro_) = resolution.get_macros() { | ||
47 | self.add_macro(ctx, Some(local_name.clone()), macro_); | ||
48 | } | ||
49 | |||
46 | let def = resolution.as_ref().take_types().or_else(|| resolution.as_ref().take_values()); | 50 | let def = resolution.as_ref().take_types().or_else(|| resolution.as_ref().take_values()); |
47 | let def = match def { | 51 | let def = match def { |
52 | // Only insert once if it is just a macro name | ||
53 | None if resolution.get_macros().is_some() => return, | ||
48 | None => { | 54 | None => { |
49 | self.add(CompletionItem::new( | 55 | self.add(CompletionItem::new( |
50 | CompletionKind::Reference, | 56 | CompletionKind::Reference, |
@@ -98,6 +104,22 @@ impl Completions { | |||
98 | self.add_function_with_name(ctx, None, func) | 104 | self.add_function_with_name(ctx, None, func) |
99 | } | 105 | } |
100 | 106 | ||
107 | fn add_macro(&mut self, ctx: &CompletionContext, name: Option<String>, macro_: hir::MacroDef) { | ||
108 | let ast_node = macro_.source(ctx.db).ast; | ||
109 | if let Some(name) = name { | ||
110 | let detail = macro_label(&ast_node); | ||
111 | |||
112 | let builder = | ||
113 | CompletionItem::new(CompletionKind::Reference, ctx.source_range(), name.clone()) | ||
114 | .kind(CompletionItemKind::Macro) | ||
115 | .set_documentation(macro_.docs(ctx.db)) | ||
116 | .detail(detail) | ||
117 | .insert_snippet(format!("{}!", name)); | ||
118 | |||
119 | self.add(builder); | ||
120 | } | ||
121 | } | ||
122 | |||
101 | fn add_function_with_name( | 123 | fn add_function_with_name( |
102 | &mut self, | 124 | &mut self, |
103 | ctx: &CompletionContext, | 125 | ctx: &CompletionContext, |