mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-24 12:03:31 +00:00
When resolving a rename, fallback to the name higher in the use tree if the path segment is self
This commit is contained in:
parent
cc3eb85311
commit
4e2e3543c7
2 changed files with 23 additions and 4 deletions
|
@ -35,7 +35,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
|
||||||
|
|
||||||
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
|
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
|
||||||
</style>
|
</style>
|
||||||
<pre><code><span class="keyword">use</span> <span class="module">inner</span><span class="operator">::</span><span class="punctuation">{</span><span class="self_keyword">self</span> <span class="keyword">as</span> <span class="unresolved_reference declaration">inner_mod</span><span class="punctuation">}</span><span class="punctuation">;</span>
|
<pre><code><span class="keyword">use</span> <span class="module">inner</span><span class="operator">::</span><span class="punctuation">{</span><span class="self_keyword">self</span> <span class="keyword">as</span> <span class="module declaration">inner_mod</span><span class="punctuation">}</span><span class="punctuation">;</span>
|
||||||
<span class="keyword">mod</span> <span class="module declaration">inner</span> <span class="punctuation">{</span><span class="punctuation">}</span>
|
<span class="keyword">mod</span> <span class="module declaration">inner</span> <span class="punctuation">{</span><span class="punctuation">}</span>
|
||||||
|
|
||||||
<span class="attribute">#</span><span class="attribute">[</span><span class="function attribute">derive</span><span class="punctuation">(</span><span class="attribute">Clone</span><span class="punctuation">,</span><span class="attribute"> Debug</span><span class="punctuation">)</span><span class="attribute">]</span>
|
<span class="attribute">#</span><span class="attribute">[</span><span class="function attribute">derive</span><span class="punctuation">(</span><span class="attribute">Clone</span><span class="punctuation">,</span><span class="attribute"> Debug</span><span class="punctuation">)</span><span class="attribute">]</span>
|
||||||
|
|
|
@ -12,7 +12,7 @@ use hir::{
|
||||||
use ra_prof::profile;
|
use ra_prof::profile;
|
||||||
use ra_syntax::{
|
use ra_syntax::{
|
||||||
ast::{self, AstNode},
|
ast::{self, AstNode},
|
||||||
match_ast,
|
match_ast, SyntaxNode,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::RootDatabase;
|
use crate::RootDatabase;
|
||||||
|
@ -123,8 +123,27 @@ pub fn classify_name(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option
|
||||||
let use_tree = it.syntax().parent().and_then(ast::UseTree::cast)?;
|
let use_tree = it.syntax().parent().and_then(ast::UseTree::cast)?;
|
||||||
let path = use_tree.path()?;
|
let path = use_tree.path()?;
|
||||||
let path_segment = path.segment()?;
|
let path_segment = path.segment()?;
|
||||||
let name_ref = path_segment.name_ref()?;
|
let name_ref_class = path_segment
|
||||||
let name_ref_class = classify_name_ref(sema, &name_ref)?;
|
.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()))
|
Some(NameClass::Definition(name_ref_class.definition()))
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue