Skip to content

Commit 92d6670

Browse files
committed
Consider block impls in lookup_impl_assoc_item_for_trait_ref
1 parent bb78059 commit 92d6670

File tree

3 files changed

+62
-2
lines changed

3 files changed

+62
-2
lines changed

crates/hir-ty/src/consteval/tests.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,35 @@ fn trait_method() {
503503
);
504504
}
505505

506+
#[test]
507+
fn trait_method_inside_block() {
508+
check_number(
509+
r#"
510+
trait Twait {
511+
fn a(&self) -> i32;
512+
}
513+
514+
fn outer() -> impl Twait {
515+
struct Stwuct;
516+
517+
impl Twait for Stwuct {
518+
fn a(&self) -> i32 {
519+
5
520+
}
521+
}
522+
fn f() -> impl Twait {
523+
let s = Stwuct;
524+
s
525+
}
526+
f()
527+
}
528+
529+
const GOAL: i32 = outer().a();
530+
"#,
531+
5,
532+
);
533+
}
534+
506535
#[test]
507536
fn generic_fn() {
508537
check_number(

crates/hir-ty/src/method_resolution.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -729,8 +729,16 @@ fn lookup_impl_assoc_item_for_trait_ref(
729729
let self_ty = trait_ref.self_type_parameter(Interner);
730730
let self_ty_fp = TyFingerprint::for_trait_impl(&self_ty)?;
731731
let impls = db.trait_impls_in_deps(env.krate);
732-
let impls =
733-
impls.iter().flat_map(|impls| impls.for_trait_and_self_ty(hir_trait_id, self_ty_fp));
732+
let self_impls = match self_ty.kind(Interner) {
733+
TyKind::Adt(id, _) => {
734+
id.0.module(db.upcast()).containing_block().map(|x| db.trait_impls_in_block(x))
735+
}
736+
_ => None,
737+
};
738+
let impls = impls
739+
.iter()
740+
.chain(self_impls.as_ref())
741+
.flat_map(|impls| impls.for_trait_and_self_ty(hir_trait_id, self_ty_fp));
734742

735743
let table = InferenceTable::new(db, env);
736744

crates/ide/src/goto_definition.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1492,6 +1492,29 @@ impl Twait for Stwuct {
14921492
fn f() {
14931493
let s = Stwuct;
14941494
s.a$0();
1495+
}
1496+
"#,
1497+
);
1498+
}
1499+
#[test]
1500+
fn method_call_inside_block() {
1501+
check(
1502+
r#"
1503+
trait Twait {
1504+
fn a(&self);
1505+
}
1506+
1507+
fn outer() {
1508+
struct Stwuct;
1509+
1510+
impl Twait for Stwuct {
1511+
fn a(&self){}
1512+
//^
1513+
}
1514+
fn f() {
1515+
let s = Stwuct;
1516+
s.a$0();
1517+
}
14951518
}
14961519
"#,
14971520
);

0 commit comments

Comments
 (0)