diff options
author | Aleksey Kladov <[email protected]> | 2019-09-12 21:35:53 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-09-13 14:24:10 +0100 |
commit | 51e2d76b9839410020c75ac02ad602675b0a5aa9 (patch) | |
tree | 989afd660d62db28196a8792cec2affb7bfd50a7 /crates/ra_ide_api/src/completion/presentation.rs | |
parent | 1adf0519bcc8286c06e12aa7e5b16298addfea4a (diff) |
Specify desirable namespace when calling resolve
That way, we are able to get rid of a number of unreachable statements
Diffstat (limited to 'crates/ra_ide_api/src/completion/presentation.rs')
-rw-r--r-- | crates/ra_ide_api/src/completion/presentation.rs | 95 |
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. |
2 | use hir::{Docs, HasSource, HirDisplay, PerNs, Resolution, Ty, TypeWalk}; | 2 | use hir::{Docs, HasSource, HirDisplay, ScopeDef, Ty, TypeWalk}; |
3 | use join_to_string::join; | 3 | use join_to_string::join; |
4 | use ra_syntax::ast::NameOwner; | 4 | use ra_syntax::ast::NameOwner; |
5 | use test_utils::tested_by; | 5 | use 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); |