From 1d6f291335c58aac95c1124f55d7fb0834baff2a Mon Sep 17 00:00:00 2001
From: Zac Pullar-Strecker <zacmps@gmail.com>
Date: Sat, 13 Jun 2020 22:34:59 +1200
Subject: Move resolver into impls, work on tests

---
 crates/ra_ide_db/src/defs.rs | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

(limited to 'crates/ra_ide_db/src')

diff --git a/crates/ra_ide_db/src/defs.rs b/crates/ra_ide_db/src/defs.rs
index 3ef5e74b6..a158169e3 100644
--- a/crates/ra_ide_db/src/defs.rs
+++ b/crates/ra_ide_db/src/defs.rs
@@ -7,7 +7,7 @@
 
 use hir::{
     Field, HasVisibility, ImplDef, Local, MacroDef, Module, ModuleDef, Name, PathResolution,
-    Semantics, TypeParam, Visibility,
+    Semantics, TypeParam, Visibility, db::{DefDatabase, HirDatabase},
 };
 use ra_prof::profile;
 use ra_syntax::{
@@ -16,6 +16,7 @@ use ra_syntax::{
 };
 
 use crate::RootDatabase;
+use ra_hir_def::resolver::{Resolver, HasResolver};
 
 // FIXME: a more precise name would probably be `Symbol`?
 #[derive(Debug, PartialEq, Eq, Copy, Clone)]
@@ -76,6 +77,20 @@ impl Definition {
         };
         Some(name)
     }
+
+    pub fn resolver<D: HirDatabase + DefDatabase>(&self, db: &D) -> Option<Resolver> {
+        use hir::VariantDef;
+        use ra_hir_def::*;
+        Some(match self {
+            Definition::ModuleDef(def) => def.resolver(db)?,
+            Definition::Field(field) => Into::<VariantId>::into(Into::<VariantDef>::into(field.parent_def(db))).resolver(db),
+            Definition::Macro(m) => Into::<ModuleId>::into(m.module(db)?).resolver(db),
+            Definition::SelfType(imp) => Into::<ImplId>::into(imp.clone()).resolver(db),
+            // it's possible, read probable, that other arms of this are also unreachable
+            Definition::Local(_local) => unreachable!(),
+            Definition::TypeParam(tp) => Into::<ModuleId>::into(tp.module(db)).resolver(db)
+        })
+    }
 }
 
 #[derive(Debug)]
-- 
cgit v1.2.3