diff options
Diffstat (limited to 'crates/ra_ide/src/references')
-rw-r--r-- | crates/ra_ide/src/references/classify.rs | 22 | ||||
-rw-r--r-- | crates/ra_ide/src/references/name_definition.rs | 2 |
2 files changed, 8 insertions, 16 deletions
diff --git a/crates/ra_ide/src/references/classify.rs b/crates/ra_ide/src/references/classify.rs index cb7da1fff..46cba30a3 100644 --- a/crates/ra_ide/src/references/classify.rs +++ b/crates/ra_ide/src/references/classify.rs | |||
@@ -1,6 +1,6 @@ | |||
1 | //! Functions that are used to classify an element from its definition or reference. | 1 | //! Functions that are used to classify an element from its definition or reference. |
2 | 2 | ||
3 | use hir::{InFile, Module, ModuleSource, PathResolution, SourceBinder}; | 3 | use hir::{InFile, PathResolution, SourceBinder}; |
4 | use ra_prof::profile; | 4 | use ra_prof::profile; |
5 | use ra_syntax::{ast, match_ast, AstNode}; | 5 | use ra_syntax::{ast, match_ast, AstNode}; |
6 | use test_utils::tested_by; | 6 | use test_utils::tested_by; |
@@ -35,16 +35,7 @@ pub(crate) fn classify_name( | |||
35 | Some(from_struct_field(sb.db, field)) | 35 | Some(from_struct_field(sb.db, field)) |
36 | }, | 36 | }, |
37 | ast::Module(it) => { | 37 | ast::Module(it) => { |
38 | let def = { | 38 | let def = sb.to_def(name.with_value(it))?; |
39 | if !it.has_semi() { | ||
40 | let ast = hir::ModuleSource::Module(it); | ||
41 | let src = name.with_value(ast); | ||
42 | hir::Module::from_definition(sb.db, src) | ||
43 | } else { | ||
44 | let src = name.with_value(it); | ||
45 | sb.to_def(src) | ||
46 | } | ||
47 | }?; | ||
48 | Some(from_module_def(sb.db, def.into(), None)) | 39 | Some(from_module_def(sb.db, def.into(), None)) |
49 | }, | 40 | }, |
50 | ast::StructDef(it) => { | 41 | ast::StructDef(it) => { |
@@ -103,8 +94,7 @@ pub(crate) fn classify_name( | |||
103 | let src = name.with_value(it); | 94 | let src = name.with_value(it); |
104 | let def = sb.to_def(src.clone())?; | 95 | let def = sb.to_def(src.clone())?; |
105 | 96 | ||
106 | let module_src = ModuleSource::from_child_node(sb.db, src.as_ref().map(|it| it.syntax())); | 97 | let module = sb.to_module_def(src.file_id.original_file(sb.db))?; |
107 | let module = Module::from_definition(sb.db, src.with_value(module_src))?; | ||
108 | 98 | ||
109 | Some(NameDefinition { | 99 | Some(NameDefinition { |
110 | visibility: None, | 100 | visibility: None, |
@@ -157,10 +147,9 @@ pub(crate) fn classify_name_ref( | |||
157 | } | 147 | } |
158 | } | 148 | } |
159 | 149 | ||
160 | let ast = ModuleSource::from_child_node(sb.db, name_ref.with_value(&parent)); | ||
161 | // FIXME: find correct container and visibility for each case | 150 | // FIXME: find correct container and visibility for each case |
162 | let container = Module::from_definition(sb.db, name_ref.with_value(ast))?; | ||
163 | let visibility = None; | 151 | let visibility = None; |
152 | let container = sb.to_module_def(name_ref.file_id.original_file(sb.db))?; | ||
164 | 153 | ||
165 | if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) { | 154 | if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) { |
166 | tested_by!(goto_def_for_macros); | 155 | tested_by!(goto_def_for_macros); |
@@ -178,12 +167,13 @@ pub(crate) fn classify_name_ref( | |||
178 | PathResolution::Def(def) => Some(from_module_def(sb.db, def, Some(container))), | 167 | PathResolution::Def(def) => Some(from_module_def(sb.db, def, Some(container))), |
179 | PathResolution::AssocItem(item) => Some(from_assoc_item(sb.db, item)), | 168 | PathResolution::AssocItem(item) => Some(from_assoc_item(sb.db, item)), |
180 | PathResolution::Local(local) => { | 169 | PathResolution::Local(local) => { |
181 | let container = local.module(sb.db); | ||
182 | let kind = NameKind::Local(local); | 170 | let kind = NameKind::Local(local); |
171 | let container = local.module(sb.db); | ||
183 | Some(NameDefinition { kind, container, visibility: None }) | 172 | Some(NameDefinition { kind, container, visibility: None }) |
184 | } | 173 | } |
185 | PathResolution::TypeParam(par) => { | 174 | PathResolution::TypeParam(par) => { |
186 | let kind = NameKind::TypeParam(par); | 175 | let kind = NameKind::TypeParam(par); |
176 | let container = par.module(sb.db); | ||
187 | Some(NameDefinition { kind, container, visibility }) | 177 | Some(NameDefinition { kind, container, visibility }) |
188 | } | 178 | } |
189 | PathResolution::Macro(def) => { | 179 | PathResolution::Macro(def) => { |
diff --git a/crates/ra_ide/src/references/name_definition.rs b/crates/ra_ide/src/references/name_definition.rs index 8c67c8863..1e4226ab9 100644 --- a/crates/ra_ide/src/references/name_definition.rs +++ b/crates/ra_ide/src/references/name_definition.rs | |||
@@ -25,6 +25,8 @@ pub enum NameKind { | |||
25 | #[derive(PartialEq, Eq)] | 25 | #[derive(PartialEq, Eq)] |
26 | pub(crate) struct NameDefinition { | 26 | pub(crate) struct NameDefinition { |
27 | pub visibility: Option<ast::Visibility>, | 27 | pub visibility: Option<ast::Visibility>, |
28 | /// FIXME: this doesn't really make sense. For example, builtin types don't | ||
29 | /// really have a module. | ||
28 | pub container: Module, | 30 | pub container: Module, |
29 | pub kind: NameKind, | 31 | pub kind: NameKind, |
30 | } | 32 | } |