Consider block impls in lookup_impl_assoc_item_for_trait_ref

This commit is contained in:
hkalbasi 2023-05-20 01:10:37 +03:30
parent bb78059be4
commit 92d6670f72
3 changed files with 62 additions and 2 deletions

View File

@ -503,6 +503,35 @@ fn f(&self) -> u8 {
);
}
#[test]
fn trait_method_inside_block() {
check_number(
r#"
trait Twait {
fn a(&self) -> i32;
}
fn outer() -> impl Twait {
struct Stwuct;
impl Twait for Stwuct {
fn a(&self) -> i32 {
5
}
}
fn f() -> impl Twait {
let s = Stwuct;
s
}
f()
}
const GOAL: i32 = outer().a();
"#,
5,
);
}
#[test]
fn generic_fn() {
check_number(

View File

@ -729,8 +729,16 @@ fn lookup_impl_assoc_item_for_trait_ref(
let self_ty = trait_ref.self_type_parameter(Interner);
let self_ty_fp = TyFingerprint::for_trait_impl(&self_ty)?;
let impls = db.trait_impls_in_deps(env.krate);
let impls =
impls.iter().flat_map(|impls| impls.for_trait_and_self_ty(hir_trait_id, self_ty_fp));
let self_impls = match self_ty.kind(Interner) {
TyKind::Adt(id, _) => {
id.0.module(db.upcast()).containing_block().map(|x| db.trait_impls_in_block(x))
}
_ => None,
};
let impls = impls
.iter()
.chain(self_impls.as_ref())
.flat_map(|impls| impls.for_trait_and_self_ty(hir_trait_id, self_ty_fp));
let table = InferenceTable::new(db, env);

View File

@ -1492,6 +1492,29 @@ impl Twait for Stwuct {
fn f() {
let s = Stwuct;
s.a$0();
}
"#,
);
}
#[test]
fn method_call_inside_block() {
check(
r#"
trait Twait {
fn a(&self);
}
fn outer() {
struct Stwuct;
impl Twait for Stwuct {
fn a(&self){}
//^
}
fn f() {
let s = Stwuct;
s.a$0();
}
}
"#,
);