aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/module_tree.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/module_tree.rs')
-rw-r--r--crates/ra_hir/src/module_tree.rs31
1 files changed, 14 insertions, 17 deletions
diff --git a/crates/ra_hir/src/module_tree.rs b/crates/ra_hir/src/module_tree.rs
index fd5a92c5b..0256d7996 100644
--- a/crates/ra_hir/src/module_tree.rs
+++ b/crates/ra_hir/src/module_tree.rs
@@ -3,7 +3,7 @@ use std::sync::Arc;
3use rustc_hash::{FxHashMap, FxHashSet}; 3use rustc_hash::{FxHashMap, FxHashSet};
4use arrayvec::ArrayVec; 4use arrayvec::ArrayVec;
5use relative_path::RelativePathBuf; 5use relative_path::RelativePathBuf;
6use ra_db::{FileId, SourceRootId, Cancelable, SourceRoot}; 6use ra_db::{FileId, SourceRootId, SourceRoot};
7use ra_syntax::{ 7use ra_syntax::{
8 SyntaxNode, TreeArc, 8 SyntaxNode, TreeArc,
9 algo::generate, 9 algo::generate,
@@ -41,7 +41,7 @@ impl Submodule {
41 pub(crate) fn submodules_query( 41 pub(crate) fn submodules_query(
42 db: &impl HirDatabase, 42 db: &impl HirDatabase,
43 source: SourceItemId, 43 source: SourceItemId,
44 ) -> Cancelable<Arc<Vec<Submodule>>> { 44 ) -> Arc<Vec<Submodule>> {
45 db.check_canceled(); 45 db.check_canceled();
46 let file_id = source.file_id; 46 let file_id = source.file_id;
47 let file_items = db.file_items(file_id); 47 let file_items = db.file_items(file_id);
@@ -54,7 +54,7 @@ impl Submodule {
54 collect_submodules(file_id, &file_items, module.item_list().unwrap()) 54 collect_submodules(file_id, &file_items, module.item_list().unwrap())
55 } 55 }
56 }; 56 };
57 return Ok(Arc::new(submodules)); 57 return Arc::new(submodules);
58 58
59 fn collect_submodules( 59 fn collect_submodules(
60 file_id: HirFileId, 60 file_id: HirFileId,
@@ -116,10 +116,10 @@ impl ModuleTree {
116 pub(crate) fn module_tree_query( 116 pub(crate) fn module_tree_query(
117 db: &impl HirDatabase, 117 db: &impl HirDatabase,
118 source_root: SourceRootId, 118 source_root: SourceRootId,
119 ) -> Cancelable<Arc<ModuleTree>> { 119 ) -> Arc<ModuleTree> {
120 db.check_canceled(); 120 db.check_canceled();
121 let res = create_module_tree(db, source_root); 121 let res = create_module_tree(db, source_root);
122 Ok(Arc::new(res?)) 122 Arc::new(res)
123 } 123 }
124 124
125 pub(crate) fn modules<'a>(&'a self) -> impl Iterator<Item = ModuleId> + 'a { 125 pub(crate) fn modules<'a>(&'a self) -> impl Iterator<Item = ModuleId> + 'a {
@@ -225,10 +225,7 @@ fn modules(root: &impl ast::ModuleItemOwner) -> impl Iterator<Item = (Name, &ast
225 }) 225 })
226} 226}
227 227
228fn create_module_tree<'a>( 228fn create_module_tree<'a>(db: &impl HirDatabase, source_root: SourceRootId) -> ModuleTree {
229 db: &impl HirDatabase,
230 source_root: SourceRootId,
231) -> Cancelable<ModuleTree> {
232 let mut tree = ModuleTree::default(); 229 let mut tree = ModuleTree::default();
233 230
234 let mut roots = FxHashMap::default(); 231 let mut roots = FxHashMap::default();
@@ -252,10 +249,10 @@ fn create_module_tree<'a>(
252 &mut roots, 249 &mut roots,
253 None, 250 None,
254 source, 251 source,
255 )?; 252 );
256 roots.insert(file_id, module_id); 253 roots.insert(file_id, module_id);
257 } 254 }
258 Ok(tree) 255 tree
259} 256}
260 257
261fn build_subtree( 258fn build_subtree(
@@ -266,14 +263,14 @@ fn build_subtree(
266 roots: &mut FxHashMap<FileId, ModuleId>, 263 roots: &mut FxHashMap<FileId, ModuleId>,
267 parent: Option<LinkId>, 264 parent: Option<LinkId>,
268 source: SourceItemId, 265 source: SourceItemId,
269) -> Cancelable<ModuleId> { 266) -> ModuleId {
270 visited.insert(source); 267 visited.insert(source);
271 let id = tree.push_mod(ModuleData { 268 let id = tree.push_mod(ModuleData {
272 source, 269 source,
273 parent, 270 parent,
274 children: Vec::new(), 271 children: Vec::new(),
275 }); 272 });
276 for sub in db.submodules(source)?.iter() { 273 for sub in db.submodules(source).iter() {
277 let link = tree.push_link(LinkData { 274 let link = tree.push_link(LinkData {
278 source: sub.source, 275 source: sub.source,
279 name: sub.name.clone(), 276 name: sub.name.clone(),
@@ -289,7 +286,7 @@ fn build_subtree(
289 .map(|file_id| match roots.remove(&file_id) { 286 .map(|file_id| match roots.remove(&file_id) {
290 Some(module_id) => { 287 Some(module_id) => {
291 tree.mods[module_id].parent = Some(link); 288 tree.mods[module_id].parent = Some(link);
292 Ok(module_id) 289 module_id
293 } 290 }
294 None => build_subtree( 291 None => build_subtree(
295 db, 292 db,
@@ -304,7 +301,7 @@ fn build_subtree(
304 }, 301 },
305 ), 302 ),
306 }) 303 })
307 .collect::<Cancelable<Vec<_>>>()?; 304 .collect::<Vec<_>>();
308 (points_to, problem) 305 (points_to, problem)
309 } else { 306 } else {
310 let points_to = build_subtree( 307 let points_to = build_subtree(
@@ -315,14 +312,14 @@ fn build_subtree(
315 roots, 312 roots,
316 Some(link), 313 Some(link),
317 sub.source, 314 sub.source,
318 )?; 315 );
319 (vec![points_to], None) 316 (vec![points_to], None)
320 }; 317 };
321 318
322 tree.links[link].points_to = points_to; 319 tree.links[link].points_to = points_to;
323 tree.links[link].problem = problem; 320 tree.links[link].problem = problem;
324 } 321 }
325 Ok(id) 322 id
326} 323}
327 324
328fn resolve_submodule( 325fn resolve_submodule(