From 4e2e3543c72b5963eb91b94b8180fecf268930e3 Mon Sep 17 00:00:00 2001 From: Paul Daniel Faria Date: Tue, 4 Aug 2020 09:28:40 -0400 Subject: When resolving a rename, fallback to the name higher in the use tree if the path segment is `self` --- crates/ra_ide_db/src/defs.rs | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'crates/ra_ide_db') diff --git a/crates/ra_ide_db/src/defs.rs b/crates/ra_ide_db/src/defs.rs index 66c048714..b51000b03 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())) }, -- cgit v1.2.3