diff options
Diffstat (limited to 'crates/ra_analysis/src/imp.rs')
-rw-r--r-- | crates/ra_analysis/src/imp.rs | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs index 823ac9bdd..704648b59 100644 --- a/crates/ra_analysis/src/imp.rs +++ b/crates/ra_analysis/src/imp.rs | |||
@@ -220,27 +220,32 @@ impl AnalysisImpl { | |||
220 | let source_root = self.db.file_source_root(file_id); | 220 | let source_root = self.db.file_source_root(file_id); |
221 | self.db.module_tree(source_root) | 221 | self.db.module_tree(source_root) |
222 | } | 222 | } |
223 | pub fn parent_module(&self, file_id: FileId) -> Cancelable<Vec<(FileId, FileSymbol)>> { | 223 | pub fn parent_module( |
224 | &self, | ||
225 | file_id: FileId, | ||
226 | offset: TextUnit, | ||
227 | ) -> Cancelable<Vec<(FileId, FileSymbol)>> { | ||
224 | let module_tree = self.module_tree(file_id)?; | 228 | let module_tree = self.module_tree(file_id)?; |
229 | let file = self.db.file_syntax(file_id); | ||
230 | let module_source = match find_node_at_offset::<ast::Module>(file.syntax(), offset) { | ||
231 | Some(m) if !m.has_semi() => ModuleSource::new_inline(file_id, m), | ||
232 | _ => ModuleSource::File(file_id), | ||
233 | }; | ||
225 | 234 | ||
226 | let res = module_tree | 235 | let res = module_tree |
227 | .modules_for_source(ModuleSource::File(file_id)) | 236 | .modules_for_source(module_source) |
228 | .into_iter() | 237 | .into_iter() |
229 | .filter_map(|module_id| { | 238 | .filter_map(|module_id| { |
230 | let link = module_id.parent_link(&module_tree)?; | 239 | let link = module_id.parent_link(&module_tree)?; |
231 | let file_id = match link.owner(&module_tree).source(&module_tree) { | 240 | let file_id = link.owner(&module_tree).source(&module_tree).file_id(); |
232 | ModuleSource::File(file_id) => file_id, | ||
233 | ModuleSource::Inline(..) => { | ||
234 | //TODO: https://github.com/rust-analyzer/rust-analyzer/issues/181 | ||
235 | return None; | ||
236 | } | ||
237 | }; | ||
238 | let decl = link.bind_source(&module_tree, &*self.db); | 241 | let decl = link.bind_source(&module_tree, &*self.db); |
239 | let decl = decl.ast(); | 242 | let decl = decl.ast(); |
240 | 243 | ||
244 | let decl_name = decl.name().unwrap(); | ||
245 | |||
241 | let sym = FileSymbol { | 246 | let sym = FileSymbol { |
242 | name: decl.name().unwrap().text(), | 247 | name: decl_name.text(), |
243 | node_range: decl.syntax().range(), | 248 | node_range: decl_name.syntax().range(), |
244 | kind: MODULE, | 249 | kind: MODULE, |
245 | }; | 250 | }; |
246 | Some((file_id, sym)) | 251 | Some((file_id, sym)) |