fix: Use original definition ranges for ide_db::search instead of the expanded ranges

This commit is contained in:
Lukas Wirth 2021-09-14 02:49:06 +02:00
parent e08b3bf70b
commit 6f9de71402
2 changed files with 34 additions and 32 deletions

View file

@ -413,6 +413,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] #[test]
fn test_multi_macro_usage() { fn test_multi_macro_usage() {
check( check(

View file

@ -232,50 +232,36 @@ impl Definition {
let file_id = file_id.original_file(db); let file_id = file_id.original_file(db);
if let Definition::Local(var) = self { if let Definition::Local(var) = self {
let range = match var.parent(db) { let def = match var.parent(db) {
DefWithBody::Function(f) => f.source(db).map(|src| src.value.syntax().text_range()), DefWithBody::Function(f) => f.source(db).map(|src| src.syntax().cloned()),
DefWithBody::Const(c) => c.source(db).map(|src| src.value.syntax().text_range()), DefWithBody::Const(c) => c.source(db).map(|src| src.syntax().cloned()),
DefWithBody::Static(s) => s.source(db).map(|src| src.value.syntax().text_range()), DefWithBody::Static(s) => s.source(db).map(|src| src.syntax().cloned()),
}; };
return match range { return match def {
Some(range) => SearchScope::file_range(FileRange { file_id, range }), Some(def) => SearchScope::file_range(def.as_ref().original_file_range(db)),
None => SearchScope::single_file(file_id), None => SearchScope::single_file(file_id),
}; };
} }
if let Definition::SelfType(impl_) = self { if let Definition::SelfType(impl_) = self {
return match impl_.source(db).map(|src| src.value.syntax().text_range()) { return match impl_.source(db).map(|src| src.syntax().cloned()) {
Some(range) => SearchScope::file_range(FileRange { file_id, range }), Some(def) => SearchScope::file_range(def.as_ref().original_file_range(db)),
None => SearchScope::single_file(file_id), None => SearchScope::single_file(file_id),
}; };
} }
if let Definition::GenericParam(hir::GenericParam::LifetimeParam(param)) = self { if let Definition::GenericParam(hir::GenericParam::LifetimeParam(param)) = self {
let range = match param.parent(db) { let def = match param.parent(db) {
hir::GenericDef::Function(it) => { hir::GenericDef::Function(it) => it.source(db).map(|src| src.syntax().cloned()),
it.source(db).map(|src| src.value.syntax().text_range()) 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::Adt(it) => { hir::GenericDef::TypeAlias(it) => it.source(db).map(|src| src.syntax().cloned()),
it.source(db).map(|src| src.value.syntax().text_range()) 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::Trait(it) => { hir::GenericDef::Const(it) => it.source(db).map(|src| src.syntax().cloned()),
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())
}
}; };
return match range { return match def {
Some(range) => SearchScope::file_range(FileRange { file_id, range }), Some(def) => SearchScope::file_range(def.as_ref().original_file_range(db)),
None => SearchScope::single_file(file_id), None => SearchScope::single_file(file_id),
}; };
} }