aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src/references/classify.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide_api/src/references/classify.rs')
-rw-r--r--crates/ra_ide_api/src/references/classify.rs17
1 files changed, 7 insertions, 10 deletions
diff --git a/crates/ra_ide_api/src/references/classify.rs b/crates/ra_ide_api/src/references/classify.rs
index f12b58cb9..5ca9da15e 100644
--- a/crates/ra_ide_api/src/references/classify.rs
+++ b/crates/ra_ide_api/src/references/classify.rs
@@ -123,14 +123,12 @@ pub(crate) fn classify_name(
123 123
124pub(crate) fn classify_name_ref( 124pub(crate) fn classify_name_ref(
125 db: &RootDatabase, 125 db: &RootDatabase,
126 file_id: FileId, 126 name_ref: Source<&ast::NameRef>,
127 name_ref: &ast::NameRef,
128) -> Option<NameDefinition> { 127) -> Option<NameDefinition> {
129 let _p = profile("classify_name_ref"); 128 let _p = profile("classify_name_ref");
130 129
131 let parent = name_ref.syntax().parent()?; 130 let parent = name_ref.ast.syntax().parent()?;
132 let analyzer = 131 let analyzer = SourceAnalyzer::new(db, name_ref.map(|it| it.syntax()), None);
133 SourceAnalyzer::new(db, hir::Source::new(file_id.into(), name_ref.syntax()), None);
134 132
135 if let Some(method_call) = ast::MethodCallExpr::cast(parent.clone()) { 133 if let Some(method_call) = ast::MethodCallExpr::cast(parent.clone()) {
136 tested_by!(goto_definition_works_for_methods); 134 tested_by!(goto_definition_works_for_methods);
@@ -150,17 +148,16 @@ pub(crate) fn classify_name_ref(
150 tested_by!(goto_definition_works_for_record_fields); 148 tested_by!(goto_definition_works_for_record_fields);
151 if let Some(record_lit) = record_field.syntax().ancestors().find_map(ast::RecordLit::cast) { 149 if let Some(record_lit) = record_field.syntax().ancestors().find_map(ast::RecordLit::cast) {
152 let variant_def = analyzer.resolve_record_literal(&record_lit)?; 150 let variant_def = analyzer.resolve_record_literal(&record_lit)?;
153 let hir_path = Path::from_name_ref(name_ref); 151 let hir_path = Path::from_name_ref(name_ref.ast);
154 let hir_name = hir_path.as_ident()?; 152 let hir_name = hir_path.as_ident()?;
155 let field = variant_def.field(db, hir_name)?; 153 let field = variant_def.field(db, hir_name)?;
156 return Some(from_struct_field(db, field)); 154 return Some(from_struct_field(db, field));
157 } 155 }
158 } 156 }
159 157
160 let file_id = file_id.into(); 158 let ast = ModuleSource::from_child_node(db, name_ref.with_ast(&parent));
161 let ast = ModuleSource::from_child_node(db, Source::new(file_id, &parent));
162 // FIXME: find correct container and visibility for each case 159 // FIXME: find correct container and visibility for each case
163 let container = Module::from_definition(db, Source { file_id, ast })?; 160 let container = Module::from_definition(db, name_ref.with_ast(ast))?;
164 let visibility = None; 161 let visibility = None;
165 162
166 if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) { 163 if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) {
@@ -171,7 +168,7 @@ pub(crate) fn classify_name_ref(
171 } 168 }
172 } 169 }
173 170
174 let path = name_ref.syntax().ancestors().find_map(ast::Path::cast)?; 171 let path = name_ref.ast.syntax().ancestors().find_map(ast::Path::cast)?;
175 let resolved = analyzer.resolve_path(db, &path)?; 172 let resolved = analyzer.resolve_path(db, &path)?;
176 match resolved { 173 match resolved {
177 PathResolution::Def(def) => Some(from_module_def(db, def, Some(container))), 174 PathResolution::Def(def) => Some(from_module_def(db, def, Some(container))),