about summary refs log tree commit diff
diff options
context:
space:
mode:
authorXFFXFF <1247714429@qq.com>2022-06-16 16:43:08 +0800
committerXFFXFF <1247714429@qq.com>2022-06-16 20:34:37 +0800
commit6df969f5f4e9dffd19024962e051e6f9f94e9805 (patch)
tree320a22becb2129fe75973e28a4d8a5374d90cb0c
parentfbf8e122349320f67b32282def871fe95d48f33d (diff)
downloadrust-6df969f5f4e9dffd19024962e051e6f9f94e9805.tar.gz
rust-6df969f5f4e9dffd19024962e051e6f9f94e9805.zip
the offset used for the completion cursor should always be relative to the original file and not to the marco file
-rw-r--r--crates/hir/src/source_analyzer.rs10
-rw-r--r--crates/ide-completion/src/tests/expression.rs1
-rw-r--r--crates/ide-completion/src/tests/type_pos.rs7
3 files changed, 15 insertions, 3 deletions
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs
index 0ae30604a8a..d624d375774 100644
--- a/crates/hir/src/source_analyzer.rs
+++ b/crates/hir/src/source_analyzer.rs
@@ -67,7 +67,10 @@ impl SourceAnalyzer {
         let scopes = db.expr_scopes(def);
         let scope = match offset {
             None => scope_for(&scopes, &source_map, node),
-            Some(offset) => scope_for_offset(db, &scopes, &source_map, node.with_value(offset)),
+            Some(offset) => {
+                let file_id = node.file_id.original_file(db.upcast());
+                scope_for_offset(db, &scopes, &source_map, InFile::new(file_id.into(), offset))
+            }
         };
         let resolver = resolver_for_scope(db.upcast(), def, scope);
         SourceAnalyzer {
@@ -88,7 +91,10 @@ impl SourceAnalyzer {
         let scopes = db.expr_scopes(def);
         let scope = match offset {
             None => scope_for(&scopes, &source_map, node),
-            Some(offset) => scope_for_offset(db, &scopes, &source_map, node.with_value(offset)),
+            Some(offset) => {
+                let file_id = node.file_id.original_file(db.upcast());
+                scope_for_offset(db, &scopes, &source_map, InFile::new(file_id.into(), offset))
+            }
         };
         let resolver = resolver_for_scope(db.upcast(), def, scope);
         SourceAnalyzer { resolver, def: Some((def, body, source_map)), infer: None, file_id }
diff --git a/crates/ide-completion/src/tests/expression.rs b/crates/ide-completion/src/tests/expression.rs
index ded8e48d4ea..c05a7ad9fa5 100644
--- a/crates/ide-completion/src/tests/expression.rs
+++ b/crates/ide-completion/src/tests/expression.rs
@@ -513,6 +513,7 @@ fn quux(x: i32) {
 ",
         expect![[r#"
             fn quux(…)   fn(i32)
+            lc x         i32
             ma m!(…)     macro_rules! m
             bt u32
             kw crate::
diff --git a/crates/ide-completion/src/tests/type_pos.rs b/crates/ide-completion/src/tests/type_pos.rs
index 191acb90532..8943d303b60 100644
--- a/crates/ide-completion/src/tests/type_pos.rs
+++ b/crates/ide-completion/src/tests/type_pos.rs
@@ -90,11 +90,16 @@ fn x<'lt, T, const C: usize>() -> $0
 }
 
 #[test]
-fn fn_return_type2() {
+fn fn_return_type_no_local_items() {
     check(
         r#"
 fn foo() -> B$0 {
     struct Bar;
+    enum Baz {}
+    union Bax {
+        i: i32,
+        f: f32
+    }
 }
 "#,
         expect![[r#"