Unnamed repository; edit this file 'description' to name the repository.
fix: Use original definition ranges for ide_db::search instead of the expanded ranges
Lukas Wirth 2021-09-14
parent e08b3bf · commit 6f9de71
-rw-r--r--crates/ide/src/highlight_related.rs16
-rw-r--r--crates/ide_db/src/search.rs50
2 files changed, 34 insertions, 32 deletions
diff --git a/crates/ide/src/highlight_related.rs b/crates/ide/src/highlight_related.rs
index 6994e41c8a..7cce99c3b0 100644
--- a/crates/ide/src/highlight_related.rs
+++ b/crates/ide/src/highlight_related.rs
@@ -414,6 +414,22 @@ fn foo() {
}
#[test]
+ fn test_hl_local_in_attr() {
+ check(
+ r#"
+//- proc_macros: identity
+#[proc_macros::identity]
+fn foo() {
+ let mut bar = 3;
+ // ^^^ write
+ bar$0;
+ // ^^^ read
+}
+"#,
+ );
+ }
+
+ #[test]
fn test_multi_macro_usage() {
check(
r#"
diff --git a/crates/ide_db/src/search.rs b/crates/ide_db/src/search.rs
index 8b8c91b2fc..a84e6b3ba4 100644
--- a/crates/ide_db/src/search.rs
+++ b/crates/ide_db/src/search.rs
@@ -232,50 +232,36 @@ impl Definition {
let file_id = file_id.original_file(db);
if let Definition::Local(var) = self {
- let range = match var.parent(db) {
- DefWithBody::Function(f) => f.source(db).map(|src| src.value.syntax().text_range()),
- DefWithBody::Const(c) => c.source(db).map(|src| src.value.syntax().text_range()),
- DefWithBody::Static(s) => s.source(db).map(|src| src.value.syntax().text_range()),
+ let def = match var.parent(db) {
+ DefWithBody::Function(f) => f.source(db).map(|src| src.syntax().cloned()),
+ DefWithBody::Const(c) => c.source(db).map(|src| src.syntax().cloned()),
+ DefWithBody::Static(s) => s.source(db).map(|src| src.syntax().cloned()),
};
- return match range {
- Some(range) => SearchScope::file_range(FileRange { file_id, range }),
+ return match def {
+ Some(def) => SearchScope::file_range(def.as_ref().original_file_range(db)),
None => SearchScope::single_file(file_id),
};
}
if let Definition::SelfType(impl_) = self {
- return match impl_.source(db).map(|src| src.value.syntax().text_range()) {
- Some(range) => SearchScope::file_range(FileRange { file_id, range }),
+ return match impl_.source(db).map(|src| src.syntax().cloned()) {
+ Some(def) => SearchScope::file_range(def.as_ref().original_file_range(db)),
None => SearchScope::single_file(file_id),
};
}
if let Definition::GenericParam(hir::GenericParam::LifetimeParam(param)) = self {
- let range = match param.parent(db) {
- hir::GenericDef::Function(it) => {
- it.source(db).map(|src| src.value.syntax().text_range())
- }
- hir::GenericDef::Adt(it) => {
- it.source(db).map(|src| src.value.syntax().text_range())
- }
- hir::GenericDef::Trait(it) => {
- it.source(db).map(|src| src.value.syntax().text_range())
- }
- hir::GenericDef::TypeAlias(it) => {
- it.source(db).map(|src| src.value.syntax().text_range())
- }
- hir::GenericDef::Impl(it) => {
- it.source(db).map(|src| src.value.syntax().text_range())
- }
- hir::GenericDef::Variant(it) => {
- it.source(db).map(|src| src.value.syntax().text_range())
- }
- hir::GenericDef::Const(it) => {
- it.source(db).map(|src| src.value.syntax().text_range())
- }
+ let def = match param.parent(db) {
+ hir::GenericDef::Function(it) => it.source(db).map(|src| src.syntax().cloned()),
+ hir::GenericDef::Adt(it) => it.source(db).map(|src| src.syntax().cloned()),
+ hir::GenericDef::Trait(it) => it.source(db).map(|src| src.syntax().cloned()),
+ hir::GenericDef::TypeAlias(it) => it.source(db).map(|src| src.syntax().cloned()),
+ hir::GenericDef::Impl(it) => it.source(db).map(|src| src.syntax().cloned()),
+ hir::GenericDef::Variant(it) => it.source(db).map(|src| src.syntax().cloned()),
+ hir::GenericDef::Const(it) => it.source(db).map(|src| src.syntax().cloned()),
};
- return match range {
- Some(range) => SearchScope::file_range(FileRange { file_id, range }),
+ return match def {
+ Some(def) => SearchScope::file_range(def.as_ref().original_file_range(db)),
None => SearchScope::single_file(file_id),
};
}