aboutsummaryrefslogtreecommitdiff
path: root/crates/libanalysis/src/module_map.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-08-31 17:14:08 +0100
committerAleksey Kladov <[email protected]>2018-08-31 17:14:08 +0100
commitf2772e29aeda5e35c282f3b023ce9d470f3fb441 (patch)
treef517fd3d40f569de0d4dbb2529f38c9d470b2db9 /crates/libanalysis/src/module_map.rs
parent7a5bc94774a50837f8c9bf8b96c8272882aca640 (diff)
add crate graph
Diffstat (limited to 'crates/libanalysis/src/module_map.rs')
-rw-r--r--crates/libanalysis/src/module_map.rs36
1 files changed, 29 insertions, 7 deletions
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 {
91 file_resolver: &FileResolver, 91 file_resolver: &FileResolver,
92 syntax_provider: &SyntaxProvider, 92 syntax_provider: &SyntaxProvider,
93 ) -> Vec<(ModuleId, SmolStr, SyntaxNode)> { 93 ) -> Vec<(ModuleId, SmolStr, SyntaxNode)> {
94 let links = self.links(file_resolver, syntax_provider); 94 let mut res = Vec::new();
95 let res = links 95 self.for_each_parent_link(m, file_resolver, syntax_provider, |link| {
96 res.push(
97 (link.owner, link.name().clone(), link.syntax.clone())
98 )
99 });
100 res
101 }
102
103 pub fn parent_module_ids(
104 &self,
105 m: ModuleId,
106 file_resolver: &FileResolver,
107 syntax_provider: &SyntaxProvider,
108 ) -> Vec<ModuleId> {
109 let mut res = Vec::new();
110 self.for_each_parent_link(m, file_resolver, syntax_provider, |link| res.push(link.owner));
111 res
112 }
113
114 fn for_each_parent_link(
115 &self,
116 m: ModuleId,
117 file_resolver: &FileResolver,
118 syntax_provider: &SyntaxProvider,
119 f: impl FnMut(&Link)
120 ) {
121 self.links(file_resolver, syntax_provider)
96 .links 122 .links
97 .iter() 123 .iter()
98 .filter(move |link| link.points_to.iter().any(|&it| it == m)) 124 .filter(move |link| link.points_to.iter().any(|&it| it == m))
99 .map(|link| { 125 .for_each(f)
100 (link.owner, link.name().clone(), link.syntax.clone())
101 })
102 .collect();
103 res
104 } 126 }
105 127
106 pub fn problems( 128 pub fn problems(