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 trait_method() {
); );
} }
#[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] #[test]
fn generic_fn() { fn generic_fn() {
check_number( 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 = trait_ref.self_type_parameter(Interner);
let self_ty_fp = TyFingerprint::for_trait_impl(&self_ty)?; let self_ty_fp = TyFingerprint::for_trait_impl(&self_ty)?;
let impls = db.trait_impls_in_deps(env.krate); let impls = db.trait_impls_in_deps(env.krate);
let impls = let self_impls = match self_ty.kind(Interner) {
impls.iter().flat_map(|impls| impls.for_trait_and_self_ty(hir_trait_id, self_ty_fp)); 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); let table = InferenceTable::new(db, env);

View file

@ -1492,6 +1492,29 @@ impl Twait for Stwuct {
fn f() { fn f() {
let s = Stwuct; let s = Stwuct;
s.a$0(); 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();
}
} }
"#, "#,
); );