mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-25 03:26:19 +00:00
Consider block impls in lookup_impl_assoc_item_for_trait_ref
This commit is contained in:
parent
bb78059be4
commit
92d6670f72
3 changed files with 62 additions and 2 deletions
|
@ -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(
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue