diff options
author | Aleksey Kladov <[email protected]> | 2018-09-02 21:09:47 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-09-02 21:09:47 +0100 |
commit | a5e319ec7ed72d14486631934ff652d9fe4e5319 (patch) | |
tree | 8ab55c71188e69809faaa623a9424905cd673ed2 /crates/libanalysis/src | |
parent | 440dc41dd8f53876d0949272e76b1f560e10ec69 (diff) |
Store symbols separately from file data
Diffstat (limited to 'crates/libanalysis/src')
-rw-r--r-- | crates/libanalysis/src/roots.rs | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/crates/libanalysis/src/roots.rs b/crates/libanalysis/src/roots.rs index 675bce54c..eb14e7567 100644 --- a/crates/libanalysis/src/roots.rs +++ b/crates/libanalysis/src/roots.rs | |||
@@ -18,7 +18,7 @@ use { | |||
18 | 18 | ||
19 | #[derive(Clone, Default, Debug)] | 19 | #[derive(Clone, Default, Debug)] |
20 | pub(crate) struct SourceRoot { | 20 | pub(crate) struct SourceRoot { |
21 | file_map: HashMap<FileId, Arc<FileData>>, | 21 | file_map: HashMap<FileId, Arc<(FileData, OnceCell<FileSymbols>)>>, |
22 | module_map: ModuleMap, | 22 | module_map: ModuleMap, |
23 | } | 23 | } |
24 | 24 | ||
@@ -37,9 +37,7 @@ impl SourceRoot { | |||
37 | self.file_map.remove(&file_id); | 37 | self.file_map.remove(&file_id); |
38 | if let Some(text) = text { | 38 | if let Some(text) = text { |
39 | let file_data = FileData::new(text); | 39 | let file_data = FileData::new(text); |
40 | self.file_map.insert(file_id, Arc::new(file_data)); | 40 | self.file_map.insert(file_id, Arc::new((file_data, Default::default()))); |
41 | } else { | ||
42 | self.file_map.remove(&file_id); | ||
43 | } | 41 | } |
44 | } | 42 | } |
45 | pub fn module_map(&self) -> &ModuleMap { | 43 | pub fn module_map(&self) -> &ModuleMap { |
@@ -64,7 +62,7 @@ impl SourceRoot { | |||
64 | pub(crate) fn symbols(&self) -> Vec<(FileId, &FileSymbols)> { | 62 | pub(crate) fn symbols(&self) -> Vec<(FileId, &FileSymbols)> { |
65 | self.file_map | 63 | self.file_map |
66 | .iter() | 64 | .iter() |
67 | .map(|(&file_id, data)| (file_id, data.symbols())) | 65 | .map(|(&file_id, data)| (file_id, symbols(data))) |
68 | .collect() | 66 | .collect() |
69 | } | 67 | } |
70 | pub fn reindex(&self) { | 68 | pub fn reindex(&self) { |
@@ -72,32 +70,35 @@ impl SourceRoot { | |||
72 | self.file_map | 70 | self.file_map |
73 | .par_iter() | 71 | .par_iter() |
74 | .for_each(|(_, data)| { | 72 | .for_each(|(_, data)| { |
75 | data.symbols(); | 73 | symbols(data); |
76 | }); | 74 | }); |
77 | info!("parallel indexing took {:?}", now.elapsed()); | 75 | info!("parallel indexing took {:?}", now.elapsed()); |
78 | 76 | ||
79 | } | 77 | } |
80 | fn data(&self, file_id: FileId) -> &FileData { | 78 | fn data(&self, file_id: FileId) -> &FileData { |
81 | match self.file_map.get(&file_id) { | 79 | match self.file_map.get(&file_id) { |
82 | Some(data) => data, | 80 | Some(data) => &data.0, |
83 | None => panic!("unknown file: {:?}", file_id), | 81 | None => panic!("unknown file: {:?}", file_id), |
84 | } | 82 | } |
85 | } | 83 | } |
86 | } | 84 | } |
87 | 85 | ||
86 | fn symbols((data, symbols): &(FileData, OnceCell<FileSymbols>)) -> &FileSymbols { | ||
87 | let syntax = data.syntax_transient(); | ||
88 | symbols.get_or_init(|| FileSymbols::new(&syntax)) | ||
89 | } | ||
90 | |||
88 | #[derive(Debug)] | 91 | #[derive(Debug)] |
89 | struct FileData { | 92 | struct FileData { |
90 | text: String, | 93 | text: String, |
91 | lines: OnceCell<LineIndex>, | 94 | lines: OnceCell<LineIndex>, |
92 | syntax: OnceCell<File>, | 95 | syntax: OnceCell<File>, |
93 | symbols: OnceCell<FileSymbols>, | ||
94 | } | 96 | } |
95 | 97 | ||
96 | impl FileData { | 98 | impl FileData { |
97 | fn new(text: String) -> FileData { | 99 | fn new(text: String) -> FileData { |
98 | FileData { | 100 | FileData { |
99 | text, | 101 | text, |
100 | symbols: OnceCell::new(), | ||
101 | syntax: OnceCell::new(), | 102 | syntax: OnceCell::new(), |
102 | lines: OnceCell::new(), | 103 | lines: OnceCell::new(), |
103 | } | 104 | } |
@@ -106,8 +107,4 @@ impl FileData { | |||
106 | self.syntax.get().map(|s| s.clone()) | 107 | self.syntax.get().map(|s| s.clone()) |
107 | .unwrap_or_else(|| File::parse(&self.text)) | 108 | .unwrap_or_else(|| File::parse(&self.text)) |
108 | } | 109 | } |
109 | fn symbols(&self) -> &FileSymbols { | ||
110 | let syntax = self.syntax_transient(); | ||
111 | self.symbols.get_or_init(|| FileSymbols::new(&syntax)) | ||
112 | } | ||
113 | } | 110 | } |