aboutsummaryrefslogtreecommitdiff
path: root/crates/libanalysis/src/module_map.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/libanalysis/src/module_map.rs')
-rw-r--r--crates/libanalysis/src/module_map.rs41
1 files changed, 17 insertions, 24 deletions
diff --git a/crates/libanalysis/src/module_map.rs b/crates/libanalysis/src/module_map.rs
index 1b225ecee..9acebd6e2 100644
--- a/crates/libanalysis/src/module_map.rs
+++ b/crates/libanalysis/src/module_map.rs
@@ -1,12 +1,11 @@
1use relative_path::RelativePathBuf; 1use relative_path::RelativePathBuf;
2
3use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard}; 2use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard};
4use libsyntax2::{ 3use libsyntax2::{
5 File, 4 File,
6 ast::{self, AstNode, NameOwner}, 5 ast::{self, AstNode, NameOwner},
7 SyntaxNode, SmolStr, 6 SyntaxNode, SmolStr,
8}; 7};
9use {FileId, FileResolver}; 8use {FileId, imp::FileResolverImp};
10 9
11type SyntaxProvider<'a> = dyn Fn(FileId) -> &'a File + 'a; 10type SyntaxProvider<'a> = dyn Fn(FileId) -> &'a File + 'a;
12 11
@@ -32,6 +31,7 @@ impl Clone for ModuleMap {
32 31
33#[derive(Clone, Debug, Default)] 32#[derive(Clone, Debug, Default)]
34struct State { 33struct State {
34 file_resolver: FileResolverImp,
35 changes: Vec<(FileId, ChangeKind)>, 35 changes: Vec<(FileId, ChangeKind)>,
36 links: Vec<Link>, 36 links: Vec<Link>,
37} 37}
@@ -59,27 +59,25 @@ impl ModuleMap {
59 pub fn new() -> ModuleMap { 59 pub fn new() -> ModuleMap {
60 Default::default() 60 Default::default()
61 } 61 }
62 62 pub fn update_file(&mut self, file_id: FileId, change_kind: ChangeKind) {
63 pub fn update_file(&mut self, file: FileId, change_kind: ChangeKind) { 63 self.state.get_mut().changes.push((file_id, change_kind));
64 self.state.get_mut().changes.push((file, change_kind)); 64 }
65 pub(crate) fn set_file_resolver(&mut self, file_resolver: FileResolverImp) {
66 self.state.get_mut().file_resolver = file_resolver;
65 } 67 }
66
67 pub fn module2file(&self, m: ModuleId) -> FileId { 68 pub fn module2file(&self, m: ModuleId) -> FileId {
68 m.0 69 m.0
69 } 70 }
70
71 pub fn file2module(&self, file_id: FileId) -> ModuleId { 71 pub fn file2module(&self, file_id: FileId) -> ModuleId {
72 ModuleId(file_id) 72 ModuleId(file_id)
73 } 73 }
74
75 pub fn child_module_by_name<'a>( 74 pub fn child_module_by_name<'a>(
76 &self, 75 &self,
77 parent_mod: ModuleId, 76 parent_mod: ModuleId,
78 child_mod: &str, 77 child_mod: &str,
79 file_resolver: &FileResolver,
80 syntax_provider: &SyntaxProvider, 78 syntax_provider: &SyntaxProvider,
81 ) -> Vec<ModuleId> { 79 ) -> Vec<ModuleId> {
82 self.links(file_resolver, syntax_provider) 80 self.links(syntax_provider)
83 .links 81 .links
84 .iter() 82 .iter()
85 .filter(|link| link.owner == parent_mod) 83 .filter(|link| link.owner == parent_mod)
@@ -92,11 +90,10 @@ impl ModuleMap {
92 pub fn parent_modules( 90 pub fn parent_modules(
93 &self, 91 &self,
94 m: ModuleId, 92 m: ModuleId,
95 file_resolver: &FileResolver,
96 syntax_provider: &SyntaxProvider, 93 syntax_provider: &SyntaxProvider,
97 ) -> Vec<(ModuleId, SmolStr, SyntaxNode)> { 94 ) -> Vec<(ModuleId, SmolStr, SyntaxNode)> {
98 let mut res = Vec::new(); 95 let mut res = Vec::new();
99 self.for_each_parent_link(m, file_resolver, syntax_provider, |link| { 96 self.for_each_parent_link(m, syntax_provider, |link| {
100 res.push( 97 res.push(
101 (link.owner, link.name().clone(), link.syntax.clone()) 98 (link.owner, link.name().clone(), link.syntax.clone())
102 ) 99 )
@@ -107,22 +104,20 @@ impl ModuleMap {
107 pub fn parent_module_ids( 104 pub fn parent_module_ids(
108 &self, 105 &self,
109 m: ModuleId, 106 m: ModuleId,
110 file_resolver: &FileResolver,
111 syntax_provider: &SyntaxProvider, 107 syntax_provider: &SyntaxProvider,
112 ) -> Vec<ModuleId> { 108 ) -> Vec<ModuleId> {
113 let mut res = Vec::new(); 109 let mut res = Vec::new();
114 self.for_each_parent_link(m, file_resolver, syntax_provider, |link| res.push(link.owner)); 110 self.for_each_parent_link(m, syntax_provider, |link| res.push(link.owner));
115 res 111 res
116 } 112 }
117 113
118 fn for_each_parent_link( 114 fn for_each_parent_link(
119 &self, 115 &self,
120 m: ModuleId, 116 m: ModuleId,
121 file_resolver: &FileResolver,
122 syntax_provider: &SyntaxProvider, 117 syntax_provider: &SyntaxProvider,
123 f: impl FnMut(&Link) 118 f: impl FnMut(&Link)
124 ) { 119 ) {
125 self.links(file_resolver, syntax_provider) 120 self.links(syntax_provider)
126 .links 121 .links
127 .iter() 122 .iter()
128 .filter(move |link| link.points_to.iter().any(|&it| it == m)) 123 .filter(move |link| link.points_to.iter().any(|&it| it == m))
@@ -132,12 +127,11 @@ impl ModuleMap {
132 pub fn problems( 127 pub fn problems(
133 &self, 128 &self,
134 file: FileId, 129 file: FileId,
135 file_resolver: &FileResolver,
136 syntax_provider: &SyntaxProvider, 130 syntax_provider: &SyntaxProvider,
137 mut cb: impl FnMut(ast::Name, &Problem), 131 mut cb: impl FnMut(ast::Name, &Problem),
138 ) { 132 ) {
139 let module = self.file2module(file); 133 let module = self.file2module(file);
140 let links = self.links(file_resolver, syntax_provider); 134 let links = self.links(syntax_provider);
141 links 135 links
142 .links 136 .links
143 .iter() 137 .iter()
@@ -151,7 +145,6 @@ impl ModuleMap {
151 145
152 fn links( 146 fn links(
153 &self, 147 &self,
154 file_resolver: &FileResolver,
155 syntax_provider: &SyntaxProvider, 148 syntax_provider: &SyntaxProvider,
156 ) -> RwLockReadGuard<State> { 149 ) -> RwLockReadGuard<State> {
157 { 150 {
@@ -162,7 +155,7 @@ impl ModuleMap {
162 } 155 }
163 let mut guard = self.state.write(); 156 let mut guard = self.state.write();
164 if !guard.changes.is_empty() { 157 if !guard.changes.is_empty() {
165 guard.apply_changes(file_resolver, syntax_provider); 158 guard.apply_changes(syntax_provider);
166 } 159 }
167 assert!(guard.changes.is_empty()); 160 assert!(guard.changes.is_empty());
168 RwLockWriteGuard::downgrade(guard) 161 RwLockWriteGuard::downgrade(guard)
@@ -172,7 +165,6 @@ impl ModuleMap {
172impl State { 165impl State {
173 pub fn apply_changes( 166 pub fn apply_changes(
174 &mut self, 167 &mut self,
175 file_resolver: &FileResolver,
176 syntax_provider: &SyntaxProvider, 168 syntax_provider: &SyntaxProvider,
177 ) { 169 ) {
178 let mut reresolve = false; 170 let mut reresolve = false;
@@ -197,13 +189,14 @@ impl State {
197 } 189 }
198 ChangeKind::Update => { 190 ChangeKind::Update => {
199 let file = syntax_provider(file_id); 191 let file = syntax_provider(file_id);
192 let resolver = &self.file_resolver;
200 self.links.extend( 193 self.links.extend(
201 file 194 file
202 .ast() 195 .ast()
203 .modules() 196 .modules()
204 .filter_map(|it| Link::new(mod_id, it)) 197 .filter_map(|it| Link::new(mod_id, it))
205 .map(|mut link| { 198 .map(|mut link| {
206 link.resolve(file_resolver); 199 link.resolve(resolver);
207 link 200 link
208 }) 201 })
209 ); 202 );
@@ -212,7 +205,7 @@ impl State {
212 } 205 }
213 if reresolve { 206 if reresolve {
214 for link in self.links.iter_mut() { 207 for link in self.links.iter_mut() {
215 link.resolve(file_resolver) 208 link.resolve(&self.file_resolver)
216 } 209 }
217 } 210 }
218 } 211 }
@@ -245,7 +238,7 @@ impl Link {
245 .unwrap() 238 .unwrap()
246 } 239 }
247 240
248 fn resolve(&mut self, file_resolver: &FileResolver) { 241 fn resolve(&mut self, file_resolver: &FileResolverImp) {
249 if !self.ast().has_semi() { 242 if !self.ast().has_semi() {
250 self.problem = None; 243 self.problem = None;
251 self.points_to = Vec::new(); 244 self.points_to = Vec::new();