diff --git a/crates/ra_ide/test_data/highlighting.html b/crates/ra_ide/test_data/highlighting.html index efd725bcc5..23c25ad8ce 100644 --- a/crates/ra_ide/test_data/highlighting.html +++ b/crates/ra_ide/test_data/highlighting.html @@ -35,7 +35,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd .unresolved_reference { color: #FC5555; text-decoration: wavy underline; } -
use inner::{self as inner_mod};
+use inner::{self as inner_mod};
mod inner {}
#[derive(Clone, Debug)]
diff --git a/crates/ra_ide_db/src/defs.rs b/crates/ra_ide_db/src/defs.rs
index 66c0487141..b51000b03f 100644
--- a/crates/ra_ide_db/src/defs.rs
+++ b/crates/ra_ide_db/src/defs.rs
@@ -12,7 +12,7 @@ use hir::{
use ra_prof::profile;
use ra_syntax::{
ast::{self, AstNode},
- match_ast,
+ match_ast, SyntaxNode,
};
use crate::RootDatabase;
@@ -123,8 +123,27 @@ pub fn classify_name(sema: &Semantics, name: &ast::Name) -> Option
let use_tree = it.syntax().parent().and_then(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)?;
+ let name_ref_class = path_segment
+ .name_ref()
+ // The rename might be from a `self` token, so fallback to the name higher
+ // in the use tree.
+ .or_else(||{
+ if path_segment.self_token().is_none() {
+ return None;
+ }
+
+ let use_tree = use_tree
+ .syntax()
+ .parent()
+ .as_ref()
+ // Skip over UseTreeList
+ .and_then(SyntaxNode::parent)
+ .and_then(ast::UseTree::cast)?;
+ let path = use_tree.path()?;
+ let path_segment = path.segment()?;
+ path_segment.name_ref()
+ })
+ .and_then(|name_ref| classify_name_ref(sema, &name_ref))?;
Some(NameClass::Definition(name_ref_class.definition()))
},