Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #19094 from ChayimFriedman2/use-body
fix: Fix IDE resolution of `use` inside a body
Laurențiu Nicola 2025-02-05
parent 6fb64be · parent bffc169 · commit 2ad4ec5
-rw-r--r--crates/hir/src/source_analyzer.rs6
-rw-r--r--crates/ide/src/goto_definition.rs18
-rw-r--r--crates/ide/src/rename.rs22
3 files changed, 43 insertions, 3 deletions
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs
index ca239826d4..23e7518883 100644
--- a/crates/hir/src/source_analyzer.rs
+++ b/crates/hir/src/source_analyzer.rs
@@ -1252,7 +1252,11 @@ fn scope_for(
node: InFile<&SyntaxNode>,
) -> Option<ScopeId> {
node.ancestors_with_macros(db.upcast())
- .take_while(|it| !ast::Item::can_cast(it.kind()) || ast::MacroCall::can_cast(it.kind()))
+ .take_while(|it| {
+ !ast::Item::can_cast(it.kind())
+ || ast::MacroCall::can_cast(it.kind())
+ || ast::Use::can_cast(it.kind())
+ })
.filter_map(|it| it.map(ast::Expr::cast).transpose())
.filter_map(|it| source_map.node_expr(it.as_ref())?.as_expr())
.find_map(|it| scopes.scope_for(it))
diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs
index 45f694d2fb..bdafb701ff 100644
--- a/crates/ide/src/goto_definition.rs
+++ b/crates/ide/src/goto_definition.rs
@@ -3272,4 +3272,22 @@ fn f() {
"#,
);
}
+
+ #[test]
+ fn use_inside_body() {
+ check(
+ r#"
+fn main() {
+ mod nice_module {
+ pub(super) struct NiceStruct;
+ // ^^^^^^^^^^
+ }
+
+ use nice_module::NiceStruct$0;
+
+ let _ = NiceStruct;
+}
+ "#,
+ );
+ }
}
diff --git a/crates/ide/src/rename.rs b/crates/ide/src/rename.rs
index 3d7ff5f76a..3e8295e3f0 100644
--- a/crates/ide/src/rename.rs
+++ b/crates/ide/src/rename.rs
@@ -2001,13 +2001,11 @@ impl Foo {
"foo",
r#"
fn f($0self) -> i32 {
- use self as _;
self.i
}
"#,
r#"
fn f(foo: _) -> i32 {
- use self as _;
foo.i
}
"#,
@@ -2015,6 +2013,26 @@ fn f(foo: _) -> i32 {
}
#[test]
+ fn no_type_value_ns_confuse() {
+ // Test that we don't rename items from different namespaces.
+ check(
+ "bar",
+ r#"
+struct foo {}
+fn f(foo$0: i32) -> i32 {
+ use foo as _;
+}
+"#,
+ r#"
+struct foo {}
+fn f(bar: i32) -> i32 {
+ use foo as _;
+}
+"#,
+ );
+ }
+
+ #[test]
fn test_self_in_path_to_parameter() {
check(
"foo",