From f2772e29aeda5e35c282f3b023ce9d470f3fb441 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 31 Aug 2018 19:14:08 +0300 Subject: add crate graph --- crates/libanalysis/src/module_map.rs | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) (limited to 'crates/libanalysis/src/module_map.rs') diff --git a/crates/libanalysis/src/module_map.rs b/crates/libanalysis/src/module_map.rs index 47c0018e1..38935807d 100644 --- a/crates/libanalysis/src/module_map.rs +++ b/crates/libanalysis/src/module_map.rs @@ -91,16 +91,38 @@ impl ModuleMap { file_resolver: &FileResolver, syntax_provider: &SyntaxProvider, ) -> Vec<(ModuleId, SmolStr, SyntaxNode)> { - let links = self.links(file_resolver, syntax_provider); - let res = links + let mut res = Vec::new(); + self.for_each_parent_link(m, file_resolver, syntax_provider, |link| { + res.push( + (link.owner, link.name().clone(), link.syntax.clone()) + ) + }); + res + } + + pub fn parent_module_ids( + &self, + m: ModuleId, + file_resolver: &FileResolver, + syntax_provider: &SyntaxProvider, + ) -> Vec { + let mut res = Vec::new(); + self.for_each_parent_link(m, file_resolver, syntax_provider, |link| res.push(link.owner)); + res + } + + fn for_each_parent_link( + &self, + m: ModuleId, + file_resolver: &FileResolver, + syntax_provider: &SyntaxProvider, + f: impl FnMut(&Link) + ) { + self.links(file_resolver, syntax_provider) .links .iter() .filter(move |link| link.points_to.iter().any(|&it| it == m)) - .map(|link| { - (link.owner, link.name().clone(), link.syntax.clone()) - }) - .collect(); - res + .for_each(f) } pub fn problems( -- cgit v1.2.3