aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_analysis/src/imp.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-11-05 11:10:20 +0000
committerAleksey Kladov <[email protected]>2018-11-05 11:10:20 +0000
commit6bbcfca7aec6408cf27415ae6f965adc472d6f18 (patch)
tree7b332c6db6e662ca31aafded143476d81a60453f /crates/ra_analysis/src/imp.rs
parent44d891938493cc32efd2e44d81bc76cc3bc391c0 (diff)
Fully add inline modules to module tree
Diffstat (limited to 'crates/ra_analysis/src/imp.rs')
-rw-r--r--crates/ra_analysis/src/imp.rs27
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))