diff options
Diffstat (limited to 'crates/libanalysis/src/imp.rs')
-rw-r--r-- | crates/libanalysis/src/imp.rs | 22 |
1 files changed, 7 insertions, 15 deletions
diff --git a/crates/libanalysis/src/imp.rs b/crates/libanalysis/src/imp.rs index 8734813f4..6f3191fe7 100644 --- a/crates/libanalysis/src/imp.rs +++ b/crates/libanalysis/src/imp.rs | |||
@@ -5,6 +5,7 @@ use std::{ | |||
5 | }, | 5 | }, |
6 | fmt, | 6 | fmt, |
7 | collections::{HashSet, VecDeque}, | 7 | collections::{HashSet, VecDeque}, |
8 | iter, | ||
8 | }; | 9 | }; |
9 | 10 | ||
10 | use relative_path::RelativePath; | 11 | use relative_path::RelativePath; |
@@ -75,14 +76,12 @@ impl AnalysisHostImpl { | |||
75 | } | 76 | } |
76 | pub fn change_files(&mut self, changes: &mut dyn Iterator<Item=(FileId, Option<String>)>) { | 77 | pub fn change_files(&mut self, changes: &mut dyn Iterator<Item=(FileId, Option<String>)>) { |
77 | let data = self.data_mut(); | 78 | let data = self.data_mut(); |
78 | for (file_id, text) in changes { | 79 | data.root = Arc::new(data.root.apply_changes(changes, None)); |
79 | data.root.update(file_id, text); | ||
80 | } | ||
81 | } | 80 | } |
82 | pub fn set_file_resolver(&mut self, resolver: FileResolverImp) { | 81 | pub fn set_file_resolver(&mut self, resolver: FileResolverImp) { |
83 | let data = self.data_mut(); | 82 | let data = self.data_mut(); |
84 | data.file_resolver = resolver.clone(); | 83 | data.file_resolver = resolver.clone(); |
85 | data.root.set_file_resolver(resolver); | 84 | data.root = Arc::new(data.root.apply_changes(&mut iter::empty(), Some(resolver))); |
86 | } | 85 | } |
87 | pub fn set_crate_graph(&mut self, graph: CrateGraph) { | 86 | pub fn set_crate_graph(&mut self, graph: CrateGraph) { |
88 | let mut visited = HashSet::new(); | 87 | let mut visited = HashSet::new(); |
@@ -124,18 +123,17 @@ impl Clone for AnalysisImpl { | |||
124 | impl AnalysisImpl { | 123 | impl AnalysisImpl { |
125 | fn root(&self, file_id: FileId) -> &SourceRoot { | 124 | fn root(&self, file_id: FileId) -> &SourceRoot { |
126 | if self.data.root.contains(file_id) { | 125 | if self.data.root.contains(file_id) { |
127 | return &self.data.root; | 126 | return &*self.data.root; |
128 | } | 127 | } |
129 | &**self.data.libs.iter().find(|it| it.contains(file_id)).unwrap() | 128 | &**self.data.libs.iter().find(|it| it.contains(file_id)).unwrap() |
130 | } | 129 | } |
131 | pub fn file_syntax(&self, file_id: FileId) -> &File { | 130 | pub fn file_syntax(&self, file_id: FileId) -> File { |
132 | self.root(file_id).syntax(file_id) | 131 | self.root(file_id).syntax(file_id) |
133 | } | 132 | } |
134 | pub fn file_line_index(&self, file_id: FileId) -> &LineIndex { | 133 | pub fn file_line_index(&self, file_id: FileId) -> Arc<LineIndex> { |
135 | self.root(file_id).lines(file_id) | 134 | self.root(file_id).lines(file_id) |
136 | } | 135 | } |
137 | pub fn world_symbols(&self, query: Query, token: &JobToken) -> Vec<(FileId, FileSymbol)> { | 136 | pub fn world_symbols(&self, query: Query, token: &JobToken) -> Vec<(FileId, FileSymbol)> { |
138 | self.reindex(); | ||
139 | let mut buf = Vec::new(); | 137 | let mut buf = Vec::new(); |
140 | if query.libs { | 138 | if query.libs { |
141 | self.data.libs.iter() | 139 | self.data.libs.iter() |
@@ -308,19 +306,13 @@ impl AnalysisImpl { | |||
308 | }; | 306 | }; |
309 | module_tree.child_module_by_name(file_id, name.as_str()) | 307 | module_tree.child_module_by_name(file_id, name.as_str()) |
310 | } | 308 | } |
311 | |||
312 | fn reindex(&self) { | ||
313 | if self.needs_reindex.compare_and_swap(true, false, SeqCst) { | ||
314 | self.data.root.reindex(); | ||
315 | } | ||
316 | } | ||
317 | } | 309 | } |
318 | 310 | ||
319 | #[derive(Default, Clone, Debug)] | 311 | #[derive(Default, Clone, Debug)] |
320 | struct WorldData { | 312 | struct WorldData { |
321 | file_resolver: FileResolverImp, | 313 | file_resolver: FileResolverImp, |
322 | crate_graph: CrateGraph, | 314 | crate_graph: CrateGraph, |
323 | root: WritableSourceRoot, | 315 | root: Arc<WritableSourceRoot>, |
324 | libs: Vec<Arc<ReadonlySourceRoot>>, | 316 | libs: Vec<Arc<ReadonlySourceRoot>>, |
325 | } | 317 | } |
326 | 318 | ||