mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 21:05:02 +00:00
Handle self/super/crate in PathSegment as NameRef
This commit is contained in:
parent
0c58aa9dc0
commit
cb863390f2
42 changed files with 258 additions and 254 deletions
|
@ -1,7 +1,6 @@
|
|||
use either::Either;
|
||||
use hir::{HasAttrs, ModuleDef, Semantics};
|
||||
use ide_db::{
|
||||
base_db::FileId,
|
||||
defs::{Definition, NameClass, NameRefClass},
|
||||
symbol_index, RootDatabase,
|
||||
};
|
||||
|
@ -13,7 +12,7 @@ use crate::{
|
|||
display::{ToNav, TryToNav},
|
||||
doc_links::extract_definitions_from_markdown,
|
||||
runnables::doc_owner_to_def,
|
||||
FilePosition, NavigationTarget, RangeInfo, SymbolKind,
|
||||
FilePosition, NavigationTarget, RangeInfo,
|
||||
};
|
||||
|
||||
// Feature: Go to Definition
|
||||
|
@ -49,19 +48,6 @@ pub(crate) fn goto_definition(
|
|||
let nav = def.try_to_nav(sema.db)?;
|
||||
vec![nav]
|
||||
},
|
||||
ast::SelfParam(self_param) => {
|
||||
vec![self_to_nav_target(self_param, position.file_id)?]
|
||||
},
|
||||
ast::PathSegment(segment) => {
|
||||
segment.self_token()?;
|
||||
let path = segment.parent_path();
|
||||
if path.qualifier().is_some() && !ast::PathExpr::can_cast(path.syntax().parent()?.kind()) {
|
||||
return None;
|
||||
}
|
||||
let func = segment.syntax().ancestors().find_map(ast::Fn::cast)?;
|
||||
let self_param = func.param_list()?.self_param()?;
|
||||
vec![self_to_nav_target(self_param, position.file_id)?]
|
||||
},
|
||||
ast::Lifetime(lt) => if let Some(name_class) = NameClass::classify_lifetime(&sema, <) {
|
||||
let def = name_class.referenced_or_defined(sema.db);
|
||||
let nav = def.try_to_nav(sema.db)?;
|
||||
|
@ -69,6 +55,11 @@ pub(crate) fn goto_definition(
|
|||
} else {
|
||||
reference_definition(&sema, Either::Left(<)).to_vec()
|
||||
},
|
||||
ast::SelfParam(self_param) => {
|
||||
let def = NameClass::classify_self_param(&sema, &self_param)?.referenced_or_defined(sema.db);
|
||||
let nav = def.try_to_nav(sema.db)?;
|
||||
vec![nav]
|
||||
},
|
||||
_ => return None,
|
||||
}
|
||||
};
|
||||
|
@ -134,20 +125,6 @@ fn pick_best(tokens: TokenAtOffset<SyntaxToken>) -> Option<SyntaxToken> {
|
|||
}
|
||||
}
|
||||
|
||||
fn self_to_nav_target(self_param: ast::SelfParam, file_id: FileId) -> Option<NavigationTarget> {
|
||||
let self_token = self_param.self_token()?;
|
||||
Some(NavigationTarget {
|
||||
file_id,
|
||||
full_range: self_param.syntax().text_range(),
|
||||
focus_range: Some(self_token.text_range()),
|
||||
name: self_token.text().clone(),
|
||||
kind: Some(SymbolKind::SelfParam),
|
||||
container_name: None,
|
||||
description: None,
|
||||
docs: None,
|
||||
})
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(crate) enum ReferenceResult {
|
||||
Exact(NavigationTarget),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue