diff options
Diffstat (limited to 'crates/ra_analysis/src/imp.rs')
-rw-r--r-- | crates/ra_analysis/src/imp.rs | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs index 26f5e175b..5efcaeca0 100644 --- a/crates/ra_analysis/src/imp.rs +++ b/crates/ra_analysis/src/imp.rs | |||
@@ -1,8 +1,8 @@ | |||
1 | use std::{ | 1 | use std::{ |
2 | sync::{ | 2 | sync::{ |
3 | Arc, | 3 | Arc, |
4 | atomic::{AtomicBool, Ordering::SeqCst}, | ||
5 | }, | 4 | }, |
5 | hash::{Hash, Hasher}, | ||
6 | fmt, | 6 | fmt, |
7 | collections::VecDeque, | 7 | collections::VecDeque, |
8 | iter, | 8 | iter, |
@@ -29,6 +29,21 @@ pub(crate) struct FileResolverImp { | |||
29 | inner: Arc<FileResolver> | 29 | inner: Arc<FileResolver> |
30 | } | 30 | } |
31 | 31 | ||
32 | impl PartialEq for FileResolverImp { | ||
33 | fn eq(&self, other: &FileResolverImp) -> bool { | ||
34 | self.inner() == other.inner() | ||
35 | } | ||
36 | } | ||
37 | |||
38 | impl Eq for FileResolverImp { | ||
39 | } | ||
40 | |||
41 | impl Hash for FileResolverImp { | ||
42 | fn hash<H: Hasher>(&self, hasher: &mut H) { | ||
43 | self.inner().hash(hasher); | ||
44 | } | ||
45 | } | ||
46 | |||
32 | impl FileResolverImp { | 47 | impl FileResolverImp { |
33 | pub(crate) fn new(inner: Arc<FileResolver>) -> FileResolverImp { | 48 | pub(crate) fn new(inner: Arc<FileResolver>) -> FileResolverImp { |
34 | FileResolverImp { inner } | 49 | FileResolverImp { inner } |
@@ -39,6 +54,9 @@ impl FileResolverImp { | |||
39 | pub(crate) fn resolve(&self, file_id: FileId, path: &RelativePath) -> Option<FileId> { | 54 | pub(crate) fn resolve(&self, file_id: FileId, path: &RelativePath) -> Option<FileId> { |
40 | self.inner.resolve(file_id, path) | 55 | self.inner.resolve(file_id, path) |
41 | } | 56 | } |
57 | fn inner(&self) -> *const FileResolver { | ||
58 | &*self.inner | ||
59 | } | ||
42 | } | 60 | } |
43 | 61 | ||
44 | impl Default for FileResolverImp { | 62 | impl Default for FileResolverImp { |
@@ -59,29 +77,27 @@ impl Default for FileResolverImp { | |||
59 | 77 | ||
60 | #[derive(Debug)] | 78 | #[derive(Debug)] |
61 | pub(crate) struct AnalysisHostImpl { | 79 | pub(crate) struct AnalysisHostImpl { |
62 | data: Arc<WorldData> | 80 | data: WorldData |
63 | } | 81 | } |
64 | 82 | ||
65 | impl AnalysisHostImpl { | 83 | impl AnalysisHostImpl { |
66 | pub fn new() -> AnalysisHostImpl { | 84 | pub fn new() -> AnalysisHostImpl { |
67 | AnalysisHostImpl { | 85 | AnalysisHostImpl { |
68 | data: Arc::new(WorldData::default()), | 86 | data: WorldData::default(), |
69 | } | 87 | } |
70 | } | 88 | } |
71 | pub fn analysis(&self) -> AnalysisImpl { | 89 | pub fn analysis(&self) -> AnalysisImpl { |
72 | AnalysisImpl { | 90 | AnalysisImpl { |
73 | needs_reindex: AtomicBool::new(false), | ||
74 | data: self.data.clone(), | 91 | data: self.data.clone(), |
75 | } | 92 | } |
76 | } | 93 | } |
77 | pub fn change_files(&mut self, changes: &mut dyn Iterator<Item=(FileId, Option<String>)>) { | 94 | pub fn change_files(&mut self, changes: &mut dyn Iterator<Item=(FileId, Option<String>)>) { |
78 | let data = self.data_mut(); | 95 | self.data_mut() |
79 | data.root = Arc::new(data.root.apply_changes(changes, None)); | 96 | .root.apply_changes(changes, None); |
80 | } | 97 | } |
81 | pub fn set_file_resolver(&mut self, resolver: FileResolverImp) { | 98 | pub fn set_file_resolver(&mut self, resolver: FileResolverImp) { |
82 | let data = self.data_mut(); | 99 | self.data_mut() |
83 | data.file_resolver = resolver.clone(); | 100 | .root.apply_changes(&mut iter::empty(), Some(resolver)); |
84 | data.root = Arc::new(data.root.apply_changes(&mut iter::empty(), Some(resolver))); | ||
85 | } | 101 | } |
86 | pub fn set_crate_graph(&mut self, graph: CrateGraph) { | 102 | pub fn set_crate_graph(&mut self, graph: CrateGraph) { |
87 | let mut visited = FxHashSet::default(); | 103 | let mut visited = FxHashSet::default(); |
@@ -96,34 +112,24 @@ impl AnalysisHostImpl { | |||
96 | self.data_mut().libs.push(Arc::new(root)); | 112 | self.data_mut().libs.push(Arc::new(root)); |
97 | } | 113 | } |
98 | fn data_mut(&mut self) -> &mut WorldData { | 114 | fn data_mut(&mut self) -> &mut WorldData { |
99 | Arc::make_mut(&mut self.data) | 115 | &mut self.data |
100 | } | 116 | } |
101 | } | 117 | } |
102 | 118 | ||
103 | pub(crate) struct AnalysisImpl { | 119 | pub(crate) struct AnalysisImpl { |
104 | needs_reindex: AtomicBool, | 120 | data: WorldData, |
105 | data: Arc<WorldData>, | ||
106 | } | 121 | } |
107 | 122 | ||
108 | impl fmt::Debug for AnalysisImpl { | 123 | impl fmt::Debug for AnalysisImpl { |
109 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 124 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
110 | (&*self.data).fmt(f) | 125 | self.data.fmt(f) |
111 | } | ||
112 | } | ||
113 | |||
114 | impl Clone for AnalysisImpl { | ||
115 | fn clone(&self) -> AnalysisImpl { | ||
116 | AnalysisImpl { | ||
117 | needs_reindex: AtomicBool::new(self.needs_reindex.load(SeqCst)), | ||
118 | data: Arc::clone(&self.data), | ||
119 | } | ||
120 | } | 126 | } |
121 | } | 127 | } |
122 | 128 | ||
123 | impl AnalysisImpl { | 129 | impl AnalysisImpl { |
124 | fn root(&self, file_id: FileId) -> &SourceRoot { | 130 | fn root(&self, file_id: FileId) -> &SourceRoot { |
125 | if self.data.root.contains(file_id) { | 131 | if self.data.root.contains(file_id) { |
126 | return &*self.data.root; | 132 | return &self.data.root; |
127 | } | 133 | } |
128 | &**self.data.libs.iter().find(|it| it.contains(file_id)).unwrap() | 134 | &**self.data.libs.iter().find(|it| it.contains(file_id)).unwrap() |
129 | } | 135 | } |
@@ -386,9 +392,8 @@ impl AnalysisImpl { | |||
386 | 392 | ||
387 | #[derive(Default, Clone, Debug)] | 393 | #[derive(Default, Clone, Debug)] |
388 | struct WorldData { | 394 | struct WorldData { |
389 | file_resolver: FileResolverImp, | ||
390 | crate_graph: CrateGraph, | 395 | crate_graph: CrateGraph, |
391 | root: Arc<WritableSourceRoot>, | 396 | root: WritableSourceRoot, |
392 | libs: Vec<Arc<ReadonlySourceRoot>>, | 397 | libs: Vec<Arc<ReadonlySourceRoot>>, |
393 | } | 398 | } |
394 | 399 | ||