Index files in parallel

This commit is contained in:
Aleksey Kladov 2018-10-29 13:32:45 +03:00
parent 943fc5e323
commit 35568cf057

View file

@ -10,6 +10,7 @@ use ra_syntax::{
SyntaxKind::*, SyntaxKind::*,
SyntaxNodeRef, TextRange, TextUnit, SyntaxNodeRef, TextRange, TextUnit,
}; };
use rayon::prelude::*;
use relative_path::RelativePath; use relative_path::RelativePath;
use rustc_hash::FxHashSet; use rustc_hash::FxHashSet;
use salsa::{ParallelDatabase, Database}; use salsa::{ParallelDatabase, Database};
@ -23,6 +24,7 @@ use crate::{
input::{SourceRootId, FilesDatabase, SourceRoot, WORKSPACE}, input::{SourceRootId, FilesDatabase, SourceRoot, WORKSPACE},
descriptors::module::{ModulesDatabase, ModuleTree, Problem}, descriptors::module::{ModulesDatabase, ModuleTree, Problem},
descriptors::{FnDescriptor}, descriptors::{FnDescriptor},
symbol_index::SymbolIndex,
CrateGraph, CrateId, Diagnostic, FileId, FileResolver, FileSystemEdit, Position, CrateGraph, CrateId, Diagnostic, FileId, FileResolver, FileSystemEdit, Position,
Query, SourceChange, SourceFileEdit, Cancelable, Query, SourceChange, SourceFileEdit, Cancelable,
}; };
@ -180,16 +182,18 @@ impl AnalysisImpl {
self.db.file_lines(file_id) self.db.file_lines(file_id)
} }
pub fn world_symbols(&self, query: Query) -> Cancelable<Vec<(FileId, FileSymbol)>> { pub fn world_symbols(&self, query: Query) -> Cancelable<Vec<(FileId, FileSymbol)>> {
let mut buf = Vec::new(); let buf: Vec<Arc<SymbolIndex>> = if query.libs {
if query.libs { self.db.libraries().iter()
for &lib_id in self.db.libraries().iter() { .map(|&lib_id| self.db.library_symbols(lib_id))
buf.push(self.db.library_symbols(lib_id)); .collect()
}
} else { } else {
for &file_id in self.db.source_root(WORKSPACE).files.iter() { let files = &self.db.source_root(WORKSPACE).files;
buf.push(self.db.file_symbols(file_id)?); let db = self.db.clone();
} files.par_iter()
} .map_with(db, |db, &file_id| db.file_symbols(file_id))
.filter_map(|it| it.ok())
.collect()
};
Ok(query.search(&buf)) Ok(query.search(&buf))
} }
fn module_tree(&self, file_id: FileId) -> Cancelable<Arc<ModuleTree>> { fn module_tree(&self, file_id: FileId) -> Cancelable<Arc<ModuleTree>> {