Skip to content

Commit

Permalink
fix: Goto implementation to impls inside blocks
Browse files Browse the repository at this point in the history
  • Loading branch information
ShoyuVanilla committed Mar 19, 2024
1 parent b91697d commit 967a864
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 1 deletion.
27 changes: 26 additions & 1 deletion crates/hir/src/lib.rs
Expand Up @@ -3628,16 +3628,41 @@ impl Impl {
.filter(filter),
);
}

if let Some(block) =
ty.adt_id(Interner).and_then(|def| def.0.module(db.upcast()).containing_block())
{
if let Some(inherent_impls) = db.inherent_impls_in_block(block) {
all.extend(
inherent_impls.for_self_ty(&ty).iter().cloned().map(Self::from).filter(filter),
);
}
if let Some(trait_impls) = db.trait_impls_in_block(block) {
all.extend(
trait_impls
.for_self_ty_without_blanket_impls(fp)
.map(Self::from)
.filter(filter),
);
}
}

all
}

pub fn all_for_trait(db: &dyn HirDatabase, trait_: Trait) -> Vec<Impl> {
let krate = trait_.module(db).krate();
let module = trait_.module(db);
let krate = module.krate();
let mut all = Vec::new();
for Crate { id } in krate.transitive_reverse_dependencies(db) {
let impls = db.trait_impls_in_crate(id);
all.extend(impls.for_trait(trait_.id).map(Self::from))
}
if let Some(block) = module.id.containing_block() {
if let Some(trait_impls) = db.trait_impls_in_block(block) {
all.extend(trait_impls.for_trait(trait_.id).map(Self::from));
}
}
all
}

Expand Down
71 changes: 71 additions & 0 deletions crates/ide/src/goto_implementation.rs
Expand Up @@ -337,6 +337,77 @@ impl Tr for S {
const C: usize = 4;
//^
}
"#,
);
}

#[test]
fn goto_adt_implementation_inside_block() {
check(
r#"
//- minicore: copy, derive
trait Bar {}
fn test() {
#[derive(Copy)]
//^^^^^^^^^^^^^^^
struct Foo$0;
impl Foo {}
//^^^
trait Baz {}
impl Bar for Foo {}
//^^^
impl Baz for Foo {}
//^^^
}
"#,
);
}

#[test]
fn goto_trait_implementation_inside_block() {
check(
r#"
struct Bar;
fn test() {
trait Foo$0 {}
struct Baz;
impl Foo for Bar {}
//^^^
impl Foo for Baz {}
//^^^
}
"#,
);
check(
r#"
struct Bar;
fn test() {
trait Foo {
fn foo$0() {}
}
struct Baz;
impl Foo for Bar {
fn foo() {}
//^^^
}
impl Foo for Baz {
fn foo() {}
//^^^
}
}
"#,
);
}
Expand Down

0 comments on commit 967a864

Please sign in to comment.