5377: Fix classify_name_ref on multi-path macro calls r=matklad a=jonas-schievink

Previously, "go to definition" on `log<|>::info!(...)` would go to the `info!` macro, not to the `log` crate. This fixes that.

Co-authored-by: Jonas Schievink <jonas.schievink@ferrous-systems.com>
This commit is contained in:
bors[bot] 2020-07-14 15:46:01 +00:00 committed by GitHub
commit ff6cf4f849
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 2 deletions

View file

@ -866,4 +866,22 @@ type Alias<T> = T<|>;
"#,
)
}
#[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)));
}
}
}
}