Store symbols separately from file data

This commit is contained in:
Aleksey Kladov 2018-09-02 23:09:47 +03:00
parent 440dc41dd8
commit a5e319ec7e
2 changed files with 11 additions and 14 deletions

View file

@ -8,7 +8,7 @@ relative-path = "0.3.7"
log = "0.4.2" log = "0.4.2"
crossbeam-channel = "0.2.4" crossbeam-channel = "0.2.4"
parking_lot = "0.6.3" parking_lot = "0.6.3"
once_cell = "0.1.4" once_cell = "0.1.5"
rayon = "1.0.2" rayon = "1.0.2"
fst = "0.3.1" fst = "0.3.1"
libsyntax2 = { path = "../libsyntax2" } libsyntax2 = { path = "../libsyntax2" }

View file

@ -18,7 +18,7 @@ use {
#[derive(Clone, Default, Debug)] #[derive(Clone, Default, Debug)]
pub(crate) struct SourceRoot { pub(crate) struct SourceRoot {
file_map: HashMap<FileId, Arc<FileData>>, file_map: HashMap<FileId, Arc<(FileData, OnceCell<FileSymbols>)>>,
module_map: ModuleMap, module_map: ModuleMap,
} }
@ -37,9 +37,7 @@ impl SourceRoot {
self.file_map.remove(&file_id); self.file_map.remove(&file_id);
if let Some(text) = text { if let Some(text) = text {
let file_data = FileData::new(text); let file_data = FileData::new(text);
self.file_map.insert(file_id, Arc::new(file_data)); self.file_map.insert(file_id, Arc::new((file_data, Default::default())));
} else {
self.file_map.remove(&file_id);
} }
} }
pub fn module_map(&self) -> &ModuleMap { pub fn module_map(&self) -> &ModuleMap {
@ -64,7 +62,7 @@ impl SourceRoot {
pub(crate) fn symbols(&self) -> Vec<(FileId, &FileSymbols)> { pub(crate) fn symbols(&self) -> Vec<(FileId, &FileSymbols)> {
self.file_map self.file_map
.iter() .iter()
.map(|(&file_id, data)| (file_id, data.symbols())) .map(|(&file_id, data)| (file_id, symbols(data)))
.collect() .collect()
} }
pub fn reindex(&self) { pub fn reindex(&self) {
@ -72,32 +70,35 @@ impl SourceRoot {
self.file_map self.file_map
.par_iter() .par_iter()
.for_each(|(_, data)| { .for_each(|(_, data)| {
data.symbols(); symbols(data);
}); });
info!("parallel indexing took {:?}", now.elapsed()); info!("parallel indexing took {:?}", now.elapsed());
} }
fn data(&self, file_id: FileId) -> &FileData { fn data(&self, file_id: FileId) -> &FileData {
match self.file_map.get(&file_id) { match self.file_map.get(&file_id) {
Some(data) => data, Some(data) => &data.0,
None => panic!("unknown file: {:?}", file_id), None => panic!("unknown file: {:?}", file_id),
} }
} }
} }
fn symbols((data, symbols): &(FileData, OnceCell<FileSymbols>)) -> &FileSymbols {
let syntax = data.syntax_transient();
symbols.get_or_init(|| FileSymbols::new(&syntax))
}
#[derive(Debug)] #[derive(Debug)]
struct FileData { struct FileData {
text: String, text: String,
lines: OnceCell<LineIndex>, lines: OnceCell<LineIndex>,
syntax: OnceCell<File>, syntax: OnceCell<File>,
symbols: OnceCell<FileSymbols>,
} }
impl FileData { impl FileData {
fn new(text: String) -> FileData { fn new(text: String) -> FileData {
FileData { FileData {
text, text,
symbols: OnceCell::new(),
syntax: OnceCell::new(), syntax: OnceCell::new(),
lines: OnceCell::new(), lines: OnceCell::new(),
} }
@ -106,8 +107,4 @@ impl FileData {
self.syntax.get().map(|s| s.clone()) self.syntax.get().map(|s| s.clone())
.unwrap_or_else(|| File::parse(&self.text)) .unwrap_or_else(|| File::parse(&self.text))
} }
fn symbols(&self) -> &FileSymbols {
let syntax = self.syntax_transient();
self.symbols.get_or_init(|| FileSymbols::new(&syntax))
}
} }