mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 21:43:37 +00:00
Switch to fully dynamically dispatched salsa
This improves compile times quite a bit
This commit is contained in:
parent
d4bc2f25de
commit
4bbc385277
15 changed files with 88 additions and 105 deletions
8
Cargo.lock
generated
8
Cargo.lock
generated
|
@ -1490,9 +1490,8 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "salsa"
|
name = "salsa"
|
||||||
version = "0.14.4"
|
version = "0.14.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/nikomatsakis/salsa?branch=dynamic-databases-rfc#fd036a4f154c46253443b3a79b6f4400c40e87b1"
|
||||||
checksum = "d4ca1c656054666a642affbbc86ab95ed7541125a89f032483d34ee56c0f5390"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crossbeam-utils",
|
"crossbeam-utils",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
|
@ -1508,8 +1507,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "salsa-macros"
|
name = "salsa-macros"
|
||||||
version = "0.14.1"
|
version = "0.14.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/nikomatsakis/salsa?branch=dynamic-databases-rfc#fd036a4f154c46253443b3a79b6f4400c40e87b1"
|
||||||
checksum = "038a09b6271446f1123f142fe7e5bef6d4687c4cf82e6986be574c2af3745530"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"heck",
|
"heck",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
|
|
|
@ -8,7 +8,7 @@ authors = ["rust-analyzer developers"]
|
||||||
doctest = false
|
doctest = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
salsa = "0.14.1"
|
salsa = { git = "https://github.com/nikomatsakis/salsa", branch = "dynamic-databases-rfc" }
|
||||||
relative-path = "1.0.0"
|
relative-path = "1.0.0"
|
||||||
rustc-hash = "1.1.0"
|
rustc-hash = "1.1.0"
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,7 @@ pub trait SourceDatabase: CheckCanceled + FileLoader + std::fmt::Debug {
|
||||||
fn crate_graph(&self) -> Arc<CrateGraph>;
|
fn crate_graph(&self) -> Arc<CrateGraph>;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_query(db: &impl SourceDatabase, file_id: FileId) -> Parse<ast::SourceFile> {
|
fn parse_query(db: &dyn SourceDatabase, file_id: FileId) -> Parse<ast::SourceFile> {
|
||||||
let _p = profile("parse_query").detail(|| format!("{:?}", file_id));
|
let _p = profile("parse_query").detail(|| format!("{:?}", file_id));
|
||||||
let text = db.file_text(file_id);
|
let text = db.file_text(file_id);
|
||||||
SourceFile::parse(&*text)
|
SourceFile::parse(&*text)
|
||||||
|
@ -136,10 +136,7 @@ pub trait SourceDatabaseExt: SourceDatabase {
|
||||||
fn source_root_crates(&self, id: SourceRootId) -> Arc<FxHashSet<CrateId>>;
|
fn source_root_crates(&self, id: SourceRootId) -> Arc<FxHashSet<CrateId>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn source_root_crates(
|
fn source_root_crates(db: &dyn SourceDatabaseExt, id: SourceRootId) -> Arc<FxHashSet<CrateId>> {
|
||||||
db: &(impl SourceDatabaseExt + SourceDatabase),
|
|
||||||
id: SourceRootId,
|
|
||||||
) -> Arc<FxHashSet<CrateId>> {
|
|
||||||
let graph = db.crate_graph();
|
let graph = db.crate_graph();
|
||||||
let res = graph
|
let res = graph
|
||||||
.iter()
|
.iter()
|
||||||
|
|
|
@ -31,7 +31,7 @@ pub struct FunctionData {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FunctionData {
|
impl FunctionData {
|
||||||
pub(crate) fn fn_data_query(db: &impl DefDatabase, func: FunctionId) -> Arc<FunctionData> {
|
pub(crate) fn fn_data_query(db: &dyn DefDatabase, func: FunctionId) -> Arc<FunctionData> {
|
||||||
let loc = func.lookup(db);
|
let loc = func.lookup(db);
|
||||||
let item_tree = db.item_tree(loc.id.file_id);
|
let item_tree = db.item_tree(loc.id.file_id);
|
||||||
let func = &item_tree[loc.id.value];
|
let func = &item_tree[loc.id.value];
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//! Database used for testing `hir_def`.
|
//! Database used for testing `hir_def`.
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
panic,
|
fmt, panic,
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -18,10 +18,10 @@ use crate::db::DefDatabase;
|
||||||
crate::db::InternDatabaseStorage,
|
crate::db::InternDatabaseStorage,
|
||||||
crate::db::DefDatabaseStorage
|
crate::db::DefDatabaseStorage
|
||||||
)]
|
)]
|
||||||
#[derive(Debug, Default)]
|
#[derive(Default)]
|
||||||
pub struct TestDB {
|
pub struct TestDB {
|
||||||
runtime: salsa::Runtime<TestDB>,
|
storage: salsa::Storage<TestDB>,
|
||||||
events: Mutex<Option<Vec<salsa::Event<TestDB>>>>,
|
events: Mutex<Option<Vec<salsa::Event>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Upcast<dyn AstDatabase> for TestDB {
|
impl Upcast<dyn AstDatabase> for TestDB {
|
||||||
|
@ -37,20 +37,20 @@ impl Upcast<dyn DefDatabase> for TestDB {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl salsa::Database for TestDB {
|
impl salsa::Database for TestDB {
|
||||||
fn salsa_runtime(&self) -> &salsa::Runtime<Self> {
|
fn salsa_event(&self, event: salsa::Event) {
|
||||||
&self.runtime
|
|
||||||
}
|
|
||||||
fn salsa_runtime_mut(&mut self) -> &mut salsa::Runtime<Self> {
|
|
||||||
&mut self.runtime
|
|
||||||
}
|
|
||||||
fn salsa_event(&self, event: impl Fn() -> salsa::Event<TestDB>) {
|
|
||||||
let mut events = self.events.lock().unwrap();
|
let mut events = self.events.lock().unwrap();
|
||||||
if let Some(events) = &mut *events {
|
if let Some(events) = &mut *events {
|
||||||
events.push(event());
|
events.push(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for TestDB {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("TestDB").finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl panic::RefUnwindSafe for TestDB {}
|
impl panic::RefUnwindSafe for TestDB {}
|
||||||
|
|
||||||
impl FileLoader for TestDB {
|
impl FileLoader for TestDB {
|
||||||
|
@ -78,7 +78,7 @@ impl TestDB {
|
||||||
panic!("Can't find module for file")
|
panic!("Can't find module for file")
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn log(&self, f: impl FnOnce()) -> Vec<salsa::Event<TestDB>> {
|
pub fn log(&self, f: impl FnOnce()) -> Vec<salsa::Event> {
|
||||||
*self.events.lock().unwrap() = Some(Vec::new());
|
*self.events.lock().unwrap() = Some(Vec::new());
|
||||||
f();
|
f();
|
||||||
self.events.lock().unwrap().take().unwrap()
|
self.events.lock().unwrap().take().unwrap()
|
||||||
|
@ -92,7 +92,7 @@ impl TestDB {
|
||||||
// This pretty horrible, but `Debug` is the only way to inspect
|
// This pretty horrible, but `Debug` is the only way to inspect
|
||||||
// QueryDescriptor at the moment.
|
// QueryDescriptor at the moment.
|
||||||
salsa::EventKind::WillExecute { database_key } => {
|
salsa::EventKind::WillExecute { database_key } => {
|
||||||
Some(format!("{:?}", database_key))
|
Some(format!("{:?}", database_key.debug(self)))
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//! Database used for testing `hir_expand`.
|
//! Database used for testing `hir_expand`.
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
panic,
|
fmt, panic,
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -13,25 +13,23 @@ use rustc_hash::FxHashSet;
|
||||||
ra_db::SourceDatabaseStorage,
|
ra_db::SourceDatabaseStorage,
|
||||||
crate::db::AstDatabaseStorage
|
crate::db::AstDatabaseStorage
|
||||||
)]
|
)]
|
||||||
#[derive(Debug, Default)]
|
#[derive(Default)]
|
||||||
pub struct TestDB {
|
pub struct TestDB {
|
||||||
runtime: salsa::Runtime<TestDB>,
|
storage: salsa::Storage<TestDB>,
|
||||||
events: Mutex<Option<Vec<salsa::Event<TestDB>>>>,
|
events: Mutex<Option<Vec<salsa::Event>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for TestDB {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("TestDB").finish()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl salsa::Database for TestDB {
|
impl salsa::Database for TestDB {
|
||||||
fn salsa_runtime(&self) -> &salsa::Runtime<Self> {
|
fn salsa_event(&self, event: salsa::Event) {
|
||||||
&self.runtime
|
|
||||||
}
|
|
||||||
|
|
||||||
fn salsa_runtime_mut(&mut self) -> &mut salsa::Runtime<Self> {
|
|
||||||
&mut self.runtime
|
|
||||||
}
|
|
||||||
|
|
||||||
fn salsa_event(&self, event: impl Fn() -> salsa::Event<TestDB>) {
|
|
||||||
let mut events = self.events.lock().unwrap();
|
let mut events = self.events.lock().unwrap();
|
||||||
if let Some(events) = &mut *events {
|
if let Some(events) = &mut *events {
|
||||||
events.push(event());
|
events.push(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,6 @@ use crate::{
|
||||||
use hir_expand::name::Name;
|
use hir_expand::name::Name;
|
||||||
|
|
||||||
#[salsa::query_group(HirDatabaseStorage)]
|
#[salsa::query_group(HirDatabaseStorage)]
|
||||||
#[salsa::requires(salsa::Database)]
|
|
||||||
pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
|
pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
|
||||||
#[salsa::invoke(infer_wait)]
|
#[salsa::invoke(infer_wait)]
|
||||||
#[salsa::transparent]
|
#[salsa::transparent]
|
||||||
|
|
|
@ -1216,7 +1216,7 @@ pub(crate) fn impl_trait_query(db: &dyn HirDatabase, impl_id: ImplId) -> Option<
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn return_type_impl_traits(
|
pub(crate) fn return_type_impl_traits(
|
||||||
db: &impl HirDatabase,
|
db: &dyn HirDatabase,
|
||||||
def: hir_def::FunctionId,
|
def: hir_def::FunctionId,
|
||||||
) -> Option<Arc<Binders<ReturnTypeImplTraits>>> {
|
) -> Option<Arc<Binders<ReturnTypeImplTraits>>> {
|
||||||
// FIXME unify with fn_sig_for_fn instead of doing lowering twice, maybe
|
// FIXME unify with fn_sig_for_fn instead of doing lowering twice, maybe
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//! Database used for testing `hir`.
|
//! Database used for testing `hir`.
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
panic,
|
fmt, panic,
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -26,10 +26,15 @@ use crate::{
|
||||||
hir_def::db::DefDatabaseStorage,
|
hir_def::db::DefDatabaseStorage,
|
||||||
crate::db::HirDatabaseStorage
|
crate::db::HirDatabaseStorage
|
||||||
)]
|
)]
|
||||||
#[derive(Debug, Default)]
|
#[derive(Default)]
|
||||||
pub struct TestDB {
|
pub struct TestDB {
|
||||||
events: Mutex<Option<Vec<salsa::Event<TestDB>>>>,
|
storage: salsa::Storage<TestDB>,
|
||||||
runtime: salsa::Runtime<TestDB>,
|
events: Mutex<Option<Vec<salsa::Event>>>,
|
||||||
|
}
|
||||||
|
impl fmt::Debug for TestDB {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("TestDB").finish()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Upcast<dyn AstDatabase> for TestDB {
|
impl Upcast<dyn AstDatabase> for TestDB {
|
||||||
|
@ -45,18 +50,10 @@ impl Upcast<dyn DefDatabase> for TestDB {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl salsa::Database for TestDB {
|
impl salsa::Database for TestDB {
|
||||||
fn salsa_runtime(&self) -> &salsa::Runtime<TestDB> {
|
fn salsa_event(&self, event: salsa::Event) {
|
||||||
&self.runtime
|
|
||||||
}
|
|
||||||
|
|
||||||
fn salsa_runtime_mut(&mut self) -> &mut salsa::Runtime<Self> {
|
|
||||||
&mut self.runtime
|
|
||||||
}
|
|
||||||
|
|
||||||
fn salsa_event(&self, event: impl Fn() -> salsa::Event<TestDB>) {
|
|
||||||
let mut events = self.events.lock().unwrap();
|
let mut events = self.events.lock().unwrap();
|
||||||
if let Some(events) = &mut *events {
|
if let Some(events) = &mut *events {
|
||||||
events.push(event());
|
events.push(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,8 +61,8 @@ impl salsa::Database for TestDB {
|
||||||
impl salsa::ParallelDatabase for TestDB {
|
impl salsa::ParallelDatabase for TestDB {
|
||||||
fn snapshot(&self) -> salsa::Snapshot<TestDB> {
|
fn snapshot(&self) -> salsa::Snapshot<TestDB> {
|
||||||
salsa::Snapshot::new(TestDB {
|
salsa::Snapshot::new(TestDB {
|
||||||
|
storage: self.storage.snapshot(),
|
||||||
events: Default::default(),
|
events: Default::default(),
|
||||||
runtime: self.runtime.snapshot(self),
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -182,7 +179,7 @@ impl TestDB {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TestDB {
|
impl TestDB {
|
||||||
pub fn log(&self, f: impl FnOnce()) -> Vec<salsa::Event<TestDB>> {
|
pub fn log(&self, f: impl FnOnce()) -> Vec<salsa::Event> {
|
||||||
*self.events.lock().unwrap() = Some(Vec::new());
|
*self.events.lock().unwrap() = Some(Vec::new());
|
||||||
f();
|
f();
|
||||||
self.events.lock().unwrap().take().unwrap()
|
self.events.lock().unwrap().take().unwrap()
|
||||||
|
@ -196,7 +193,7 @@ impl TestDB {
|
||||||
// This pretty horrible, but `Debug` is the only way to inspect
|
// This pretty horrible, but `Debug` is the only way to inspect
|
||||||
// QueryDescriptor at the moment.
|
// QueryDescriptor at the moment.
|
||||||
salsa::EventKind::WillExecute { database_key } => {
|
salsa::EventKind::WillExecute { database_key } => {
|
||||||
Some(format!("{:?}", database_key))
|
Some(format!("{:?}", database_key.debug(self)))
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
})
|
})
|
||||||
|
|
|
@ -21,7 +21,7 @@ use hir_def::{
|
||||||
};
|
};
|
||||||
use hir_expand::{db::AstDatabase, InFile};
|
use hir_expand::{db::AstDatabase, InFile};
|
||||||
use insta::assert_snapshot;
|
use insta::assert_snapshot;
|
||||||
use ra_db::{fixture::WithFixture, salsa::Database, FileRange, SourceDatabase};
|
use ra_db::{fixture::WithFixture, FileRange, SourceDatabase, SourceDatabaseExt};
|
||||||
use ra_syntax::{
|
use ra_syntax::{
|
||||||
algo,
|
algo,
|
||||||
ast::{self, AstNode},
|
ast::{self, AstNode},
|
||||||
|
@ -317,7 +317,7 @@ fn typing_whitespace_inside_a_function_should_not_invalidate_types() {
|
||||||
"
|
"
|
||||||
.to_string();
|
.to_string();
|
||||||
|
|
||||||
db.query_mut(ra_db::FileTextQuery).set(pos.file_id, Arc::new(new_text));
|
db.set_file_text(pos.file_id, Arc::new(new_text));
|
||||||
|
|
||||||
{
|
{
|
||||||
let events = db.log_executed(|| {
|
let events = db.log_executed(|| {
|
||||||
|
|
|
@ -10,7 +10,7 @@ use hir_def::{AdtId, AssocContainerId, DefWithBodyId, Lookup, TypeAliasId};
|
||||||
|
|
||||||
pub use unsafe_tls::{set_current_program, with_current_program};
|
pub use unsafe_tls::{set_current_program, with_current_program};
|
||||||
|
|
||||||
pub struct DebugContext<'a>(&'a (dyn HirDatabase + 'a));
|
pub struct DebugContext<'a>(&'a dyn HirDatabase);
|
||||||
|
|
||||||
impl DebugContext<'_> {
|
impl DebugContext<'_> {
|
||||||
pub fn debug_struct_id(
|
pub fn debug_struct_id(
|
||||||
|
|
|
@ -2,10 +2,7 @@ use std::{fmt, iter::FromIterator, sync::Arc};
|
||||||
|
|
||||||
use hir::MacroFile;
|
use hir::MacroFile;
|
||||||
use ra_db::{
|
use ra_db::{
|
||||||
salsa::{
|
salsa::debug::{DebugQueryTable, TableEntry},
|
||||||
debug::{DebugQueryTable, TableEntry},
|
|
||||||
Database,
|
|
||||||
},
|
|
||||||
FileTextQuery, SourceRootId,
|
FileTextQuery, SourceRootId,
|
||||||
};
|
};
|
||||||
use ra_ide_db::{
|
use ra_ide_db::{
|
||||||
|
@ -14,15 +11,15 @@ use ra_ide_db::{
|
||||||
};
|
};
|
||||||
use ra_prof::{memory_usage, Bytes};
|
use ra_prof::{memory_usage, Bytes};
|
||||||
use ra_syntax::{ast, Parse, SyntaxNode};
|
use ra_syntax::{ast, Parse, SyntaxNode};
|
||||||
|
|
||||||
use crate::FileId;
|
|
||||||
use rustc_hash::FxHashMap;
|
use rustc_hash::FxHashMap;
|
||||||
|
|
||||||
|
use crate::FileId;
|
||||||
|
|
||||||
fn syntax_tree_stats(db: &RootDatabase) -> SyntaxTreeStats {
|
fn syntax_tree_stats(db: &RootDatabase) -> SyntaxTreeStats {
|
||||||
db.query(ra_db::ParseQuery).entries::<SyntaxTreeStats>()
|
ra_db::ParseQuery.in_db(db).entries::<SyntaxTreeStats>()
|
||||||
}
|
}
|
||||||
fn macro_syntax_tree_stats(db: &RootDatabase) -> SyntaxTreeStats {
|
fn macro_syntax_tree_stats(db: &RootDatabase) -> SyntaxTreeStats {
|
||||||
db.query(hir::db::ParseMacroQuery).entries::<SyntaxTreeStats>()
|
hir::db::ParseMacroQuery.in_db(db).entries::<SyntaxTreeStats>()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Feature: Status
|
// Feature: Status
|
||||||
|
@ -35,10 +32,10 @@ fn macro_syntax_tree_stats(db: &RootDatabase) -> SyntaxTreeStats {
|
||||||
// | VS Code | **Rust Analyzer: Status**
|
// | VS Code | **Rust Analyzer: Status**
|
||||||
// |===
|
// |===
|
||||||
pub(crate) fn status(db: &RootDatabase) -> String {
|
pub(crate) fn status(db: &RootDatabase) -> String {
|
||||||
let files_stats = db.query(FileTextQuery).entries::<FilesStats>();
|
let files_stats = FileTextQuery.in_db(db).entries::<FilesStats>();
|
||||||
let syntax_tree_stats = syntax_tree_stats(db);
|
let syntax_tree_stats = syntax_tree_stats(db);
|
||||||
let macro_syntax_tree_stats = macro_syntax_tree_stats(db);
|
let macro_syntax_tree_stats = macro_syntax_tree_stats(db);
|
||||||
let symbols_stats = db.query(LibrarySymbolsQuery).entries::<LibrarySymbolsStats>();
|
let symbols_stats = LibrarySymbolsQuery.in_db(db).entries::<LibrarySymbolsStats>();
|
||||||
format!(
|
format!(
|
||||||
"{}\n{}\n{}\n{} (macros)\n\n\nmemory:\n{}\ngc {:?} seconds ago",
|
"{}\n{}\n{}\n{} (macros)\n\n\nmemory:\n{}\ngc {:?} seconds ago",
|
||||||
files_stats,
|
files_stats,
|
||||||
|
|
|
@ -147,21 +147,21 @@ impl RootDatabase {
|
||||||
|
|
||||||
let sweep = SweepStrategy::default().discard_values().sweep_all_revisions();
|
let sweep = SweepStrategy::default().discard_values().sweep_all_revisions();
|
||||||
|
|
||||||
self.query(ra_db::ParseQuery).sweep(sweep);
|
ra_db::ParseQuery.in_db(self).sweep(sweep);
|
||||||
self.query(hir::db::ParseMacroQuery).sweep(sweep);
|
hir::db::ParseMacroQuery.in_db(self).sweep(sweep);
|
||||||
|
|
||||||
// Macros do take significant space, but less then the syntax trees
|
// Macros do take significant space, but less then the syntax trees
|
||||||
// self.query(hir::db::MacroDefQuery).sweep(sweep);
|
// self.query(hir::db::MacroDefQuery).sweep(sweep);
|
||||||
// self.query(hir::db::MacroArgQuery).sweep(sweep);
|
// self.query(hir::db::MacroArgQuery).sweep(sweep);
|
||||||
// self.query(hir::db::MacroExpandQuery).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);
|
hir::db::ExprScopesQuery.in_db(self).sweep(sweep);
|
||||||
self.query(hir::db::InferQueryQuery).sweep(sweep);
|
hir::db::InferQueryQuery.in_db(self).sweep(sweep);
|
||||||
self.query(hir::db::BodyQuery).sweep(sweep);
|
hir::db::BodyQuery.in_db(self).sweep(sweep);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn per_query_memory_usage(&mut self) -> Vec<(String, Bytes)> {
|
pub fn per_query_memory_usage(&mut self) -> Vec<(String, Bytes)> {
|
||||||
|
@ -170,14 +170,14 @@ impl RootDatabase {
|
||||||
macro_rules! sweep_each_query {
|
macro_rules! sweep_each_query {
|
||||||
($($q:path)*) => {$(
|
($($q:path)*) => {$(
|
||||||
let before = memory_usage().allocated;
|
let before = memory_usage().allocated;
|
||||||
self.query($q).sweep(sweep);
|
$q.in_db(self).sweep(sweep);
|
||||||
let after = memory_usage().allocated;
|
let after = memory_usage().allocated;
|
||||||
let q: $q = Default::default();
|
let q: $q = Default::default();
|
||||||
let name = format!("{:?}", q);
|
let name = format!("{:?}", q);
|
||||||
acc.push((name, before - after));
|
acc.push((name, before - after));
|
||||||
|
|
||||||
let before = memory_usage().allocated;
|
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 after = memory_usage().allocated;
|
||||||
let q: $q = Default::default();
|
let q: $q = Default::default();
|
||||||
let name = format!("{:?} (deps)", q);
|
let name = format!("{:?} (deps)", q);
|
||||||
|
@ -252,7 +252,7 @@ impl RootDatabase {
|
||||||
// write.
|
// write.
|
||||||
// We do this after collecting the non-interned queries to correctly attribute memory used
|
// We do this after collecting the non-interned queries to correctly attribute memory used
|
||||||
// by interned data.
|
// by interned data.
|
||||||
self.runtime.synthetic_write(Durability::HIGH);
|
self.salsa_runtime_mut().synthetic_write(Durability::HIGH);
|
||||||
|
|
||||||
sweep_each_query![
|
sweep_each_query![
|
||||||
// AstDatabase
|
// AstDatabase
|
||||||
|
|
|
@ -11,11 +11,11 @@ pub mod imports_locator;
|
||||||
pub mod source_change;
|
pub mod source_change;
|
||||||
mod wasm_shims;
|
mod wasm_shims;
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::{fmt, sync::Arc};
|
||||||
|
|
||||||
use hir::db::{AstDatabase, DefDatabase, HirDatabase};
|
use hir::db::{AstDatabase, DefDatabase, HirDatabase};
|
||||||
use ra_db::{
|
use ra_db::{
|
||||||
salsa::{self, Database, Durability},
|
salsa::{self, Durability},
|
||||||
Canceled, CheckCanceled, CrateId, FileId, FileLoader, FileLoaderDelegate, SourceDatabase,
|
Canceled, CheckCanceled, CrateId, FileId, FileLoader, FileLoaderDelegate, SourceDatabase,
|
||||||
Upcast,
|
Upcast,
|
||||||
};
|
};
|
||||||
|
@ -33,13 +33,18 @@ use crate::{line_index::LineIndex, symbol_index::SymbolsDatabase};
|
||||||
hir::db::DefDatabaseStorage,
|
hir::db::DefDatabaseStorage,
|
||||||
hir::db::HirDatabaseStorage
|
hir::db::HirDatabaseStorage
|
||||||
)]
|
)]
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct RootDatabase {
|
pub struct RootDatabase {
|
||||||
runtime: salsa::Runtime<RootDatabase>,
|
storage: salsa::Storage<RootDatabase>,
|
||||||
pub last_gc: crate::wasm_shims::Instant,
|
pub last_gc: crate::wasm_shims::Instant,
|
||||||
pub last_gc_check: 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<dyn AstDatabase> for RootDatabase {
|
impl Upcast<dyn AstDatabase> for RootDatabase {
|
||||||
fn upcast(&self) -> &(dyn AstDatabase + 'static) {
|
fn upcast(&self) -> &(dyn AstDatabase + 'static) {
|
||||||
&*self
|
&*self
|
||||||
|
@ -71,17 +76,11 @@ impl FileLoader for RootDatabase {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl salsa::Database for RootDatabase {
|
impl salsa::Database for RootDatabase {
|
||||||
fn salsa_runtime(&self) -> &salsa::Runtime<RootDatabase> {
|
|
||||||
&self.runtime
|
|
||||||
}
|
|
||||||
fn salsa_runtime_mut(&mut self) -> &mut salsa::Runtime<Self> {
|
|
||||||
&mut self.runtime
|
|
||||||
}
|
|
||||||
fn on_propagated_panic(&self) -> ! {
|
fn on_propagated_panic(&self) -> ! {
|
||||||
Canceled::throw()
|
Canceled::throw()
|
||||||
}
|
}
|
||||||
fn salsa_event(&self, event: impl Fn() -> salsa::Event<RootDatabase>) {
|
fn salsa_event(&self, event: salsa::Event) {
|
||||||
match event().kind {
|
match event.kind {
|
||||||
salsa::EventKind::DidValidateMemoizedValue { .. }
|
salsa::EventKind::DidValidateMemoizedValue { .. }
|
||||||
| salsa::EventKind::WillExecute { .. } => {
|
| salsa::EventKind::WillExecute { .. } => {
|
||||||
self.check_canceled();
|
self.check_canceled();
|
||||||
|
@ -100,7 +99,7 @@ impl Default for RootDatabase {
|
||||||
impl RootDatabase {
|
impl RootDatabase {
|
||||||
pub fn new(lru_capacity: Option<usize>) -> RootDatabase {
|
pub fn new(lru_capacity: Option<usize>) -> RootDatabase {
|
||||||
let mut db = RootDatabase {
|
let mut db = RootDatabase {
|
||||||
runtime: salsa::Runtime::default(),
|
storage: salsa::Storage::default(),
|
||||||
last_gc: crate::wasm_shims::Instant::now(),
|
last_gc: crate::wasm_shims::Instant::now(),
|
||||||
last_gc_check: 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<usize>) {
|
pub fn update_lru_capacity(&mut self, lru_capacity: Option<usize>) {
|
||||||
let lru_capacity = lru_capacity.unwrap_or(ra_db::DEFAULT_LRU_CAP);
|
let lru_capacity = lru_capacity.unwrap_or(ra_db::DEFAULT_LRU_CAP);
|
||||||
self.query_mut(ra_db::ParseQuery).set_lru_capacity(lru_capacity);
|
ra_db::ParseQuery.in_db_mut(self).set_lru_capacity(lru_capacity);
|
||||||
self.query_mut(hir::db::ParseMacroQuery).set_lru_capacity(lru_capacity);
|
hir::db::ParseMacroQuery.in_db_mut(self).set_lru_capacity(lru_capacity);
|
||||||
self.query_mut(hir::db::MacroExpandQuery).set_lru_capacity(lru_capacity);
|
hir::db::MacroExpandQuery.in_db_mut(self).set_lru_capacity(lru_capacity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl salsa::ParallelDatabase for RootDatabase {
|
impl salsa::ParallelDatabase for RootDatabase {
|
||||||
fn snapshot(&self) -> salsa::Snapshot<RootDatabase> {
|
fn snapshot(&self) -> salsa::Snapshot<RootDatabase> {
|
||||||
salsa::Snapshot::new(RootDatabase {
|
salsa::Snapshot::new(RootDatabase {
|
||||||
runtime: self.runtime.snapshot(self),
|
storage: self.storage.snapshot(),
|
||||||
last_gc: self.last_gc,
|
last_gc: self.last_gc,
|
||||||
last_gc_check: self.last_gc_check,
|
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<LineIndex>;
|
fn line_index(&self, file_id: FileId) -> Arc<LineIndex>;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn line_index(db: &impl LineIndexDatabase, file_id: FileId) -> Arc<LineIndex> {
|
fn line_index(db: &dyn LineIndexDatabase, file_id: FileId) -> Arc<LineIndex> {
|
||||||
let text = db.file_text(file_id);
|
let text = db.file_text(file_id);
|
||||||
Arc::new(LineIndex::new(&*text))
|
Arc::new(LineIndex::new(&*text))
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,7 @@ impl Query {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[salsa::query_group(SymbolsDatabaseStorage)]
|
#[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<SymbolIndex>;
|
fn file_symbols(&self, file_id: FileId) -> Arc<SymbolIndex>;
|
||||||
fn library_symbols(&self) -> Arc<FxHashMap<SourceRootId, SymbolIndex>>;
|
fn library_symbols(&self) -> Arc<FxHashMap<SourceRootId, SymbolIndex>>;
|
||||||
/// The set of "local" (that is, from the current workspace) roots.
|
/// 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<FxHashSet<SourceRootId>>;
|
fn library_roots(&self) -> Arc<FxHashSet<SourceRootId>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn library_symbols(
|
fn library_symbols(db: &dyn SymbolsDatabase) -> Arc<FxHashMap<SourceRootId, SymbolIndex>> {
|
||||||
db: &(impl SymbolsDatabase + ParallelDatabase),
|
|
||||||
) -> Arc<FxHashMap<SourceRootId, SymbolIndex>> {
|
|
||||||
let _p = profile("library_symbols");
|
let _p = profile("library_symbols");
|
||||||
|
|
||||||
let roots = db.library_roots();
|
let roots = db.library_roots();
|
||||||
|
@ -123,7 +121,7 @@ fn library_symbols(
|
||||||
Arc::new(res)
|
Arc::new(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn file_symbols(db: &impl SymbolsDatabase, file_id: FileId) -> Arc<SymbolIndex> {
|
fn file_symbols(db: &dyn SymbolsDatabase, file_id: FileId) -> Arc<SymbolIndex> {
|
||||||
db.check_canceled();
|
db.check_canceled();
|
||||||
let parse = db.parse(file_id);
|
let parse = db.parse(file_id);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue