aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src/references/classify.rs
diff options
context:
space:
mode:
authorEkaterina Babshukova <[email protected]>2019-10-22 21:46:53 +0100
committerEkaterina Babshukova <[email protected]>2019-10-22 22:35:06 +0100
commitdecfd28bd14b56befa17257694caacc57a090939 (patch)
treecdf5a5b39600b41a9eee301b9760cde1282aeb33 /crates/ra_ide_api/src/references/classify.rs
parentb5a3ee93e24931c8bba628ddc7be4f098a19a326 (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.rs8
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
3use hir::{Either, FromSource, Module, ModuleSource, Path, PathResolution, Source, SourceAnalyzer}; 3use hir::{Either, FromSource, Module, ModuleSource, Path, PathResolution, Source, SourceAnalyzer};
4use ra_db::FileId; 4use ra_db::FileId;
5use ra_syntax::{ast, match_ast, AstNode, AstPtr}; 5use ra_syntax::{ast, match_ast, AstNode, AstPtr};
6use test_utils::tested_by;
6 7
7use super::{ 8use 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, &macro_call) { 147 if let Some(macro_def) = analyzer.resolve_macro_call(db, &macro_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 }