aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src/completion/presentation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide_api/src/completion/presentation.rs')
-rw-r--r--crates/ra_ide_api/src/completion/presentation.rs95
1 files changed, 58 insertions, 37 deletions
diff --git a/crates/ra_ide_api/src/completion/presentation.rs b/crates/ra_ide_api/src/completion/presentation.rs
index 95bbd34b7..31b887492 100644
--- a/crates/ra_ide_api/src/completion/presentation.rs
+++ b/crates/ra_ide_api/src/completion/presentation.rs
@@ -1,5 +1,5 @@
1//! This modules takes care of rendering various defenitions as completion items. 1//! This modules takes care of rendering various definitions as completion items.
2use hir::{Docs, HasSource, HirDisplay, PerNs, Resolution, Ty, TypeWalk}; 2use hir::{Docs, HasSource, HirDisplay, ScopeDef, Ty, TypeWalk};
3use join_to_string::join; 3use join_to_string::join;
4use ra_syntax::ast::NameOwner; 4use ra_syntax::ast::NameOwner;
5use test_utils::tested_by; 5use test_utils::tested_by;
@@ -39,61 +39,77 @@ impl Completions {
39 &mut self, 39 &mut self,
40 ctx: &CompletionContext, 40 ctx: &CompletionContext,
41 local_name: String, 41 local_name: String,
42 resolution: &PerNs<Resolution>, 42 resolution: &ScopeDef,
43 ) { 43 ) {
44 use hir::ModuleDef::*; 44 use hir::ModuleDef::*;
45 45
46 if let Some(macro_) = resolution.get_macros() { 46 // if let Some(macro_) = resolution.get_macros() {
47 self.add_macro(ctx, Some(local_name.clone()), macro_); 47 // self.add_macro(ctx, Some(local_name.clone()), macro_);
48 } 48 // }
49 49
50 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());
51 let def = match def { 51 // let def = match def {
52 // Only insert once if it is just a macro name 52 // // Only insert once if it is just a macro name
53 None if resolution.get_macros().is_some() => return, 53 // None if resolution.get_macros().is_some() => return,
54 None => { 54 // None => {
55 self.add(CompletionItem::new( 55 // self.add(CompletionItem::new(
56 CompletionKind::Reference, 56 // CompletionKind::Reference,
57 ctx.source_range(), 57 // ctx.source_range(),
58 local_name, 58 // local_name,
59 )); 59 // ));
60 return; 60 // return;
61 } 61 // }
62 Some(it) => it, 62 // Some(it) => it,
63 }; 63 // };
64 let mut completion_kind = CompletionKind::Reference; 64 let mut completion_kind = CompletionKind::Reference;
65 let (kind, docs) = match def { 65 let (kind, docs) = match resolution {
66 Resolution::Def(Module(it)) => (CompletionItemKind::Module, it.docs(ctx.db)), 66 ScopeDef::ModuleDef(Module(it)) => (CompletionItemKind::Module, it.docs(ctx.db)),
67 Resolution::Def(Function(func)) => { 67 ScopeDef::ModuleDef(Function(func)) => {
68 return self.add_function_with_name(ctx, Some(local_name), *func); 68 return self.add_function_with_name(ctx, Some(local_name), *func);
69 } 69 }
70 Resolution::Def(Adt(hir::Adt::Struct(it))) => { 70 ScopeDef::ModuleDef(Adt(hir::Adt::Struct(it))) => {
71 (CompletionItemKind::Struct, it.docs(ctx.db)) 71 (CompletionItemKind::Struct, it.docs(ctx.db))
72 } 72 }
73 Resolution::Def(Adt(hir::Adt::Union(it))) => { 73 ScopeDef::ModuleDef(Adt(hir::Adt::Union(it))) => {
74 (CompletionItemKind::Struct, it.docs(ctx.db)) 74 (CompletionItemKind::Struct, it.docs(ctx.db))
75 } 75 }
76 Resolution::Def(Adt(hir::Adt::Enum(it))) => (CompletionItemKind::Enum, it.docs(ctx.db)), 76 ScopeDef::ModuleDef(Adt(hir::Adt::Enum(it))) => {
77 Resolution::Def(EnumVariant(it)) => (CompletionItemKind::EnumVariant, it.docs(ctx.db)), 77 (CompletionItemKind::Enum, it.docs(ctx.db))
78 Resolution::Def(Const(it)) => (CompletionItemKind::Const, it.docs(ctx.db)), 78 }
79 Resolution::Def(Static(it)) => (CompletionItemKind::Static, it.docs(ctx.db)), 79 ScopeDef::ModuleDef(EnumVariant(it)) => {
80 Resolution::Def(Trait(it)) => (CompletionItemKind::Trait, it.docs(ctx.db)), 80 (CompletionItemKind::EnumVariant, it.docs(ctx.db))
81 Resolution::Def(TypeAlias(it)) => (CompletionItemKind::TypeAlias, it.docs(ctx.db)), 81 }
82 Resolution::Def(BuiltinType(..)) => { 82 ScopeDef::ModuleDef(Const(it)) => (CompletionItemKind::Const, it.docs(ctx.db)),
83 ScopeDef::ModuleDef(Static(it)) => (CompletionItemKind::Static, it.docs(ctx.db)),
84 ScopeDef::ModuleDef(Trait(it)) => (CompletionItemKind::Trait, it.docs(ctx.db)),
85 ScopeDef::ModuleDef(TypeAlias(it)) => (CompletionItemKind::TypeAlias, it.docs(ctx.db)),
86 ScopeDef::ModuleDef(BuiltinType(..)) => {
83 completion_kind = CompletionKind::BuiltinType; 87 completion_kind = CompletionKind::BuiltinType;
84 (CompletionItemKind::BuiltinType, None) 88 (CompletionItemKind::BuiltinType, None)
85 } 89 }
86 Resolution::GenericParam(..) => (CompletionItemKind::TypeParam, None), 90 ScopeDef::GenericParam(..) => (CompletionItemKind::TypeParam, None),
87 Resolution::LocalBinding(..) => (CompletionItemKind::Binding, None), 91 ScopeDef::LocalBinding(..) => (CompletionItemKind::Binding, None),
88 Resolution::SelfType(..) => ( 92 ScopeDef::SelfType(..) => (
89 CompletionItemKind::TypeParam, // (does this need its own kind?) 93 CompletionItemKind::TypeParam, // (does this need its own kind?)
90 None, 94 None,
91 ), 95 ),
96 ScopeDef::MacroDef(mac) => {
97 self.add_macro(ctx, Some(local_name.clone()), *mac);
98 return;
99 }
100 ScopeDef::Unknown => {
101 self.add(CompletionItem::new(
102 CompletionKind::Reference,
103 ctx.source_range(),
104 local_name,
105 ));
106 return;
107 }
92 }; 108 };
93 109
94 let mut completion_item = 110 let mut completion_item =
95 CompletionItem::new(completion_kind, ctx.source_range(), local_name); 111 CompletionItem::new(completion_kind, ctx.source_range(), local_name);
96 if let Resolution::LocalBinding(pat_id) = def { 112 if let ScopeDef::LocalBinding(pat_id) = resolution {
97 let ty = ctx 113 let ty = ctx
98 .analyzer 114 .analyzer
99 .type_of_pat_by_id(ctx.db, pat_id.clone()) 115 .type_of_pat_by_id(ctx.db, pat_id.clone())
@@ -108,7 +124,12 @@ impl Completions {
108 self.add_function_with_name(ctx, None, func) 124 self.add_function_with_name(ctx, None, func)
109 } 125 }
110 126
111 fn add_macro(&mut self, ctx: &CompletionContext, name: Option<String>, macro_: hir::MacroDef) { 127 pub(crate) fn add_macro(
128 &mut self,
129 ctx: &CompletionContext,
130 name: Option<String>,
131 macro_: hir::MacroDef,
132 ) {
112 let ast_node = macro_.source(ctx.db).ast; 133 let ast_node = macro_.source(ctx.db).ast;
113 if let Some(name) = name { 134 if let Some(name) = name {
114 let detail = macro_label(&ast_node); 135 let detail = macro_label(&ast_node);