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_db | |
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_db')
-rw-r--r-- | crates/ide_db/src/defs.rs | 45 | ||||
-rw-r--r-- | crates/ide_db/src/helpers/insert_use.rs | 10 | ||||
-rw-r--r-- | crates/ide_db/src/search.rs | 2 |
3 files changed, 36 insertions, 21 deletions
diff --git a/crates/ide_db/src/defs.rs b/crates/ide_db/src/defs.rs index d68fe42b0..231e886a9 100644 --- a/crates/ide_db/src/defs.rs +++ b/crates/ide_db/src/defs.rs | |||
@@ -10,7 +10,7 @@ use hir::{ | |||
10 | Module, ModuleDef, Name, PathResolution, Semantics, Visibility, | 10 | Module, ModuleDef, Name, PathResolution, Semantics, Visibility, |
11 | }; | 11 | }; |
12 | use syntax::{ | 12 | use syntax::{ |
13 | ast::{self, AstNode}, | 13 | ast::{self, AstNode, PathSegmentKind}, |
14 | match_ast, SyntaxKind, SyntaxNode, | 14 | match_ast, SyntaxKind, SyntaxNode, |
15 | }; | 15 | }; |
16 | 16 | ||
@@ -117,6 +117,13 @@ impl NameClass { | |||
117 | } | 117 | } |
118 | } | 118 | } |
119 | 119 | ||
120 | pub fn classify_self_param( | ||
121 | sema: &Semantics<RootDatabase>, | ||
122 | self_param: &ast::SelfParam, | ||
123 | ) -> Option<NameClass> { | ||
124 | sema.to_def(self_param).map(Definition::Local).map(NameClass::Definition) | ||
125 | } | ||
126 | |||
120 | pub fn classify(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option<NameClass> { | 127 | pub fn classify(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option<NameClass> { |
121 | let _p = profile::span("classify_name"); | 128 | let _p = profile::span("classify_name"); |
122 | 129 | ||
@@ -135,24 +142,26 @@ impl NameClass { | |||
135 | let path = use_tree.path()?; | 142 | let path = use_tree.path()?; |
136 | let path_segment = path.segment()?; | 143 | let path_segment = path.segment()?; |
137 | let name_ref_class = path_segment | 144 | let name_ref_class = path_segment |
138 | .name_ref() | 145 | .kind() |
139 | // The rename might be from a `self` token, so fallback to the name higher | 146 | .and_then(|kind| { |
140 | // in the use tree. | 147 | match kind { |
141 | .or_else(||{ | 148 | // The rename might be from a `self` token, so fallback to the name higher |
142 | if path_segment.self_token().is_none() { | 149 | // in the use tree. |
143 | return None; | 150 | PathSegmentKind::SelfKw => { |
151 | let use_tree = use_tree | ||
152 | .syntax() | ||
153 | .parent() | ||
154 | .as_ref() | ||
155 | // Skip over UseTreeList | ||
156 | .and_then(SyntaxNode::parent) | ||
157 | .and_then(ast::UseTree::cast)?; | ||
158 | let path = use_tree.path()?; | ||
159 | let path_segment = path.segment()?; | ||
160 | path_segment.name_ref() | ||
161 | }, | ||
162 | PathSegmentKind::Name(name_ref) => Some(name_ref), | ||
163 | _ => return None, | ||
144 | } | 164 | } |
145 | |||
146 | let use_tree = use_tree | ||
147 | .syntax() | ||
148 | .parent() | ||
149 | .as_ref() | ||
150 | // Skip over UseTreeList | ||
151 | .and_then(SyntaxNode::parent) | ||
152 | .and_then(ast::UseTree::cast)?; | ||
153 | let path = use_tree.path()?; | ||
154 | let path_segment = path.segment()?; | ||
155 | path_segment.name_ref() | ||
156 | }) | 165 | }) |
157 | .and_then(|name_ref| NameRefClass::classify(sema, &name_ref))?; | 166 | .and_then(|name_ref| NameRefClass::classify(sema, &name_ref))?; |
158 | 167 | ||
diff --git a/crates/ide_db/src/helpers/insert_use.rs b/crates/ide_db/src/helpers/insert_use.rs index d6b498be3..0c180e9bc 100644 --- a/crates/ide_db/src/helpers/insert_use.rs +++ b/crates/ide_db/src/helpers/insert_use.rs | |||
@@ -444,8 +444,14 @@ fn use_tree_path_cmp(a: &ast::Path, a_has_tl: bool, b: &ast::Path, b_has_tl: boo | |||
444 | } | 444 | } |
445 | 445 | ||
446 | fn path_segment_cmp(a: &ast::PathSegment, b: &ast::PathSegment) -> Ordering { | 446 | fn path_segment_cmp(a: &ast::PathSegment, b: &ast::PathSegment) -> Ordering { |
447 | let a = a.name_ref(); | 447 | let a = a.kind().and_then(|kind| match kind { |
448 | let b = b.name_ref(); | 448 | PathSegmentKind::Name(name_ref) => Some(name_ref), |
449 | _ => None, | ||
450 | }); | ||
451 | let b = b.kind().and_then(|kind| match kind { | ||
452 | PathSegmentKind::Name(name_ref) => Some(name_ref), | ||
453 | _ => None, | ||
454 | }); | ||
449 | a.as_ref().map(ast::NameRef::text).cmp(&b.as_ref().map(ast::NameRef::text)) | 455 | a.as_ref().map(ast::NameRef::text).cmp(&b.as_ref().map(ast::NameRef::text)) |
450 | } | 456 | } |
451 | 457 | ||
diff --git a/crates/ide_db/src/search.rs b/crates/ide_db/src/search.rs index b5fa46642..0ecb13a64 100644 --- a/crates/ide_db/src/search.rs +++ b/crates/ide_db/src/search.rs | |||
@@ -65,7 +65,7 @@ pub enum ReferenceKind { | |||
65 | FieldShorthandForLocal, | 65 | FieldShorthandForLocal, |
66 | StructLiteral, | 66 | StructLiteral, |
67 | RecordFieldExprOrPat, | 67 | RecordFieldExprOrPat, |
68 | SelfKw, | 68 | SelfParam, |
69 | EnumLiteral, | 69 | EnumLiteral, |
70 | Lifetime, | 70 | Lifetime, |
71 | Other, | 71 | Other, |