Remove special casing for library symbols
We might as well handle them internally, via queries. I am not sure, but it looks like the current LibraryData setup might even predate salsa? It's not really needed and creates a bunch of complexity.
This commit is contained in:
@@ -34,14 +34,15 @@ use ra_db::{
|
||||
salsa::{self, ParallelDatabase},
|
||||
CrateId, FileId, SourceDatabaseExt, SourceRootId,
|
||||
};
|
||||
use ra_prof::profile;
|
||||
use ra_syntax::{
|
||||
ast::{self, NameOwner},
|
||||
match_ast, AstNode, Parse, SmolStr, SourceFile,
|
||||
SyntaxKind::{self, *},
|
||||
SyntaxNode, SyntaxNodePtr, TextRange, WalkEvent,
|
||||
};
|
||||
#[cfg(not(feature = "wasm"))]
|
||||
use rayon::prelude::*;
|
||||
use rustc_hash::FxHashMap;
|
||||
|
||||
use crate::RootDatabase;
|
||||
|
||||
@@ -86,10 +87,9 @@ impl Query {
|
||||
}
|
||||
|
||||
#[salsa::query_group(SymbolsDatabaseStorage)]
|
||||
pub trait SymbolsDatabase: hir::db::HirDatabase {
|
||||
pub trait SymbolsDatabase: hir::db::HirDatabase + SourceDatabaseExt + ParallelDatabase {
|
||||
fn file_symbols(&self, file_id: FileId) -> Arc<SymbolIndex>;
|
||||
#[salsa::input]
|
||||
fn library_symbols(&self, id: SourceRootId) -> Arc<SymbolIndex>;
|
||||
fn library_symbols(&self) -> Arc<FxHashMap<SourceRootId, SymbolIndex>>;
|
||||
/// The set of "local" (that is, from the current workspace) roots.
|
||||
/// Files in local roots are assumed to change frequently.
|
||||
#[salsa::input]
|
||||
@@ -100,6 +100,29 @@ pub trait SymbolsDatabase: hir::db::HirDatabase {
|
||||
fn library_roots(&self) -> Arc<Vec<SourceRootId>>;
|
||||
}
|
||||
|
||||
fn library_symbols(
|
||||
db: &(impl SymbolsDatabase + ParallelDatabase),
|
||||
) -> Arc<FxHashMap<SourceRootId, SymbolIndex>> {
|
||||
let _p = profile("library_symbols");
|
||||
|
||||
let roots = db.library_roots();
|
||||
let res = roots
|
||||
.iter()
|
||||
.map(|&root_id| {
|
||||
let root = db.source_root(root_id);
|
||||
let files = root
|
||||
.walk()
|
||||
.map(|it| (it, SourceDatabaseExt::file_text(db, it)))
|
||||
.collect::<Vec<_>>();
|
||||
let symbol_index = SymbolIndex::for_files(
|
||||
files.into_par_iter().map(|(file, text)| (file, SourceFile::parse(&text))),
|
||||
);
|
||||
(root_id, symbol_index)
|
||||
})
|
||||
.collect();
|
||||
Arc::new(res)
|
||||
}
|
||||
|
||||
fn file_symbols(db: &impl SymbolsDatabase, file_id: FileId) -> Arc<SymbolIndex> {
|
||||
db.check_canceled();
|
||||
let parse = db.parse(file_id);
|
||||
@@ -112,9 +135,9 @@ fn file_symbols(db: &impl SymbolsDatabase, file_id: FileId) -> Arc<SymbolIndex>
|
||||
}
|
||||
|
||||
/// Need to wrap Snapshot to provide `Clone` impl for `map_with`
|
||||
struct Snap(salsa::Snapshot<RootDatabase>);
|
||||
impl Clone for Snap {
|
||||
fn clone(&self) -> Snap {
|
||||
struct Snap<DB>(DB);
|
||||
impl<DB: ParallelDatabase> Clone for Snap<salsa::Snapshot<DB>> {
|
||||
fn clone(&self) -> Snap<salsa::Snapshot<DB>> {
|
||||
Snap(self.0.snapshot())
|
||||
}
|
||||
}
|
||||
@@ -143,19 +166,11 @@ impl Clone for Snap {
|
||||
pub fn world_symbols(db: &RootDatabase, query: Query) -> Vec<FileSymbol> {
|
||||
let _p = ra_prof::profile("world_symbols").detail(|| query.query.clone());
|
||||
|
||||
let buf: Vec<Arc<SymbolIndex>> = if query.libs {
|
||||
let snap = Snap(db.snapshot());
|
||||
#[cfg(not(feature = "wasm"))]
|
||||
let buf = db
|
||||
.library_roots()
|
||||
.par_iter()
|
||||
.map_with(snap, |db, &lib_id| db.0.library_symbols(lib_id))
|
||||
.collect();
|
||||
|
||||
#[cfg(feature = "wasm")]
|
||||
let buf = db.library_roots().iter().map(|&lib_id| snap.0.library_symbols(lib_id)).collect();
|
||||
|
||||
buf
|
||||
let tmp1;
|
||||
let tmp2;
|
||||
let buf: Vec<&SymbolIndex> = if query.libs {
|
||||
tmp1 = db.library_symbols();
|
||||
tmp1.values().collect()
|
||||
} else {
|
||||
let mut files = Vec::new();
|
||||
for &root in db.local_roots().iter() {
|
||||
@@ -164,14 +179,11 @@ pub fn world_symbols(db: &RootDatabase, query: Query) -> Vec<FileSymbol> {
|
||||
}
|
||||
|
||||
let snap = Snap(db.snapshot());
|
||||
#[cfg(not(feature = "wasm"))]
|
||||
let buf =
|
||||
files.par_iter().map_with(snap, |db, &file_id| db.0.file_symbols(file_id)).collect();
|
||||
|
||||
#[cfg(feature = "wasm")]
|
||||
let buf = files.iter().map(|&file_id| snap.0.file_symbols(file_id)).collect();
|
||||
|
||||
buf
|
||||
tmp2 = files
|
||||
.par_iter()
|
||||
.map_with(snap, |db, &file_id| db.0.file_symbols(file_id))
|
||||
.collect::<Vec<_>>();
|
||||
tmp2.iter().map(|it| &**it).collect()
|
||||
};
|
||||
query.search(&buf)
|
||||
}
|
||||
@@ -191,14 +203,11 @@ pub fn crate_symbols(db: &RootDatabase, krate: CrateId, query: Query) -> Vec<Fil
|
||||
|
||||
let snap = Snap(db.snapshot());
|
||||
|
||||
#[cfg(not(feature = "wasm"))]
|
||||
let buf = files
|
||||
.par_iter()
|
||||
.map_with(snap, |db, &file_id| db.0.file_symbols(file_id))
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
#[cfg(feature = "wasm")]
|
||||
let buf = files.iter().map(|&file_id| snap.0.file_symbols(file_id)).collect::<Vec<_>>();
|
||||
let buf = buf.iter().map(|it| &**it).collect::<Vec<_>>();
|
||||
|
||||
query.search(&buf)
|
||||
}
|
||||
@@ -245,12 +254,8 @@ impl SymbolIndex {
|
||||
lhs_chars.cmp(rhs_chars)
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "wasm"))]
|
||||
symbols.par_sort_by(cmp);
|
||||
|
||||
#[cfg(feature = "wasm")]
|
||||
symbols.sort_by(cmp);
|
||||
|
||||
let mut builder = fst::MapBuilder::memory();
|
||||
|
||||
let mut last_batch_start = 0;
|
||||
@@ -284,7 +289,6 @@ impl SymbolIndex {
|
||||
self.map.as_fst().size() + self.symbols.len() * mem::size_of::<FileSymbol>()
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "wasm"))]
|
||||
pub(crate) fn for_files(
|
||||
files: impl ParallelIterator<Item = (FileId, Parse<ast::SourceFile>)>,
|
||||
) -> SymbolIndex {
|
||||
@@ -294,16 +298,6 @@ impl SymbolIndex {
|
||||
SymbolIndex::new(symbols)
|
||||
}
|
||||
|
||||
#[cfg(feature = "wasm")]
|
||||
pub(crate) fn for_files(
|
||||
files: impl Iterator<Item = (FileId, Parse<ast::SourceFile>)>,
|
||||
) -> SymbolIndex {
|
||||
let symbols = files
|
||||
.flat_map(|(file_id, file)| source_file_to_file_symbols(&file.tree(), file_id))
|
||||
.collect::<Vec<_>>();
|
||||
SymbolIndex::new(symbols)
|
||||
}
|
||||
|
||||
fn range_to_map_value(start: usize, end: usize) -> u64 {
|
||||
debug_assert![start <= (std::u32::MAX as usize)];
|
||||
debug_assert![end <= (std::u32::MAX as usize)];
|
||||
@@ -319,7 +313,7 @@ impl SymbolIndex {
|
||||
}
|
||||
|
||||
impl Query {
|
||||
pub(crate) fn search(self, indices: &[Arc<SymbolIndex>]) -> Vec<FileSymbol> {
|
||||
pub(crate) fn search(self, indices: &[&SymbolIndex]) -> Vec<FileSymbol> {
|
||||
let mut op = fst::map::OpBuilder::new();
|
||||
for file_symbols in indices.iter() {
|
||||
let automaton = fst::automaton::Subsequence::new(&self.lowercased);
|
||||
|
||||
Reference in New Issue
Block a user