diff options
Diffstat (limited to 'crates/ra_ide_api/src/hover.rs')
-rw-r--r-- | crates/ra_ide_api/src/hover.rs | 115 |
1 files changed, 38 insertions, 77 deletions
diff --git a/crates/ra_ide_api/src/hover.rs b/crates/ra_ide_api/src/hover.rs index bc8e8fd14..df877c324 100644 --- a/crates/ra_ide_api/src/hover.rs +++ b/crates/ra_ide_api/src/hover.rs | |||
@@ -1,9 +1,10 @@ | |||
1 | use ra_db::SourceDatabase; | 1 | use ra_db::SourceDatabase; |
2 | use ra_syntax::{ | 2 | use ra_syntax::{ |
3 | AstNode, ast::{self, DocCommentsOwner}, | 3 | AstNode, TreeArc, |
4 | ast::{self, DocCommentsOwner}, | ||
4 | algo::{find_covering_element, find_node_at_offset, ancestors_at_offset, visit::{visitor, Visitor}}, | 5 | algo::{find_covering_element, find_node_at_offset, ancestors_at_offset, visit::{visitor, Visitor}}, |
5 | }; | 6 | }; |
6 | use hir::HirDisplay; | 7 | use hir::{HirDisplay, HasSource}; |
7 | 8 | ||
8 | use crate::{ | 9 | use crate::{ |
9 | db::RootDatabase, | 10 | db::RootDatabase, |
@@ -97,78 +98,38 @@ pub(crate) fn hover(db: &RootDatabase, position: FilePosition) -> Option<RangeIn | |||
97 | let mut no_fallback = false; | 98 | let mut no_fallback = false; |
98 | 99 | ||
99 | match classify_name_ref(db, &analyzer, name_ref) { | 100 | match classify_name_ref(db, &analyzer, name_ref) { |
100 | Some(Method(it)) => { | 101 | Some(Method(it)) => res.extend(from_def_source(db, it)), |
101 | let it = it.source(db).1; | ||
102 | res.extend(hover_text(it.doc_comment_text(), it.short_label())); | ||
103 | } | ||
104 | Some(Macro(it)) => { | 102 | Some(Macro(it)) => { |
105 | let it = it.source(db).1; | 103 | let src = it.source(db); |
106 | res.extend(hover_text(it.doc_comment_text(), None)); | 104 | res.extend(hover_text(src.ast.doc_comment_text(), None)); |
107 | } | 105 | } |
108 | Some(FieldAccess(it)) => { | 106 | Some(FieldAccess(it)) => { |
109 | let it = it.source(db).1; | 107 | let src = it.source(db); |
110 | if let hir::FieldSource::Named(it) = it { | 108 | if let hir::FieldSource::Named(it) = src.ast { |
111 | res.extend(hover_text(it.doc_comment_text(), it.short_label())); | 109 | res.extend(hover_text(it.doc_comment_text(), it.short_label())); |
112 | } | 110 | } |
113 | } | 111 | } |
114 | Some(AssocItem(it)) => match it { | 112 | Some(AssocItem(it)) => res.extend(match it { |
115 | hir::ImplItem::Method(it) => { | 113 | hir::ImplItem::Method(it) => from_def_source(db, it), |
116 | let it = it.source(db).1; | 114 | hir::ImplItem::Const(it) => from_def_source(db, it), |
117 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | 115 | hir::ImplItem::TypeAlias(it) => from_def_source(db, it), |
118 | } | 116 | }), |
119 | hir::ImplItem::Const(it) => { | ||
120 | let it = it.source(db).1; | ||
121 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | ||
122 | } | ||
123 | hir::ImplItem::TypeAlias(it) => { | ||
124 | let it = it.source(db).1; | ||
125 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | ||
126 | } | ||
127 | }, | ||
128 | Some(Def(it)) => { | 117 | Some(Def(it)) => { |
129 | match it { | 118 | match it { |
130 | hir::ModuleDef::Module(it) => { | 119 | hir::ModuleDef::Module(it) => { |
131 | let it = it.definition_source(db).1; | 120 | if let hir::ModuleSource::Module(it) = it.definition_source(db).ast { |
132 | if let hir::ModuleSource::Module(it) = it { | ||
133 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | 121 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) |
134 | } | 122 | } |
135 | } | 123 | } |
136 | hir::ModuleDef::Function(it) => { | 124 | hir::ModuleDef::Function(it) => res.extend(from_def_source(db, it)), |
137 | let it = it.source(db).1; | 125 | hir::ModuleDef::Struct(it) => res.extend(from_def_source(db, it)), |
138 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | 126 | hir::ModuleDef::Union(it) => res.extend(from_def_source(db, it)), |
139 | } | 127 | hir::ModuleDef::Enum(it) => res.extend(from_def_source(db, it)), |
140 | hir::ModuleDef::Struct(it) => { | 128 | hir::ModuleDef::EnumVariant(it) => res.extend(from_def_source(db, it)), |
141 | let it = it.source(db).1; | 129 | hir::ModuleDef::Const(it) => res.extend(from_def_source(db, it)), |
142 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | 130 | hir::ModuleDef::Static(it) => res.extend(from_def_source(db, it)), |
143 | } | 131 | hir::ModuleDef::Trait(it) => res.extend(from_def_source(db, it)), |
144 | hir::ModuleDef::Union(it) => { | 132 | hir::ModuleDef::TypeAlias(it) => res.extend(from_def_source(db, it)), |
145 | let it = it.source(db).1; | ||
146 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | ||
147 | } | ||
148 | hir::ModuleDef::Enum(it) => { | ||
149 | let it = it.source(db).1; | ||
150 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | ||
151 | } | ||
152 | hir::ModuleDef::EnumVariant(it) => { | ||
153 | let it = it.source(db).1; | ||
154 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | ||
155 | } | ||
156 | hir::ModuleDef::Const(it) => { | ||
157 | let it = it.source(db).1; | ||
158 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | ||
159 | } | ||
160 | hir::ModuleDef::Static(it) => { | ||
161 | let it = it.source(db).1; | ||
162 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | ||
163 | } | ||
164 | hir::ModuleDef::Trait(it) => { | ||
165 | let it = it.source(db).1; | ||
166 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | ||
167 | } | ||
168 | hir::ModuleDef::TypeAlias(it) => { | ||
169 | let it = it.source(db).1; | ||
170 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | ||
171 | } | ||
172 | hir::ModuleDef::BuiltinType(_) => { | 133 | hir::ModuleDef::BuiltinType(_) => { |
173 | // FIXME: hover for builtin Type ? | 134 | // FIXME: hover for builtin Type ? |
174 | } | 135 | } |
@@ -176,20 +137,11 @@ pub(crate) fn hover(db: &RootDatabase, position: FilePosition) -> Option<RangeIn | |||
176 | } | 137 | } |
177 | Some(SelfType(ty)) => { | 138 | Some(SelfType(ty)) => { |
178 | if let Some((adt_def, _)) = ty.as_adt() { | 139 | if let Some((adt_def, _)) = ty.as_adt() { |
179 | match adt_def { | 140 | res.extend(match adt_def { |
180 | hir::AdtDef::Struct(it) => { | 141 | hir::AdtDef::Struct(it) => from_def_source(db, it), |
181 | let it = it.source(db).1; | 142 | hir::AdtDef::Union(it) => from_def_source(db, it), |
182 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | 143 | hir::AdtDef::Enum(it) => from_def_source(db, it), |
183 | } | 144 | }) |
184 | hir::AdtDef::Union(it) => { | ||
185 | let it = it.source(db).1; | ||
186 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | ||
187 | } | ||
188 | hir::AdtDef::Enum(it) => { | ||
189 | let it = it.source(db).1; | ||
190 | res.extend(hover_text(it.doc_comment_text(), it.short_label())) | ||
191 | } | ||
192 | } | ||
193 | } | 145 | } |
194 | } | 146 | } |
195 | Some(Pat(_)) | Some(SelfParam(_)) => { | 147 | Some(Pat(_)) | Some(SelfParam(_)) => { |
@@ -270,7 +222,16 @@ pub(crate) fn hover(db: &RootDatabase, position: FilePosition) -> Option<RangeIn | |||
270 | return None; | 222 | return None; |
271 | } | 223 | } |
272 | let res = RangeInfo::new(range, res); | 224 | let res = RangeInfo::new(range, res); |
273 | Some(res) | 225 | return Some(res); |
226 | |||
227 | fn from_def_source<A, D>(db: &RootDatabase, def: D) -> Option<String> | ||
228 | where | ||
229 | D: HasSource<Ast = TreeArc<A>>, | ||
230 | A: ast::DocCommentsOwner + ast::NameOwner + ShortLabel, | ||
231 | { | ||
232 | let src = def.source(db); | ||
233 | hover_text(src.ast.doc_comment_text(), src.ast.short_label()) | ||
234 | } | ||
274 | } | 235 | } |
275 | 236 | ||
276 | pub(crate) fn type_of(db: &RootDatabase, frange: FileRange) -> Option<String> { | 237 | pub(crate) fn type_of(db: &RootDatabase, frange: FileRange) -> Option<String> { |