aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src/hover.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide_api/src/hover.rs')
-rw-r--r--crates/ra_ide_api/src/hover.rs115
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 @@
1use ra_db::SourceDatabase; 1use ra_db::SourceDatabase;
2use ra_syntax::{ 2use 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};
6use hir::HirDisplay; 7use hir::{HirDisplay, HasSource};
7 8
8use crate::{ 9use 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
276pub(crate) fn type_of(db: &RootDatabase, frange: FileRange) -> Option<String> { 237pub(crate) fn type_of(db: &RootDatabase, frange: FileRange) -> Option<String> {