diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-01-15 18:40:47 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-01-15 18:40:47 +0000 |
commit | 8a869e870ac6328967fb120a0ebe44a9c900eaf0 (patch) | |
tree | f4ad40fc09483af3e9fea77d4b4156130539a70c /crates/ide/src/goto_definition.rs | |
parent | 148e3d0f6a28f57565538dca7d9c0f5f726a5908 (diff) | |
parent | cb863390f23bc2eac6561d55def9bd3ba54605fc (diff) |
Merge #7288
7288: Handle self/super/crate in PathSegment as NameRef r=matklad a=Veykril
Wrapping self/super/crate in NameRef as per https://github.com/rust-analyzer/rust-analyzer/pull/7261#issuecomment-760023172
Co-authored-by: Lukas Wirth <[email protected]>
Diffstat (limited to 'crates/ide/src/goto_definition.rs')
-rw-r--r-- | crates/ide/src/goto_definition.rs | 35 |
1 files changed, 6 insertions, 29 deletions
diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs index cd4afc804..988a5668f 100644 --- a/crates/ide/src/goto_definition.rs +++ b/crates/ide/src/goto_definition.rs | |||
@@ -1,7 +1,6 @@ | |||
1 | use either::Either; | 1 | use either::Either; |
2 | use hir::{HasAttrs, ModuleDef, Semantics}; | 2 | use hir::{HasAttrs, ModuleDef, Semantics}; |
3 | use ide_db::{ | 3 | use ide_db::{ |
4 | base_db::FileId, | ||
5 | defs::{Definition, NameClass, NameRefClass}, | 4 | defs::{Definition, NameClass, NameRefClass}, |
6 | symbol_index, RootDatabase, | 5 | symbol_index, RootDatabase, |
7 | }; | 6 | }; |
@@ -13,7 +12,7 @@ use crate::{ | |||
13 | display::{ToNav, TryToNav}, | 12 | display::{ToNav, TryToNav}, |
14 | doc_links::extract_definitions_from_markdown, | 13 | doc_links::extract_definitions_from_markdown, |
15 | runnables::doc_owner_to_def, | 14 | runnables::doc_owner_to_def, |
16 | FilePosition, NavigationTarget, RangeInfo, SymbolKind, | 15 | FilePosition, NavigationTarget, RangeInfo, |
17 | }; | 16 | }; |
18 | 17 | ||
19 | // Feature: Go to Definition | 18 | // Feature: Go to Definition |
@@ -49,19 +48,6 @@ pub(crate) fn goto_definition( | |||
49 | let nav = def.try_to_nav(sema.db)?; | 48 | let nav = def.try_to_nav(sema.db)?; |
50 | vec![nav] | 49 | vec![nav] |
51 | }, | 50 | }, |
52 | ast::SelfParam(self_param) => { | ||
53 | vec![self_to_nav_target(self_param, position.file_id)?] | ||
54 | }, | ||
55 | ast::PathSegment(segment) => { | ||
56 | segment.self_token()?; | ||
57 | let path = segment.parent_path(); | ||
58 | if path.qualifier().is_some() && !ast::PathExpr::can_cast(path.syntax().parent()?.kind()) { | ||
59 | return None; | ||
60 | } | ||
61 | let func = segment.syntax().ancestors().find_map(ast::Fn::cast)?; | ||
62 | let self_param = func.param_list()?.self_param()?; | ||
63 | vec![self_to_nav_target(self_param, position.file_id)?] | ||
64 | }, | ||
65 | ast::Lifetime(lt) => if let Some(name_class) = NameClass::classify_lifetime(&sema, <) { | 51 | ast::Lifetime(lt) => if let Some(name_class) = NameClass::classify_lifetime(&sema, <) { |
66 | let def = name_class.referenced_or_defined(sema.db); | 52 | let def = name_class.referenced_or_defined(sema.db); |
67 | let nav = def.try_to_nav(sema.db)?; | 53 | let nav = def.try_to_nav(sema.db)?; |
@@ -69,6 +55,11 @@ pub(crate) fn goto_definition( | |||
69 | } else { | 55 | } else { |
70 | reference_definition(&sema, Either::Left(<)).to_vec() | 56 | reference_definition(&sema, Either::Left(<)).to_vec() |
71 | }, | 57 | }, |
58 | ast::SelfParam(self_param) => { | ||
59 | let def = NameClass::classify_self_param(&sema, &self_param)?.referenced_or_defined(sema.db); | ||
60 | let nav = def.try_to_nav(sema.db)?; | ||
61 | vec![nav] | ||
62 | }, | ||
72 | _ => return None, | 63 | _ => return None, |
73 | } | 64 | } |
74 | }; | 65 | }; |
@@ -134,20 +125,6 @@ fn pick_best(tokens: TokenAtOffset<SyntaxToken>) -> Option<SyntaxToken> { | |||
134 | } | 125 | } |
135 | } | 126 | } |
136 | 127 | ||
137 | fn self_to_nav_target(self_param: ast::SelfParam, file_id: FileId) -> Option<NavigationTarget> { | ||
138 | let self_token = self_param.self_token()?; | ||
139 | Some(NavigationTarget { | ||
140 | file_id, | ||
141 | full_range: self_param.syntax().text_range(), | ||
142 | focus_range: Some(self_token.text_range()), | ||
143 | name: self_token.text().clone(), | ||
144 | kind: Some(SymbolKind::SelfParam), | ||
145 | container_name: None, | ||
146 | description: None, | ||
147 | docs: None, | ||
148 | }) | ||
149 | } | ||
150 | |||
151 | #[derive(Debug)] | 128 | #[derive(Debug)] |
152 | pub(crate) enum ReferenceResult { | 129 | pub(crate) enum ReferenceResult { |
153 | Exact(NavigationTarget), | 130 | Exact(NavigationTarget), |