diff options
Diffstat (limited to 'crates/ra_ide')
-rw-r--r-- | crates/ra_ide/src/hover.rs | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/crates/ra_ide/src/hover.rs b/crates/ra_ide/src/hover.rs index 045713519..c2909e200 100644 --- a/crates/ra_ide/src/hover.rs +++ b/crates/ra_ide/src/hover.rs | |||
@@ -236,9 +236,26 @@ fn runnable_action( | |||
236 | fn goto_type_action(db: &RootDatabase, def: Definition) -> Option<HoverAction> { | 236 | fn goto_type_action(db: &RootDatabase, def: Definition) -> Option<HoverAction> { |
237 | match def { | 237 | match def { |
238 | Definition::Local(it) => { | 238 | Definition::Local(it) => { |
239 | let targets = it | 239 | let mut targets: Vec<ModuleDef> = Vec::new(); |
240 | .ty(db) | 240 | let mut push_new_def = |item: ModuleDef| { |
241 | .flattened_type_items(db) | 241 | if !targets.contains(&item) { |
242 | targets.push(item); | ||
243 | } | ||
244 | }; | ||
245 | |||
246 | it.ty(db).walk(db, |t| { | ||
247 | if let Some(adt) = t.as_adt() { | ||
248 | push_new_def(adt.into()); | ||
249 | } else if let Some(trait_) = t.as_dyn_trait() { | ||
250 | push_new_def(trait_.into()); | ||
251 | } else if let Some(trait_) = t.as_impl_trait(db) { | ||
252 | push_new_def(trait_.into()); | ||
253 | } else if let Some(trait_) = t.as_associated_type_parent_trait(db) { | ||
254 | push_new_def(trait_.into()); | ||
255 | } | ||
256 | }); | ||
257 | |||
258 | let targets = targets | ||
242 | .into_iter() | 259 | .into_iter() |
243 | .filter_map(|it| { | 260 | .filter_map(|it| { |
244 | Some(HoverGotoTypeData { | 261 | Some(HoverGotoTypeData { |
@@ -246,7 +263,7 @@ fn goto_type_action(db: &RootDatabase, def: Definition) -> Option<HoverAction> { | |||
246 | nav: it.try_to_nav(db)?, | 263 | nav: it.try_to_nav(db)?, |
247 | }) | 264 | }) |
248 | }) | 265 | }) |
249 | .collect_vec(); | 266 | .collect(); |
250 | 267 | ||
251 | Some(HoverAction::GoToType(targets)) | 268 | Some(HoverAction::GoToType(targets)) |
252 | } | 269 | } |