From a2ca03d10b093ea20d7db8bfd78aa1e787482cc0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 17 Jan 2019 14:11:00 +0300 Subject: :arrow_up: salsa --- crates/ra_db/Cargo.toml | 2 +- crates/ra_db/src/input.rs | 65 +++++-------- crates/ra_db/src/lib.rs | 10 +- crates/ra_hir/Cargo.toml | 1 - crates/ra_hir/src/db.rs | 174 ++++++++++++++-------------------- crates/ra_hir/src/mock.rs | 10 +- crates/ra_hir/src/nameres/tests.rs | 3 +- crates/ra_hir/src/ty/tests.rs | 4 +- crates/ra_ide_api/Cargo.toml | 1 - crates/ra_ide_api/src/db.rs | 19 ++-- crates/ra_ide_api/src/imp.rs | 9 +- crates/ra_ide_api/src/lib.rs | 6 +- crates/ra_ide_api/src/symbol_index.rs | 21 ++-- 13 files changed, 135 insertions(+), 190 deletions(-) (limited to 'crates') diff --git a/crates/ra_db/Cargo.toml b/crates/ra_db/Cargo.toml index 21d987688..bb1b5eae7 100644 --- a/crates/ra_db/Cargo.toml +++ b/crates/ra_db/Cargo.toml @@ -6,7 +6,7 @@ authors = ["Aleksey Kladov "] [dependencies] relative-path = "0.4.0" -salsa = "0.9.2" +salsa = "0.10.0-alpha1" rustc-hash = "1.0" parking_lot = "0.7.0" ra_arena = { path = "../ra_arena" } diff --git a/crates/ra_db/src/input.rs b/crates/ra_db/src/input.rs index 2b761ea0c..b5d63e820 100644 --- a/crates/ra_db/src/input.rs +++ b/crates/ra_db/src/input.rs @@ -146,46 +146,31 @@ impl CrateGraph { } } -salsa::query_group! { - pub trait FilesDatabase: salsa::Database { - /// Text of the file. - fn file_text(file_id: FileId) -> Arc { - type FileTextQuery; - storage input; - } - /// Path to a file, relative to the root of its source root. - fn file_relative_path(file_id: FileId) -> RelativePathBuf { - type FileRelativePathQuery; - storage input; - } - /// Source root of the file. - fn file_source_root(file_id: FileId) -> SourceRootId { - type FileSourceRootQuery; - storage input; - } - /// Contents of the source root. - fn source_root(id: SourceRootId) -> Arc { - type SourceRootQuery; - storage input; - } - /// The set of "local" (that is, from the current workspace) roots. - /// Files in local roots are assumed to change frequently. - fn local_roots() -> Arc> { - type LocalRootsQuery; - storage input; - } - /// The set of roots for crates.io libraries. - /// Files in libraries are assumed to never change. - fn library_roots() -> Arc> { - type LibraryRootsQuery; - storage input; - } - /// The crate graph. - fn crate_graph() -> Arc { - type CrateGraphQuery; - storage input; - } - } +#[salsa::query_group] +pub trait FilesDatabase: salsa::Database { + /// Text of the file. + #[salsa::input] + fn file_text(&self, file_id: FileId) -> Arc; + /// Path to a file, relative to the root of its source root. + #[salsa::input] + fn file_relative_path(&self, file_id: FileId) -> RelativePathBuf; + /// Source root of the file. + #[salsa::input] + fn file_source_root(&self, file_id: FileId) -> SourceRootId; + /// Contents of the source root. + #[salsa::input] + fn source_root(&self, id: SourceRootId) -> Arc; + /// The set of "local" (that is, from the current workspace) roots. + /// Files in local roots are assumed to change frequently. + #[salsa::input] + fn local_roots(&self) -> Arc>; + /// The set of roots for crates.io libraries. + /// Files in libraries are assumed to never change. + #[salsa::input] + fn library_roots(&self) -> Arc>; + /// The crate graph. + #[salsa::input] + fn crate_graph(&self) -> Arc; } #[cfg(test)] diff --git a/crates/ra_db/src/lib.rs b/crates/ra_db/src/lib.rs index 89113e7a6..dbeb9ec71 100644 --- a/crates/ra_db/src/lib.rs +++ b/crates/ra_db/src/lib.rs @@ -9,6 +9,7 @@ use std::panic; use ra_syntax::{TextUnit, TextRange, SourceFile, TreeArc}; +pub use ::salsa as salsa; pub use crate::{ cancellation::Canceled, syntax_ptr::LocalSyntaxPtr, @@ -51,12 +52,9 @@ pub trait BaseDatabase: salsa::Database + panic::RefUnwindSafe { } } -salsa::query_group! { - pub trait SyntaxDatabase: crate::input::FilesDatabase + BaseDatabase { - fn source_file(file_id: FileId) -> TreeArc { - type SourceFileQuery; - } - } +#[salsa::query_group] +pub trait SyntaxDatabase: crate::input::FilesDatabase + BaseDatabase { + fn source_file(&self, file_id: FileId) -> TreeArc; } fn source_file(db: &impl SyntaxDatabase, file_id: FileId) -> TreeArc { diff --git a/crates/ra_hir/Cargo.toml b/crates/ra_hir/Cargo.toml index 415848f09..87d2e98e9 100644 --- a/crates/ra_hir/Cargo.toml +++ b/crates/ra_hir/Cargo.toml @@ -8,7 +8,6 @@ authors = ["Aleksey Kladov "] arrayvec = "0.4.10" log = "0.4.5" relative-path = "0.4.0" -salsa = "0.9.2" rustc-hash = "1.0" parking_lot = "0.7.0" ena = "0.11" diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs index 0a0994f5f..b42f10071 100644 --- a/crates/ra_hir/src/db.rs +++ b/crates/ra_hir/src/db.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use ra_syntax::{SyntaxNode, TreeArc, SourceFile}; -use ra_db::{SourceRootId, LocationIntener, SyntaxDatabase}; +use ra_db::{SourceRootId, LocationIntener, SyntaxDatabase, salsa}; use crate::{ DefLoc, DefId, MacroCallLoc, MacroCallId, Name, HirFileId, @@ -16,111 +16,77 @@ use crate::{ impl_block::ModuleImplBlocks, }; -salsa::query_group! { - -pub trait HirDatabase: SyntaxDatabase +#[salsa::query_group] +pub trait HirDatabase: + SyntaxDatabase + AsRef> + AsRef> { - fn hir_source_file(file_id: HirFileId) -> TreeArc { - type HirSourceFileQuery; - use fn HirFileId::hir_source_file; - } - - fn expand_macro_invocation(invoc: MacroCallId) -> Option> { - type ExpandMacroCallQuery; - use fn crate::macros::expand_macro_invocation; - } - - fn fn_scopes(def_id: DefId) -> Arc { - type FnScopesQuery; - use fn query_definitions::fn_scopes; - } - - fn struct_data(def_id: DefId) -> Arc { - type StructDataQuery; - use fn crate::adt::StructData::struct_data_query; - } - - fn enum_data(def_id: DefId) -> Arc { - type EnumDataQuery; - use fn crate::adt::EnumData::enum_data_query; - } - - fn enum_variant_data(def_id: DefId) -> Arc { - type EnumVariantDataQuery; - use fn crate::adt::EnumVariantData::enum_variant_data_query; - } - - fn infer(def_id: DefId) -> Arc { - type InferQuery; - use fn crate::ty::infer; - } - - fn type_for_def(def_id: DefId) -> Ty { - type TypeForDefQuery; - use fn crate::ty::type_for_def; - } - - fn type_for_field(def_id: DefId, field: Name) -> Option { - type TypeForFieldQuery; - use fn crate::ty::type_for_field; - } - - fn file_items(file_id: HirFileId) -> Arc { - type SourceFileItemsQuery; - use fn query_definitions::file_items; - } - - fn file_item(source_item_id: SourceItemId) -> TreeArc { - type FileItemQuery; - use fn query_definitions::file_item; - } - - fn submodules(source: SourceItemId) -> Arc> { - type SubmodulesQuery; - use fn crate::module_tree::Submodule::submodules_query; - } - - fn input_module_items(source_root_id: SourceRootId, module_id: ModuleId) -> Arc { - type InputModuleItemsQuery; - use fn query_definitions::input_module_items; - } - - fn item_map(source_root_id: SourceRootId) -> Arc { - type ItemMapQuery; - use fn query_definitions::item_map; - } - - fn module_tree(source_root_id: SourceRootId) -> Arc { - type ModuleTreeQuery; - use fn crate::module_tree::ModuleTree::module_tree_query; - } - - fn impls_in_module(source_root_id: SourceRootId, module_id: ModuleId) -> Arc { - type ImplsInModuleQuery; - use fn crate::impl_block::impls_in_module; - } - - fn impls_in_crate(krate: Crate) -> Arc { - type ImplsInCrateQuery; - use fn crate::ty::method_resolution::CrateImplBlocks::impls_in_crate_query; - } - - fn body_hir(def_id: DefId) -> Arc { - type BodyHirQuery; - use fn crate::expr::body_hir; - } - - fn body_syntax_mapping(def_id: DefId) -> Arc { - type BodySyntaxMappingQuery; - use fn crate::expr::body_syntax_mapping; - } - - fn fn_signature(def_id: DefId) -> Arc { - type FnSignatureQuery; - use fn crate::FnSignature::fn_signature_query; - } -} + #[salsa::invoke(HirFileId::hir_source_file)] + fn hir_source_file(&self, file_id: HirFileId) -> TreeArc; + + #[salsa::invoke(crate::macros::expand_macro_invocation)] + fn expand_macro_invocation(&self, invoc: MacroCallId) -> Option>; + + #[salsa::invoke(query_definitions::fn_scopes)] + fn fn_scopes(&self, def_id: DefId) -> Arc; + + #[salsa::invoke(crate::adt::StructData::struct_data_query)] + fn struct_data(&self, def_id: DefId) -> Arc; + + #[salsa::invoke(crate::adt::EnumData::enum_data_query)] + fn enum_data(&self, def_id: DefId) -> Arc; + + #[salsa::invoke(crate::adt::EnumVariantData::enum_variant_data_query)] + fn enum_variant_data(&self, def_id: DefId) -> Arc; + + #[salsa::invoke(crate::ty::infer)] + fn infer(&self, def_id: DefId) -> Arc; + + #[salsa::invoke(crate::ty::type_for_def)] + fn type_for_def(&self, def_id: DefId) -> Ty; + + #[salsa::invoke(crate::ty::type_for_field)] + fn type_for_field(&self, def_id: DefId, field: Name) -> Option; + + #[salsa::invoke(query_definitions::file_items)] + fn file_items(&self, file_id: HirFileId) -> Arc; + + #[salsa::invoke(query_definitions::file_item)] + fn file_item(&self, source_item_id: SourceItemId) -> TreeArc; + + #[salsa::invoke(crate::module_tree::Submodule::submodules_query)] + fn submodules(&self, source: SourceItemId) -> Arc>; + + #[salsa::invoke(query_definitions::input_module_items)] + fn input_module_items( + &self, + source_root_id: SourceRootId, + module_id: ModuleId, + ) -> Arc; + + #[salsa::invoke(query_definitions::item_map)] + fn item_map(&self, source_root_id: SourceRootId) -> Arc; + + #[salsa::invoke(crate::module_tree::ModuleTree::module_tree_query)] + fn module_tree(&self, source_root_id: SourceRootId) -> Arc; + + #[salsa::invoke(crate::impl_block::impls_in_module)] + fn impls_in_module( + &self, + source_root_id: SourceRootId, + module_id: ModuleId, + ) -> Arc; + + #[salsa::invoke(crate::ty::method_resolution::CrateImplBlocks::impls_in_crate_query)] + fn impls_in_crate(&self, krate: Crate) -> Arc; + + #[salsa::invoke(crate::expr::body_hir)] + fn body_hir(&self, def_id: DefId) -> Arc; + + #[salsa::invoke(crate::expr::body_syntax_mapping)] + fn body_syntax_mapping(&self, def_id: DefId) -> Arc; + #[salsa::invoke(crate::FnSignature::fn_signature_query)] + fn fn_signature(&self, def_id: DefId) -> Arc; } diff --git a/crates/ra_hir/src/mock.rs b/crates/ra_hir/src/mock.rs index 9371c5a0d..a83a5c6cc 100644 --- a/crates/ra_hir/src/mock.rs +++ b/crates/ra_hir/src/mock.rs @@ -1,8 +1,10 @@ use std::{sync::Arc, panic}; use parking_lot::Mutex; -use salsa::{self, Database}; -use ra_db::{LocationIntener, BaseDatabase, FilePosition, FileId, CrateGraph, SourceRoot, SourceRootId}; +use ra_db::{ + LocationIntener, BaseDatabase, FilePosition, FileId, CrateGraph, SourceRoot, SourceRootId, + salsa::{self, Database}, +}; use relative_path::RelativePathBuf; use test_utils::{parse_fixture, CURSOR_MARKER, extract_offset}; @@ -220,10 +222,10 @@ salsa::database_storage! { } impl db::HirDatabase { fn hir_source_file() for db::HirSourceFileQuery; - fn expand_macro_invocation() for db::ExpandMacroCallQuery; + fn expand_macro_invocation() for db::ExpandMacroInvocationQuery; fn module_tree() for db::ModuleTreeQuery; fn fn_scopes() for db::FnScopesQuery; - fn file_items() for db::SourceFileItemsQuery; + fn file_items() for db::FileItemsQuery; fn file_item() for db::FileItemQuery; fn input_module_items() for db::InputModuleItemsQuery; fn item_map() for db::ItemMapQuery; diff --git a/crates/ra_hir/src/nameres/tests.rs b/crates/ra_hir/src/nameres/tests.rs index 9a0474045..0ec11ec12 100644 --- a/crates/ra_hir/src/nameres/tests.rs +++ b/crates/ra_hir/src/nameres/tests.rs @@ -1,7 +1,6 @@ use std::sync::Arc; -use salsa::Database; -use ra_db::{FilesDatabase, CrateGraph, SourceRootId}; +use ra_db::{FilesDatabase, CrateGraph, SourceRootId, salsa::Database}; use relative_path::RelativePath; use test_utils::assert_eq_text; diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index affd63a85..a430cbe88 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs @@ -3,9 +3,7 @@ use std::fmt::Write; use std::path::{PathBuf, Path}; use std::fs; -use salsa::Database; - -use ra_db::SyntaxDatabase; +use ra_db::{SyntaxDatabase, salsa::Database}; use ra_syntax::ast::{self, AstNode}; use test_utils::{project_dir, assert_eq_text, read_text}; diff --git a/crates/ra_ide_api/Cargo.toml b/crates/ra_ide_api/Cargo.toml index 022cbd5a3..702c11932 100644 --- a/crates/ra_ide_api/Cargo.toml +++ b/crates/ra_ide_api/Cargo.toml @@ -10,7 +10,6 @@ log = "0.4.5" relative-path = "0.4.0" rayon = "1.0.2" fst = "0.3.1" -salsa = "0.9.2" rustc-hash = "1.0" parking_lot = "0.7.0" unicase = "2.2.0" diff --git a/crates/ra_ide_api/src/db.rs b/crates/ra_ide_api/src/db.rs index 60f84675d..36778b955 100644 --- a/crates/ra_ide_api/src/db.rs +++ b/crates/ra_ide_api/src/db.rs @@ -1,7 +1,9 @@ use std::{fmt, sync::Arc}; -use salsa::{self, Database}; -use ra_db::{LocationIntener, BaseDatabase, FileId, Canceled}; +use ra_db::{ + LocationIntener, BaseDatabase, FileId, Canceled, + salsa::{self, Database}, +}; use crate::{symbol_index, LineIndex}; @@ -73,12 +75,9 @@ impl AsRef> for RootDatabas } } -salsa::query_group! { - pub(crate) trait LineIndexDatabase: ra_db::FilesDatabase + BaseDatabase { - fn line_index(file_id: FileId) -> Arc { - type LineIndexQuery; - } - } +#[salsa::query_group] +pub(crate) trait LineIndexDatabase: ra_db::FilesDatabase + BaseDatabase { + fn line_index(&self, file_id: FileId) -> Arc; } fn line_index(db: &impl ra_db::FilesDatabase, file_id: FileId) -> Arc { @@ -109,10 +108,10 @@ salsa::database_storage! { } impl hir::db::HirDatabase { fn hir_source_file() for hir::db::HirSourceFileQuery; - fn expand_macro_invocation() for hir::db::ExpandMacroCallQuery; + fn expand_macro_invocation() for hir::db::ExpandMacroInvocationQuery; fn module_tree() for hir::db::ModuleTreeQuery; fn fn_scopes() for hir::db::FnScopesQuery; - fn file_items() for hir::db::SourceFileItemsQuery; + fn file_items() for hir::db::FileItemsQuery; fn file_item() for hir::db::FileItemQuery; fn input_module_items() for hir::db::InputModuleItemsQuery; fn item_map() for hir::db::ItemMapQuery; diff --git a/crates/ra_ide_api/src/imp.rs b/crates/ra_ide_api/src/imp.rs index 61771ed40..28e497965 100644 --- a/crates/ra_ide_api/src/imp.rs +++ b/crates/ra_ide_api/src/imp.rs @@ -1,11 +1,12 @@ use std::sync::Arc; -use salsa::Database; - use hir::{ self, Problem, source_binder, }; -use ra_db::{FilesDatabase, SourceRoot, SourceRootId, SyntaxDatabase}; +use ra_db::{ + FilesDatabase, SourceRoot, SourceRootId, SyntaxDatabase, + salsa::{self, Database}, +}; use ra_ide_api_light::{self, assists, LocalEdit, Severity}; use ra_syntax::{ TextRange, AstNode, SourceFile, @@ -89,7 +90,7 @@ impl db::RootDatabase { fn gc_syntax_trees(&mut self) { self.query(ra_db::SourceFileQuery) .sweep(salsa::SweepStrategy::default().discard_values()); - self.query(hir::db::SourceFileItemsQuery) + self.query(hir::db::FileItemsQuery) .sweep(salsa::SweepStrategy::default().discard_values()); self.query(hir::db::FileItemQuery) .sweep(salsa::SweepStrategy::default().discard_values()); diff --git a/crates/ra_ide_api/src/lib.rs b/crates/ra_ide_api/src/lib.rs index 3a0d2dbbe..7b47d7b6d 100644 --- a/crates/ra_ide_api/src/lib.rs +++ b/crates/ra_ide_api/src/lib.rs @@ -28,11 +28,13 @@ use std::{fmt, sync::Arc}; use ra_syntax::{SourceFile, TreeArc, TextRange, TextUnit}; use ra_text_edit::TextEdit; -use ra_db::{SyntaxDatabase, FilesDatabase, BaseDatabase}; +use ra_db::{ + SyntaxDatabase, FilesDatabase, BaseDatabase, + salsa::{self, ParallelDatabase}, +}; use rayon::prelude::*; use relative_path::RelativePathBuf; use rustc_hash::FxHashMap; -use salsa::ParallelDatabase; use crate::{ symbol_index::{FileSymbol, SymbolIndex}, diff --git a/crates/ra_ide_api/src/symbol_index.rs b/crates/ra_ide_api/src/symbol_index.rs index 74165d68f..bfa2f3469 100644 --- a/crates/ra_ide_api/src/symbol_index.rs +++ b/crates/ra_ide_api/src/symbol_index.rs @@ -32,8 +32,10 @@ use ra_syntax::{ SyntaxKind::{self, *}, ast::{self, NameOwner}, }; -use ra_db::{SourceRootId, FilesDatabase, LocalSyntaxPtr}; -use salsa::ParallelDatabase; +use ra_db::{ + SourceRootId, FilesDatabase, LocalSyntaxPtr, + salsa::{self, ParallelDatabase}, +}; use rayon::prelude::*; use crate::{ @@ -41,16 +43,11 @@ use crate::{ db::RootDatabase, }; -salsa::query_group! { - pub(crate) trait SymbolsDatabase: hir::db::HirDatabase { - fn file_symbols(file_id: FileId) -> Arc { - type FileSymbolsQuery; - } - fn library_symbols(id: SourceRootId) -> Arc { - type LibrarySymbolsQuery; - storage input; - } - } +#[salsa::query_group] +pub(crate) trait SymbolsDatabase: hir::db::HirDatabase { + fn file_symbols(&self, file_id: FileId) -> Arc; + #[salsa::input] + fn library_symbols(&self, id: SourceRootId) -> Arc; } fn file_symbols(db: &impl SymbolsDatabase, file_id: FileId) -> Arc { -- cgit v1.2.3