From ef6fed052cc563281c465d0ccd387826ae6d1e06 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 23 Jul 2021 02:14:59 +0200 Subject: [PATCH] Correctly classify Rename Names --- crates/ide/src/hover.rs | 59 +++++++++++++++++++++++++++++++++++++++ crates/ide_db/src/defs.rs | 44 +++++++++++++---------------- 2 files changed, 78 insertions(+), 25 deletions(-) diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs index 653833dd346..d0201d315db 100644 --- a/crates/ide/src/hover.rs +++ b/crates/ide/src/hover.rs @@ -3780,4 +3780,63 @@ fn hover_attr_path_qualifier() { "#]], ) } + + #[test] + fn hover_rename() { + check( + r#" +use self as foo$0; + "#, + expect![[r#" + *foo* + + ```rust + extern crate test + ``` + "#]], + ); + check( + r#" +mod bar {} +use bar::{self as foo$0}; + "#, + expect![[r#" + *foo* + + ```rust + test + ``` + + ```rust + mod bar + ``` + "#]], + ); + check( + r#" +mod bar { + use super as foo$0; +} + "#, + expect![[r#" + *foo* + + ```rust + extern crate test + ``` + "#]], + ); + check( + r#" +use crate as foo$0; + "#, + expect![[r#" + *foo* + + ```rust + extern crate test + ``` + "#]], + ); + } } diff --git a/crates/ide_db/src/defs.rs b/crates/ide_db/src/defs.rs index e9fb71fd8cd..28d68c6d3ed 100644 --- a/crates/ide_db/src/defs.rs +++ b/crates/ide_db/src/defs.rs @@ -10,8 +10,8 @@ PathResolution, Semantics, Visibility, }; use syntax::{ - ast::{self, AstNode, PathSegmentKind}, - match_ast, SyntaxKind, SyntaxNode, + ast::{self, AstNode}, + match_ast, SyntaxKind, }; use crate::RootDatabase; @@ -134,29 +134,23 @@ pub fn classify(sema: &Semantics, name: &ast::Name) -> Option { - 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() - }, - PathSegmentKind::Name(name_ref) => Some(name_ref), - _ => None, - } - }) - .and_then(|name_ref| NameRefClass::classify(sema, &name_ref))?; + let name_ref = path_segment.name_ref()?; + let name_ref = if name_ref.self_token().is_some() { + use_tree + .syntax() + .parent() + .as_ref() + // Skip over UseTreeList + .and_then(|it| { + let use_tree = it.parent().and_then(ast::UseTree::cast)?; + let path = use_tree.path()?; + let path_segment = path.segment()?; + path_segment.name_ref() + }).unwrap_or(name_ref) + } else { + name_ref + }; + let name_ref_class = NameRefClass::classify(sema, &name_ref)?; Some(NameClass::Definition(match name_ref_class { NameRefClass::Definition(def) => def,