]> git.lizzy.rs Git - rust.git/blob - crates/ra_hir/src/db.rs
b8bd82f0c97b3057869a13a9ad81b78a49392102
[rust.git] / crates / ra_hir / src / db.rs
1 use std::sync::Arc;
2
3 use ra_syntax::{SyntaxNode, TreeArc, SourceFile};
4 use ra_db::{SourceDatabase, salsa};
5
6 use crate::{
7     MacroCallId, HirFileId,
8     SourceFileItems, SourceItemId, Crate, Module, HirInterner,
9     Function, FnSignature, ExprScopes,
10     Struct, Enum, StructField,
11     macros::MacroExpansion,
12     module_tree::ModuleTree,
13     nameres::{ItemMap, lower::{LoweredModule, ImportSourceMap}},
14     ty::{InferenceResult, Ty, method_resolution::CrateImplBlocks, TypableDef},
15     adt::{StructData, EnumData},
16     impl_block::{ModuleImplBlocks, ImplSourceMap},
17     generics::{GenericParams, GenericDef},
18     ids::SourceFileItemId, nameres::Namespace, type_ref::TypeRef, code_model_api::Type
19 };
20
21 #[salsa::query_group(PersistentHirDatabaseStorage)]
22 pub trait PersistentHirDatabase: SourceDatabase + AsRef<HirInterner> {
23     #[salsa::invoke(HirFileId::hir_parse)]
24     fn hir_parse(&self, file_id: HirFileId) -> TreeArc<SourceFile>;
25
26     #[salsa::invoke(crate::macros::expand_macro_invocation)]
27     fn expand_macro_invocation(&self, invoc: MacroCallId) -> Option<Arc<MacroExpansion>>;
28
29     #[salsa::invoke(crate::adt::StructData::struct_data_query)]
30     fn struct_data(&self, s: Struct) -> Arc<StructData>;
31
32     #[salsa::invoke(crate::adt::EnumData::enum_data_query)]
33     fn enum_data(&self, e: Enum) -> Arc<EnumData>;
34
35     #[salsa::invoke(crate::ids::SourceFileItems::file_items_query)]
36     fn file_items(&self, file_id: HirFileId) -> Arc<SourceFileItems>;
37
38     #[salsa::invoke(crate::ids::SourceFileItems::file_item_query)]
39     fn file_item(&self, source_item_id: SourceItemId) -> TreeArc<SyntaxNode>;
40
41     #[salsa::invoke(crate::module_tree::Submodule::submodules_query)]
42     fn submodules(
43         &self,
44         file_id: HirFileId,
45         delc_id: Option<SourceFileItemId>,
46     ) -> Arc<Vec<crate::module_tree::Submodule>>;
47
48     #[salsa::invoke(crate::nameres::lower::LoweredModule::lower_module_query)]
49     fn lower_module(&self, module: Module) -> (Arc<LoweredModule>, Arc<ImportSourceMap>);
50
51     #[salsa::invoke(crate::nameres::lower::LoweredModule::lower_module_module_query)]
52     fn lower_module_module(&self, module: Module) -> Arc<LoweredModule>;
53
54     #[salsa::invoke(crate::nameres::lower::LoweredModule::lower_module_source_map_query)]
55     fn lower_module_source_map(&self, module: Module) -> Arc<ImportSourceMap>;
56
57     #[salsa::invoke(crate::nameres::ItemMap::item_map_query)]
58     fn item_map(&self, krate: Crate) -> Arc<ItemMap>;
59
60     #[salsa::invoke(crate::module_tree::ModuleTree::module_tree_query)]
61     fn module_tree(&self, krate: Crate) -> Arc<ModuleTree>;
62
63     #[salsa::invoke(crate::impl_block::impls_in_module)]
64     fn impls_in_module(&self, module: Module) -> Arc<ModuleImplBlocks>;
65
66     #[salsa::invoke(crate::impl_block::impls_in_module_source_map_query)]
67     fn impls_in_module_source_map(&self, module: Module) -> Arc<ImplSourceMap>;
68
69     #[salsa::invoke(crate::impl_block::impls_in_module_with_source_map_query)]
70     fn impls_in_module_with_source_map(
71         &self,
72         module: Module,
73     ) -> (Arc<ModuleImplBlocks>, Arc<ImplSourceMap>);
74
75     #[salsa::invoke(crate::generics::GenericParams::generic_params_query)]
76     fn generic_params(&self, def: GenericDef) -> Arc<GenericParams>;
77
78     #[salsa::invoke(crate::FnSignature::fn_signature_query)]
79     fn fn_signature(&self, func: Function) -> Arc<FnSignature>;
80
81     #[salsa::invoke(crate::type_alias::type_alias_ref_query)]
82     fn type_alias_ref(&self, typ: Type) -> Arc<TypeRef>;
83 }
84
85 #[salsa::query_group(HirDatabaseStorage)]
86 pub trait HirDatabase: PersistentHirDatabase {
87     #[salsa::invoke(ExprScopes::expr_scopes_query)]
88     fn expr_scopes(&self, func: Function) -> Arc<ExprScopes>;
89
90     #[salsa::invoke(crate::ty::infer)]
91     fn infer(&self, func: Function) -> Arc<InferenceResult>;
92
93     #[salsa::invoke(crate::ty::type_for_def)]
94     fn type_for_def(&self, def: TypableDef, ns: Namespace) -> Ty;
95
96     #[salsa::invoke(crate::ty::type_for_field)]
97     fn type_for_field(&self, field: StructField) -> Ty;
98
99     #[salsa::invoke(crate::expr::body_hir)]
100     fn body_hir(&self, func: Function) -> Arc<crate::expr::Body>;
101
102     #[salsa::invoke(crate::expr::body_syntax_mapping)]
103     fn body_syntax_mapping(&self, func: Function) -> Arc<crate::expr::BodySyntaxMapping>;
104
105     #[salsa::invoke(crate::ty::method_resolution::CrateImplBlocks::impls_in_crate_query)]
106     fn impls_in_crate(&self, krate: Crate) -> Arc<CrateImplBlocks>;
107 }
108
109 #[test]
110 fn hir_database_is_object_safe() {
111     fn _assert_object_safe(_: &dyn HirDatabase) {}
112 }