fix: Fix focus range being discarded in attributes/derives when upmapping

This commit is contained in:
Lukas Wirth 2024-01-03 12:09:11 +01:00
parent 426d2842c1
commit cf22f02dc5
2 changed files with 21 additions and 7 deletions

View File

@ -220,6 +220,8 @@ pub enum MacroCallKind {
}, },
Attr { Attr {
ast_id: AstId<ast::Item>, ast_id: AstId<ast::Item>,
// FIXME: This is being interned, subtrees can very quickly differ just slightly causing
// leakage problems here
attr_args: Option<Arc<tt::Subtree>>, attr_args: Option<Arc<tt::Subtree>>,
/// Syntactical index of the invoking `#[attribute]`. /// Syntactical index of the invoking `#[attribute]`.
/// ///

View File

@ -724,11 +724,8 @@ fn orig_range_with_focus(
) -> UpmappingResult<(FileRange, Option<TextRange>)> { ) -> UpmappingResult<(FileRange, Option<TextRange>)> {
let Some(name) = name else { return orig_range(db, hir_file, value) }; let Some(name) = name else { return orig_range(db, hir_file, value) };
let call_range = || { let call_kind =
db.lookup_intern_macro_call(hir_file.macro_file().unwrap().macro_call_id) || db.lookup_intern_macro_call(hir_file.macro_file().unwrap().macro_call_id).kind;
.kind
.original_call_range(db)
};
let def_range = || { let def_range = || {
db.lookup_intern_macro_call(hir_file.macro_file().unwrap().macro_call_id) db.lookup_intern_macro_call(hir_file.macro_file().unwrap().macro_call_id)
@ -755,7 +752,22 @@ fn orig_range_with_focus(
} }
// name lies outside the node, so instead point to the macro call which // name lies outside the node, so instead point to the macro call which
// *should* contain the name // *should* contain the name
_ => call_range(), _ => {
let kind = call_kind();
let range = kind.clone().original_call_range_with_body(db);
//If the focus range is in the attribute/derive body, we
// need to point the call site to the entire body, if not, fall back
// to the name range of the attribute/derive call
// FIXME: Do this differently, this is very inflexible the caller
// should choose this behavior
if range.file_id == focus_range.file_id
&& range.range.contains_range(focus_range.range)
{
range
} else {
kind.original_call_range(db)
}
}
}, },
Some(focus_range), Some(focus_range),
), ),
@ -784,7 +796,7 @@ fn orig_range_with_focus(
// node is in macro def, just show the focus // node is in macro def, just show the focus
_ => ( _ => (
// show the macro call // show the macro call
(call_range(), None), (call_kind().original_call_range(db), None),
Some((focus_range, Some(focus_range))), Some((focus_range, Some(focus_range))),
), ),
} }