Fix classify_name_ref on multi-path macro calls

This commit is contained in:
Jonas Schievink 2020-07-14 17:23:33 +02:00
parent 139214d8ca
commit 2163ceb7ef
2 changed files with 26 additions and 2 deletions

View File

@ -866,4 +866,22 @@ fn goto_def_for_type_alias_generic_parameter() {
"#,
)
}
#[test]
fn goto_def_for_macro_container() {
check(
r#"
//- /lib.rs
foo::module<|>::mac!();
//- /foo/lib.rs
pub mod module {
//^^^^^^
#[macro_export]
macro_rules! _mac { () => { () } }
pub use crate::_mac as mac;
}
"#,
);
}
}

View File

@ -255,8 +255,14 @@ pub fn classify_name_ref(
}
if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) {
if let Some(macro_def) = sema.resolve_macro_call(&macro_call) {
return Some(NameRefClass::Definition(Definition::Macro(macro_def)));
if let Some(path) = macro_call.path() {
if path.qualifier().is_none() {
// Only use this to resolve single-segment macro calls like `foo!()`. Multi-segment
// paths are handled below (allowing `log<|>::info!` to resolve to the log crate).
if let Some(macro_def) = sema.resolve_macro_call(&macro_call) {
return Some(NameRefClass::Definition(Definition::Macro(macro_def)));
}
}
}
}