diff options
author | Aleksey Kladov <[email protected]> | 2018-09-10 10:57:40 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-09-10 10:57:40 +0100 |
commit | 505895a25f98423de07c3cec4793b66a19d098c7 (patch) | |
tree | 2df3f41f33b5db0b2bba1e2d2acd08f23fffbc2a /crates/libanalysis/src/module_map.rs | |
parent | 4f647096665b2ca3725ba1f7415a21fbc46044bb (diff) |
store file rsovler
Diffstat (limited to 'crates/libanalysis/src/module_map.rs')
-rw-r--r-- | crates/libanalysis/src/module_map.rs | 41 |
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 @@ | |||
1 | use relative_path::RelativePathBuf; | 1 | use relative_path::RelativePathBuf; |
2 | |||
3 | use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard}; | 2 | use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard}; |
4 | use libsyntax2::{ | 3 | use libsyntax2::{ |
5 | File, | 4 | File, |
6 | ast::{self, AstNode, NameOwner}, | 5 | ast::{self, AstNode, NameOwner}, |
7 | SyntaxNode, SmolStr, | 6 | SyntaxNode, SmolStr, |
8 | }; | 7 | }; |
9 | use {FileId, FileResolver}; | 8 | use {FileId, imp::FileResolverImp}; |
10 | 9 | ||
11 | type SyntaxProvider<'a> = dyn Fn(FileId) -> &'a File + 'a; | 10 | type 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)] |
34 | struct State { | 33 | struct 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 { | |||
172 | impl State { | 165 | impl 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(); |