diff --git a/crates/ra_ide/src/goto_definition.rs b/crates/ra_ide/src/goto_definition.rs index 31f567541d7..5b9b3eef89d 100644 --- a/crates/ra_ide/src/goto_definition.rs +++ b/crates/ra_ide/src/goto_definition.rs @@ -249,9 +249,24 @@ mod tests { check_goto( " //- /lib.rs - use foo as <|>bar; + use foo as bar<|>; + //- /foo/lib.rs + #[macro_export] + macro_rules! foo { () => { () } }", + "SOURCE_FILE FileId(2) 0..50", + "#[macro_export]\nmacro_rules! foo { () => { () } }\n", + ); + } + + #[test] + fn goto_def_for_use_alias_foo_macro() { + check_goto( + " + //- /lib.rs + use foo::foo as bar<|>; + //- /foo/lib.rs #[macro_export] macro_rules! foo { () => { () } } diff --git a/crates/ra_ide_db/src/defs.rs b/crates/ra_ide_db/src/defs.rs index 54543e6e40e..d5d06962bb5 100644 --- a/crates/ra_ide_db/src/defs.rs +++ b/crates/ra_ide_db/src/defs.rs @@ -11,7 +11,7 @@ use hir::{ }; use ra_prof::profile; use ra_syntax::{ - ast::{self, AstNode, NameOwner}, + ast::{self, AstNode}, match_ast, }; use test_utils::tested_by; @@ -115,15 +115,19 @@ pub fn classify_name(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option } fn classify_name_inner(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option<Definition> { - println!("name : {} -- {:?}", name, name); let parent = name.syntax().parent()?; - println!("parent : {} -- {:?}", parent, parent); match_ast! { match parent { ast::Alias(it) => { - let def = sema.to_def(&it)?; - Some(Definition::ModuleDef(def.into())) + tested_by!(goto_def_for_use_alias; force); + let use_tree = it.syntax().ancestors().find_map(ast::UseTree::cast)?; + let path = use_tree.path()?; + let path_segment = path.segment()?; + let name_ref = path_segment.name_ref()?; + let name_ref_class = classify_name_ref(sema, &name_ref)?; + + Some(name_ref_class.definition()) }, ast::BindPat(it) => { let local = sema.to_def(&it)?;