diff options
author | Ekaterina Babshukova <[email protected]> | 2019-10-22 21:46:53 +0100 |
---|---|---|
committer | Ekaterina Babshukova <[email protected]> | 2019-10-22 22:35:06 +0100 |
commit | decfd28bd14b56befa17257694caacc57a090939 (patch) | |
tree | cdf5a5b39600b41a9eee301b9760cde1282aeb33 /crates/ra_ide_api/src/references/classify.rs | |
parent | b5a3ee93e24931c8bba628ddc7be4f098a19a326 (diff) |
some fixes, add docs
Diffstat (limited to 'crates/ra_ide_api/src/references/classify.rs')
-rw-r--r-- | crates/ra_ide_api/src/references/classify.rs | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/crates/ra_ide_api/src/references/classify.rs b/crates/ra_ide_api/src/references/classify.rs index 3beab9861..c8daff9b1 100644 --- a/crates/ra_ide_api/src/references/classify.rs +++ b/crates/ra_ide_api/src/references/classify.rs | |||
@@ -1,8 +1,9 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! Functions that are used to classify an element from its definition or reference. |
2 | 2 | ||
3 | use hir::{Either, FromSource, Module, ModuleSource, Path, PathResolution, Source, SourceAnalyzer}; | 3 | use hir::{Either, FromSource, Module, ModuleSource, Path, PathResolution, Source, SourceAnalyzer}; |
4 | use ra_db::FileId; | 4 | use ra_db::FileId; |
5 | use ra_syntax::{ast, match_ast, AstNode, AstPtr}; | 5 | use ra_syntax::{ast, match_ast, AstNode, AstPtr}; |
6 | use test_utils::tested_by; | ||
6 | 7 | ||
7 | use super::{ | 8 | use super::{ |
8 | name_definition::{from_assoc_item, from_module_def, from_pat, from_struct_field}, | 9 | name_definition::{from_assoc_item, from_module_def, from_pat, from_struct_field}, |
@@ -111,18 +112,21 @@ pub(crate) fn classify_name_ref( | |||
111 | let analyzer = SourceAnalyzer::new(db, file_id, name_ref.syntax(), None); | 112 | let analyzer = SourceAnalyzer::new(db, file_id, name_ref.syntax(), None); |
112 | 113 | ||
113 | if let Some(method_call) = ast::MethodCallExpr::cast(parent.clone()) { | 114 | if let Some(method_call) = ast::MethodCallExpr::cast(parent.clone()) { |
115 | tested_by!(goto_definition_works_for_methods); | ||
114 | if let Some(func) = analyzer.resolve_method_call(&method_call) { | 116 | if let Some(func) = analyzer.resolve_method_call(&method_call) { |
115 | return Some(from_assoc_item(db, func.into())); | 117 | return Some(from_assoc_item(db, func.into())); |
116 | } | 118 | } |
117 | } | 119 | } |
118 | 120 | ||
119 | if let Some(field_expr) = ast::FieldExpr::cast(parent.clone()) { | 121 | if let Some(field_expr) = ast::FieldExpr::cast(parent.clone()) { |
122 | tested_by!(goto_definition_works_for_fields); | ||
120 | if let Some(field) = analyzer.resolve_field(&field_expr) { | 123 | if let Some(field) = analyzer.resolve_field(&field_expr) { |
121 | return Some(from_struct_field(db, field)); | 124 | return Some(from_struct_field(db, field)); |
122 | } | 125 | } |
123 | } | 126 | } |
124 | 127 | ||
125 | if let Some(record_field) = ast::RecordField::cast(parent.clone()) { | 128 | if let Some(record_field) = ast::RecordField::cast(parent.clone()) { |
129 | tested_by!(goto_definition_works_for_record_fields); | ||
126 | if let Some(record_lit) = record_field.syntax().ancestors().find_map(ast::RecordLit::cast) { | 130 | if let Some(record_lit) = record_field.syntax().ancestors().find_map(ast::RecordLit::cast) { |
127 | let variant_def = analyzer.resolve_record_literal(&record_lit)?; | 131 | let variant_def = analyzer.resolve_record_literal(&record_lit)?; |
128 | let hir_path = Path::from_name_ref(name_ref); | 132 | let hir_path = Path::from_name_ref(name_ref); |
@@ -139,6 +143,7 @@ pub(crate) fn classify_name_ref( | |||
139 | let visibility = None; | 143 | let visibility = None; |
140 | 144 | ||
141 | if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) { | 145 | if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) { |
146 | tested_by!(goto_definition_works_for_macros); | ||
142 | if let Some(macro_def) = analyzer.resolve_macro_call(db, ¯o_call) { | 147 | if let Some(macro_def) = analyzer.resolve_macro_call(db, ¯o_call) { |
143 | let kind = NameKind::Macro(macro_def); | 148 | let kind = NameKind::Macro(macro_def); |
144 | return Some(NameDefinition { kind, container, visibility }); | 149 | return Some(NameDefinition { kind, container, visibility }); |
@@ -152,7 +157,6 @@ pub(crate) fn classify_name_ref( | |||
152 | AssocItem(item) => Some(from_assoc_item(db, item)), | 157 | AssocItem(item) => Some(from_assoc_item(db, item)), |
153 | LocalBinding(Either::A(pat)) => from_pat(db, file_id, pat), | 158 | LocalBinding(Either::A(pat)) => from_pat(db, file_id, pat), |
154 | LocalBinding(Either::B(par)) => { | 159 | LocalBinding(Either::B(par)) => { |
155 | // Not really supported | ||
156 | let kind = NameKind::SelfParam(par); | 160 | let kind = NameKind::SelfParam(par); |
157 | Some(NameDefinition { kind, container, visibility }) | 161 | Some(NameDefinition { kind, container, visibility }) |
158 | } | 162 | } |