fix derive hover in macro

This commit is contained in:
hamidreza kalbasi 2021-09-21 19:55:57 +04:30
parent 0777698f29
commit 887b7ddc37

View file

@ -118,6 +118,10 @@ pub(crate) fn hover(
let mut fallback = None; let mut fallback = None;
// attributes, require special machinery as they are mere ident tokens // attributes, require special machinery as they are mere ident tokens
let descend_macros = sema.descend_into_macros_many(token.clone());
for token in &descend_macros {
if token.kind() != COMMENT { if token.kind() != COMMENT {
if let Some(attr) = token.ancestors().find_map(ast::Attr::cast) { if let Some(attr) = token.ancestors().find_map(ast::Attr::cast) {
// lints // lints
@ -125,19 +129,25 @@ pub(crate) fn hover(
return Some(res); return Some(res);
// derives // derives
} else { } else {
let def = try_resolve_derive_input_at(&sema, &attr, &token).map(Definition::Macro); let def =
try_resolve_derive_input_at(&sema, &attr, &token).map(Definition::Macro);
if let Some(def) = def { if let Some(def) = def {
if let Some(hover) = if let Some(hover) = hover_for_definition(
hover_for_definition(&sema, file_id, def, &token.parent().unwrap(), config) &sema,
{ file_id,
def,
&token.parent().unwrap(),
config,
) {
return Some(RangeInfo::new(token.text_range(), hover)); return Some(RangeInfo::new(token.text_range(), hover));
} }
} }
} }
} }
} }
}
sema.descend_into_macros_many(token.clone()) descend_macros
.iter() .iter()
.filter_map(|token| match token.parent() { .filter_map(|token| match token.parent() {
Some(node) => { Some(node) => {
@ -4560,6 +4570,37 @@ use crate as foo$0;
); );
} }
// FIXME: wrong range in macros. `es! ` should be `Copy`
#[test]
fn hover_attribute_in_macro() {
check(
r#"
macro_rules! identity {
($struct:item) => {
$struct
};
}
#[rustc_builtin_macro]
pub macro Copy {}
identity!{
#[derive(Copy$0)]
struct Foo;
}
"#,
expect![[r#"
*es! *
```rust
test
```
```rust
pub macro Copy
```
"#]],
);
}
#[test] #[test]
fn hover_derive_input() { fn hover_derive_input() {
check( check(