From 8a57c736404abac81a6de20b0e90c19021e040b9 Mon Sep 17 00:00:00 2001 From: Jade Date: Tue, 1 Jun 2021 16:16:59 -0700 Subject: feat: goto definition on an impl fn goes to that fn in the trait e.g. if you have a trait T and `impl T for S` for some struct, if you goto definition on some function name inside the impl, it will go to the definition of that function inside the `trait T` block, rather than the current behaviour of not going anywhere at all. --- crates/hir/src/lib.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'crates/hir/src') diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index b43d61d0e..c2b68a853 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -50,7 +50,6 @@ use hir_def::{ per_ns::PerNs, resolver::{HasResolver, Resolver}, src::HasSource as _, - type_ref::TraitRef, AdtId, AssocContainerId, AssocItemId, AssocItemLoc, AttrDefId, ConstId, ConstParamId, DefWithBodyId, EnumId, FunctionId, GenericDefId, HasModule, ImplId, LifetimeParamId, LocalEnumVariantId, LocalFieldId, Lookup, ModuleId, StaticId, StructId, TraitId, TypeAliasId, @@ -1797,9 +1796,11 @@ impl Impl { } // FIXME: the return type is wrong. This should be a hir version of - // `TraitRef` (ie, resolved `TypeRef`). - pub fn trait_(self, db: &dyn HirDatabase) -> Option { - db.impl_data(self.id).target_trait.as_deref().cloned() + // `TraitRef` (to account for parameters and qualifiers) + pub fn trait_(self, db: &dyn HirDatabase) -> Option { + let trait_ref = db.impl_trait(self.id)?.skip_binders().clone(); + let id = hir_ty::from_chalk_trait_id(trait_ref.trait_id); + Some(Trait { id }) } pub fn self_ty(self, db: &dyn HirDatabase) -> Type { -- cgit v1.2.3