From 7b952cb1aac99c621e14c5fb63c66fc67c8470fc Mon Sep 17 00:00:00 2001 From: zhoufan <1247714429@qq.com> Date: Tue, 14 Dec 2021 15:34:57 +0800 Subject: [PATCH 1/2] infer associated method in local scope --- crates/hir_ty/src/infer/path.rs | 2 +- crates/hir_ty/src/tests/method_resolution.rs | 31 ++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/crates/hir_ty/src/infer/path.rs b/crates/hir_ty/src/infer/path.rs index a84501fa54d2..06689e1d29f9 100644 --- a/crates/hir_ty/src/infer/path.rs +++ b/crates/hir_ty/src/infer/path.rs @@ -227,7 +227,7 @@ impl<'a> InferenceContext<'a> { self.table.trait_env.clone(), krate, &traits_in_scope, - None, + self.resolver.module(), Some(name), method_resolution::LookupMode::Path, move |_ty, item| { diff --git a/crates/hir_ty/src/tests/method_resolution.rs b/crates/hir_ty/src/tests/method_resolution.rs index 731605ced1fa..11bdfa85a9f2 100644 --- a/crates/hir_ty/src/tests/method_resolution.rs +++ b/crates/hir_ty/src/tests/method_resolution.rs @@ -84,6 +84,37 @@ fn infer_associated_method_struct() { ); } +#[test] +fn infer_associated_method_struct_in_local_scope() { + check_infer( + r#" + fn mismatch() { + struct A; + + impl A { + fn from(_: i32, _: i32) -> Self { + A + } + } + + let _a = A::from(1, 2); + } + "#, + expect![[r#" + 14..146 '{ ... 2); }': () + 125..127 '_a': A + 130..137 'A::from': fn from(i32, i32) -> A + 130..143 'A::from(1, 2)': A + 138..139 '1': i32 + 141..142 '2': i32 + 60..61 '_': i32 + 68..69 '_': i32 + 84..109 '{ ... }': A + 98..99 'A': A + "#]], + ); +} + #[test] fn infer_associated_method_enum() { check_infer( From c3ad945d9b820c3e31177dc394bf35383d57b468 Mon Sep 17 00:00:00 2001 From: zhoufan <1247714429@qq.com> Date: Tue, 14 Dec 2021 15:57:58 +0800 Subject: [PATCH 2/2] fixes broken tests --- crates/hir_ty/src/tests/method_resolution.rs | 2 +- crates/ide/src/hover/tests.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/hir_ty/src/tests/method_resolution.rs b/crates/hir_ty/src/tests/method_resolution.rs index 11bdfa85a9f2..9c0c00da3b1d 100644 --- a/crates/hir_ty/src/tests/method_resolution.rs +++ b/crates/hir_ty/src/tests/method_resolution.rs @@ -308,7 +308,7 @@ fn test() { pub mod foo { pub struct S; impl S { - fn thing() -> i128 { 0 } + pub fn thing() -> i128 { 0 } } } "#, diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs index f1d7d2791d8e..28dd2afa02a3 100644 --- a/crates/ide/src/hover/tests.rs +++ b/crates/ide/src/hover/tests.rs @@ -823,10 +823,10 @@ fn test_hover_infer_associated_method_exact() { check( r#" mod wrapper { - struct Thing { x: u32 } + pub struct Thing { x: u32 } impl Thing { - fn new() -> Thing { Thing { x: 0 } } + pub fn new() -> Thing { Thing { x: 0 } } } } @@ -840,9 +840,9 @@ fn main() { let foo_test = wrapper::Thing::new$0(); } ``` ```rust - fn new() -> Thing + pub fn new() -> Thing ``` - "#]], + "#]], ) }