Unnamed repository; edit this file 'description' to name the repository.
the offset used for the completion cursor should always be relative to the original file and not to the marco file
XFFXFF 2022-06-16
parent fbf8e12 · commit 6df969f
-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 0ae30604a8..d624d37577 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 ded8e48d4e..c05a7ad9fa 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 191acb9053..8943d303b6 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#"