From 4bbc385277bcab509c321b1374f72f1ef19d7750 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 7 Jul 2020 10:14:48 +0200 Subject: Switch to fully dynamically dispatched salsa This improves compile times quite a bit --- crates/ra_ide_db/src/change.rs | 20 ++++++++++---------- crates/ra_ide_db/src/lib.rs | 35 +++++++++++++++++------------------ crates/ra_ide_db/src/symbol_index.rs | 8 +++----- 3 files changed, 30 insertions(+), 33 deletions(-) (limited to 'crates/ra_ide_db/src') diff --git a/crates/ra_ide_db/src/change.rs b/crates/ra_ide_db/src/change.rs index 2504d7a33..d8da3f949 100644 --- a/crates/ra_ide_db/src/change.rs +++ b/crates/ra_ide_db/src/change.rs @@ -147,21 +147,21 @@ impl RootDatabase { let sweep = SweepStrategy::default().discard_values().sweep_all_revisions(); - self.query(ra_db::ParseQuery).sweep(sweep); - self.query(hir::db::ParseMacroQuery).sweep(sweep); + ra_db::ParseQuery.in_db(self).sweep(sweep); + hir::db::ParseMacroQuery.in_db(self).sweep(sweep); // Macros do take significant space, but less then the syntax trees // self.query(hir::db::MacroDefQuery).sweep(sweep); // self.query(hir::db::MacroArgQuery).sweep(sweep); // self.query(hir::db::MacroExpandQuery).sweep(sweep); - self.query(hir::db::AstIdMapQuery).sweep(sweep); + hir::db::AstIdMapQuery.in_db(self).sweep(sweep); - self.query(hir::db::BodyWithSourceMapQuery).sweep(sweep); + hir::db::BodyWithSourceMapQuery.in_db(self).sweep(sweep); - self.query(hir::db::ExprScopesQuery).sweep(sweep); - self.query(hir::db::InferQueryQuery).sweep(sweep); - self.query(hir::db::BodyQuery).sweep(sweep); + hir::db::ExprScopesQuery.in_db(self).sweep(sweep); + hir::db::InferQueryQuery.in_db(self).sweep(sweep); + hir::db::BodyQuery.in_db(self).sweep(sweep); } pub fn per_query_memory_usage(&mut self) -> Vec<(String, Bytes)> { @@ -170,14 +170,14 @@ impl RootDatabase { macro_rules! sweep_each_query { ($($q:path)*) => {$( let before = memory_usage().allocated; - self.query($q).sweep(sweep); + $q.in_db(self).sweep(sweep); let after = memory_usage().allocated; let q: $q = Default::default(); let name = format!("{:?}", q); acc.push((name, before - after)); let before = memory_usage().allocated; - self.query($q).sweep(sweep.discard_everything()); + $q.in_db(self).sweep(sweep.discard_everything()); let after = memory_usage().allocated; let q: $q = Default::default(); let name = format!("{:?} (deps)", q); @@ -252,7 +252,7 @@ impl RootDatabase { // write. // We do this after collecting the non-interned queries to correctly attribute memory used // by interned data. - self.runtime.synthetic_write(Durability::HIGH); + self.salsa_runtime_mut().synthetic_write(Durability::HIGH); sweep_each_query![ // AstDatabase diff --git a/crates/ra_ide_db/src/lib.rs b/crates/ra_ide_db/src/lib.rs index c78071ad6..6900cac73 100644 --- a/crates/ra_ide_db/src/lib.rs +++ b/crates/ra_ide_db/src/lib.rs @@ -11,11 +11,11 @@ pub mod imports_locator; pub mod source_change; mod wasm_shims; -use std::sync::Arc; +use std::{fmt, sync::Arc}; use hir::db::{AstDatabase, DefDatabase, HirDatabase}; use ra_db::{ - salsa::{self, Database, Durability}, + salsa::{self, Durability}, Canceled, CheckCanceled, CrateId, FileId, FileLoader, FileLoaderDelegate, SourceDatabase, Upcast, }; @@ -33,13 +33,18 @@ use crate::{line_index::LineIndex, symbol_index::SymbolsDatabase}; hir::db::DefDatabaseStorage, hir::db::HirDatabaseStorage )] -#[derive(Debug)] pub struct RootDatabase { - runtime: salsa::Runtime, + storage: salsa::Storage, pub last_gc: crate::wasm_shims::Instant, pub last_gc_check: crate::wasm_shims::Instant, } +impl fmt::Debug for RootDatabase { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("RootDatabase").finish() + } +} + impl Upcast for RootDatabase { fn upcast(&self) -> &(dyn AstDatabase + 'static) { &*self @@ -71,17 +76,11 @@ impl FileLoader for RootDatabase { } impl salsa::Database for RootDatabase { - fn salsa_runtime(&self) -> &salsa::Runtime { - &self.runtime - } - fn salsa_runtime_mut(&mut self) -> &mut salsa::Runtime { - &mut self.runtime - } fn on_propagated_panic(&self) -> ! { Canceled::throw() } - fn salsa_event(&self, event: impl Fn() -> salsa::Event) { - match event().kind { + fn salsa_event(&self, event: salsa::Event) { + match event.kind { salsa::EventKind::DidValidateMemoizedValue { .. } | salsa::EventKind::WillExecute { .. } => { self.check_canceled(); @@ -100,7 +99,7 @@ impl Default for RootDatabase { impl RootDatabase { pub fn new(lru_capacity: Option) -> RootDatabase { let mut db = RootDatabase { - runtime: salsa::Runtime::default(), + storage: salsa::Storage::default(), last_gc: crate::wasm_shims::Instant::now(), last_gc_check: crate::wasm_shims::Instant::now(), }; @@ -113,16 +112,16 @@ impl RootDatabase { pub fn update_lru_capacity(&mut self, lru_capacity: Option) { let lru_capacity = lru_capacity.unwrap_or(ra_db::DEFAULT_LRU_CAP); - self.query_mut(ra_db::ParseQuery).set_lru_capacity(lru_capacity); - self.query_mut(hir::db::ParseMacroQuery).set_lru_capacity(lru_capacity); - self.query_mut(hir::db::MacroExpandQuery).set_lru_capacity(lru_capacity); + ra_db::ParseQuery.in_db_mut(self).set_lru_capacity(lru_capacity); + hir::db::ParseMacroQuery.in_db_mut(self).set_lru_capacity(lru_capacity); + hir::db::MacroExpandQuery.in_db_mut(self).set_lru_capacity(lru_capacity); } } impl salsa::ParallelDatabase for RootDatabase { fn snapshot(&self) -> salsa::Snapshot { salsa::Snapshot::new(RootDatabase { - runtime: self.runtime.snapshot(self), + storage: self.storage.snapshot(), last_gc: self.last_gc, last_gc_check: self.last_gc_check, }) @@ -134,7 +133,7 @@ pub trait LineIndexDatabase: ra_db::SourceDatabase + CheckCanceled { fn line_index(&self, file_id: FileId) -> Arc; } -fn line_index(db: &impl LineIndexDatabase, file_id: FileId) -> Arc { +fn line_index(db: &dyn LineIndexDatabase, file_id: FileId) -> Arc { let text = db.file_text(file_id); Arc::new(LineIndex::new(&*text)) } diff --git a/crates/ra_ide_db/src/symbol_index.rs b/crates/ra_ide_db/src/symbol_index.rs index 5a09e7d1d..131e2a128 100644 --- a/crates/ra_ide_db/src/symbol_index.rs +++ b/crates/ra_ide_db/src/symbol_index.rs @@ -87,7 +87,7 @@ impl Query { } #[salsa::query_group(SymbolsDatabaseStorage)] -pub trait SymbolsDatabase: hir::db::HirDatabase + SourceDatabaseExt + ParallelDatabase { +pub trait SymbolsDatabase: hir::db::HirDatabase + SourceDatabaseExt { fn file_symbols(&self, file_id: FileId) -> Arc; fn library_symbols(&self) -> Arc>; /// The set of "local" (that is, from the current workspace) roots. @@ -100,9 +100,7 @@ pub trait SymbolsDatabase: hir::db::HirDatabase + SourceDatabaseExt + ParallelDa fn library_roots(&self) -> Arc>; } -fn library_symbols( - db: &(impl SymbolsDatabase + ParallelDatabase), -) -> Arc> { +fn library_symbols(db: &dyn SymbolsDatabase) -> Arc> { let _p = profile("library_symbols"); let roots = db.library_roots(); @@ -123,7 +121,7 @@ fn library_symbols( Arc::new(res) } -fn file_symbols(db: &impl SymbolsDatabase, file_id: FileId) -> Arc { +fn file_symbols(db: &dyn SymbolsDatabase, file_id: FileId) -> Arc { db.check_canceled(); let parse = db.parse(file_id); -- cgit v1.2.3