aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/libanalysis/src/roots.rs23
-rw-r--r--crates/libanalysis/src/symbol_index.rs18
2 files changed, 27 insertions, 14 deletions
diff --git a/crates/libanalysis/src/roots.rs b/crates/libanalysis/src/roots.rs
index eb14e7567..01de3e128 100644
--- a/crates/libanalysis/src/roots.rs
+++ b/crates/libanalysis/src/roots.rs
@@ -59,18 +59,18 @@ impl SourceRoot {
59 } 59 }
60 } 60 }
61 } 61 }
62 pub(crate) fn symbols(&self) -> Vec<(FileId, &FileSymbols)> { 62 pub(crate) fn symbols(&self) -> Vec<&FileSymbols> {
63 self.file_map 63 self.file_map
64 .iter() 64 .iter()
65 .map(|(&file_id, data)| (file_id, symbols(data))) 65 .map(|(&file_id, data)| symbols(file_id, data))
66 .collect() 66 .collect()
67 } 67 }
68 pub fn reindex(&self) { 68 pub fn reindex(&self) {
69 let now = Instant::now(); 69 let now = Instant::now();
70 self.file_map 70 self.file_map
71 .par_iter() 71 .par_iter()
72 .for_each(|(_, data)| { 72 .for_each(|(&file_id, data)| {
73 symbols(data); 73 symbols(file_id, data);
74 }); 74 });
75 info!("parallel indexing took {:?}", now.elapsed()); 75 info!("parallel indexing took {:?}", now.elapsed());
76 76
@@ -83,9 +83,9 @@ impl SourceRoot {
83 } 83 }
84} 84}
85 85
86fn symbols((data, symbols): &(FileData, OnceCell<FileSymbols>)) -> &FileSymbols { 86fn symbols(file_id: FileId, (data, symbols): &(FileData, OnceCell<FileSymbols>)) -> &FileSymbols {
87 let syntax = data.syntax_transient(); 87 let syntax = data.syntax_transient();
88 symbols.get_or_init(|| FileSymbols::new(&syntax)) 88 symbols.get_or_init(|| FileSymbols::new(file_id, &syntax))
89} 89}
90 90
91#[derive(Debug)] 91#[derive(Debug)]
@@ -108,3 +108,14 @@ impl FileData {
108 .unwrap_or_else(|| File::parse(&self.text)) 108 .unwrap_or_else(|| File::parse(&self.text))
109 } 109 }
110} 110}
111
112// #[derive(Clone, Default, Debug)]
113// pub(crate) struct ReadonlySourceRoot {
114// data: Arc<ReadonlySourceRoot>
115// }
116
117// #[derive(Clone, Default, Debug)]
118// pub(crate) struct ReadonlySourceRootInner {
119// file_map: HashMap<FileId, FileData>,
120// module_map: ModuleMap,
121// }
diff --git a/crates/libanalysis/src/symbol_index.rs b/crates/libanalysis/src/symbol_index.rs
index 2cad3f6eb..54952cb94 100644
--- a/crates/libanalysis/src/symbol_index.rs
+++ b/crates/libanalysis/src/symbol_index.rs
@@ -8,12 +8,12 @@ use {Query, FileId, JobToken};
8 8
9#[derive(Debug)] 9#[derive(Debug)]
10pub(crate) struct FileSymbols { 10pub(crate) struct FileSymbols {
11 symbols: Vec<FileSymbol>, 11 symbols: Vec<(FileId, FileSymbol)>,
12 map: fst::Map, 12 map: fst::Map,
13} 13}
14 14
15impl FileSymbols { 15impl FileSymbols {
16 pub(crate) fn new(file: &File) -> FileSymbols { 16 pub(crate) fn new(file_id: FileId, file: &File) -> FileSymbols {
17 let mut symbols = file_symbols(file) 17 let mut symbols = file_symbols(file)
18 .into_iter() 18 .into_iter()
19 .map(|s| (s.name.as_str().to_lowercase(), s)) 19 .map(|s| (s.name.as_str().to_lowercase(), s))
@@ -21,8 +21,10 @@ impl FileSymbols {
21 21
22 symbols.sort_by(|s1, s2| s1.0.cmp(&s2.0)); 22 symbols.sort_by(|s1, s2| s1.0.cmp(&s2.0));
23 symbols.dedup_by(|s1, s2| s1.0 == s2.0); 23 symbols.dedup_by(|s1, s2| s1.0 == s2.0);
24 let (names, symbols): (Vec<String>, Vec<FileSymbol>) = 24 let (names, symbols): (Vec<String>, Vec<(FileId, FileSymbol)>) =
25 symbols.into_iter().unzip(); 25 symbols.into_iter()
26 .map(|(name, symbol)| (name, (file_id, symbol)))
27 .unzip();
26 28
27 let map = fst::Map::from_iter( 29 let map = fst::Map::from_iter(
28 names.into_iter().zip(0u64..) 30 names.into_iter().zip(0u64..)
@@ -34,12 +36,12 @@ impl FileSymbols {
34impl Query { 36impl Query {
35 pub(crate) fn search( 37 pub(crate) fn search(
36 mut self, 38 mut self,
37 indices: &[(FileId, &FileSymbols)], 39 indices: &[&FileSymbols],
38 token: &JobToken, 40 token: &JobToken,
39 ) -> Vec<(FileId, FileSymbol)> { 41 ) -> Vec<(FileId, FileSymbol)> {
40 42
41 let mut op = fst::map::OpBuilder::new(); 43 let mut op = fst::map::OpBuilder::new();
42 for (_, file_symbols) in indices.iter() { 44 for file_symbols in indices.iter() {
43 let automaton = fst::automaton::Subsequence::new(&self.lowercased); 45 let automaton = fst::automaton::Subsequence::new(&self.lowercased);
44 op = op.add(file_symbols.map.search(automaton)) 46 op = op.add(file_symbols.map.search(automaton))
45 } 47 }
@@ -50,10 +52,10 @@ impl Query {
50 break; 52 break;
51 } 53 }
52 for indexed_value in indexed_values { 54 for indexed_value in indexed_values {
53 let (file_id, file_symbols) = &indices[indexed_value.index]; 55 let file_symbols = &indices[indexed_value.index];
54 let idx = indexed_value.value as usize; 56 let idx = indexed_value.value as usize;
55 57
56 let symbol = &file_symbols.symbols[idx]; 58 let (file_id, symbol) = &file_symbols.symbols[idx];
57 if self.only_types && !is_type(symbol.kind) { 59 if self.only_types && !is_type(symbol.kind) {
58 continue; 60 continue;
59 } 61 }