diff options
Diffstat (limited to 'crates/ra_hir/src/db.rs')
-rw-r--r-- | crates/ra_hir/src/db.rs | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs index 8af0a3176..8aaf0375a 100644 --- a/crates/ra_hir/src/db.rs +++ b/crates/ra_hir/src/db.rs | |||
@@ -1,4 +1,4 @@ | |||
1 | use std::sync::Arc; | 1 | use std::sync::{Arc, Mutex}; |
2 | 2 | ||
3 | use ra_syntax::{SyntaxNode, TreeArc, SourceFile, SmolStr, ast}; | 3 | use ra_syntax::{SyntaxNode, TreeArc, SourceFile, SmolStr, ast}; |
4 | use ra_db::{SourceDatabase, salsa}; | 4 | use ra_db::{SourceDatabase, salsa}; |
@@ -8,16 +8,16 @@ use crate::{ | |||
8 | Function, FnSignature, ExprScopes, TypeAlias, | 8 | Function, FnSignature, ExprScopes, TypeAlias, |
9 | Struct, Enum, StructField, | 9 | Struct, Enum, StructField, |
10 | Const, ConstSignature, Static, | 10 | Const, ConstSignature, Static, |
11 | DefWithBody, | 11 | DefWithBody, Trait, |
12 | ids, | ||
12 | nameres::{Namespace, ImportSourceMap, RawItems, CrateDefMap}, | 13 | nameres::{Namespace, ImportSourceMap, RawItems, CrateDefMap}, |
13 | ty::{InferenceResult, Ty, method_resolution::CrateImplBlocks, TypableDef, CallableDef, FnSig}, | 14 | ty::{InferenceResult, Ty, method_resolution::CrateImplBlocks, TypableDef, CallableDef, FnSig, TypeCtor}, |
14 | adt::{StructData, EnumData}, | 15 | adt::{StructData, EnumData}, |
15 | impl_block::{ModuleImplBlocks, ImplSourceMap}, | 16 | impl_block::{ModuleImplBlocks, ImplSourceMap, ImplBlock}, |
16 | generics::{GenericParams, GenericDef}, | 17 | generics::{GenericParams, GenericDef}, |
17 | type_ref::TypeRef, | 18 | type_ref::TypeRef, |
18 | traits::TraitData, Trait, ty::TraitRef, | 19 | traits::TraitData, |
19 | lang_item::{LangItems, LangItemTarget}, | 20 | lang_item::{LangItems, LangItemTarget}, |
20 | ids | ||
21 | }; | 21 | }; |
22 | 22 | ||
23 | #[salsa::query_group(DefDatabaseStorage)] | 23 | #[salsa::query_group(DefDatabaseStorage)] |
@@ -39,10 +39,22 @@ pub trait DefDatabase: SourceDatabase { | |||
39 | #[salsa::interned] | 39 | #[salsa::interned] |
40 | fn intern_type_alias(&self, loc: ids::ItemLoc<ast::TypeAliasDef>) -> ids::TypeAliasId; | 40 | fn intern_type_alias(&self, loc: ids::ItemLoc<ast::TypeAliasDef>) -> ids::TypeAliasId; |
41 | 41 | ||
42 | // Interned IDs for Chalk integration | ||
43 | #[salsa::interned] | ||
44 | fn intern_type_ctor(&self, type_ctor: TypeCtor) -> ids::TypeCtorId; | ||
45 | #[salsa::interned] | ||
46 | fn intern_impl_block(&self, impl_block: ImplBlock) -> ids::GlobalImplId; | ||
47 | |||
42 | #[salsa::invoke(crate::ids::macro_def_query)] | 48 | #[salsa::invoke(crate::ids::macro_def_query)] |
43 | fn macro_def(&self, macro_id: MacroDefId) -> Option<Arc<mbe::MacroRules>>; | 49 | fn macro_def(&self, macro_id: MacroDefId) -> Option<Arc<mbe::MacroRules>>; |
44 | 50 | ||
45 | #[salsa::invoke(HirFileId::hir_parse_query)] | 51 | #[salsa::invoke(crate::ids::macro_arg_query)] |
52 | fn macro_arg(&self, macro_call: ids::MacroCallId) -> Option<Arc<tt::Subtree>>; | ||
53 | |||
54 | #[salsa::invoke(crate::ids::macro_expand_query)] | ||
55 | fn macro_expand(&self, macro_call: ids::MacroCallId) -> Result<Arc<tt::Subtree>, String>; | ||
56 | |||
57 | #[salsa::invoke(crate::ids::HirFileId::hir_parse_query)] | ||
46 | fn hir_parse(&self, file_id: HirFileId) -> TreeArc<SourceFile>; | 58 | fn hir_parse(&self, file_id: HirFileId) -> TreeArc<SourceFile>; |
47 | 59 | ||
48 | #[salsa::invoke(crate::adt::StructData::struct_data_query)] | 60 | #[salsa::invoke(crate::adt::StructData::struct_data_query)] |
@@ -138,8 +150,17 @@ pub trait HirDatabase: DefDatabase { | |||
138 | #[salsa::invoke(crate::ty::method_resolution::CrateImplBlocks::impls_in_crate_query)] | 150 | #[salsa::invoke(crate::ty::method_resolution::CrateImplBlocks::impls_in_crate_query)] |
139 | fn impls_in_crate(&self, krate: Crate) -> Arc<CrateImplBlocks>; | 151 | fn impls_in_crate(&self, krate: Crate) -> Arc<CrateImplBlocks>; |
140 | 152 | ||
141 | #[salsa::invoke(crate::ty::traits::implements)] | 153 | #[salsa::invoke(crate::ty::traits::impls_for_trait)] |
142 | fn implements(&self, trait_ref: TraitRef) -> Option<crate::ty::traits::Solution>; | 154 | fn impls_for_trait(&self, krate: Crate, trait_: Trait) -> Arc<[ImplBlock]>; |
155 | |||
156 | /// This provides the Chalk trait solver instance. Because Chalk always | ||
157 | /// works from a specific crate, this query is keyed on the crate; and | ||
158 | /// because Chalk does its own internal caching, the solver is wrapped in a | ||
159 | /// Mutex and the query is marked volatile, to make sure the cached state is | ||
160 | /// thrown away when input facts change. | ||
161 | #[salsa::invoke(crate::ty::traits::solver)] | ||
162 | #[salsa::volatile] | ||
163 | fn solver(&self, krate: Crate) -> Arc<Mutex<crate::ty::traits::Solver>>; | ||
143 | } | 164 | } |
144 | 165 | ||
145 | #[test] | 166 | #[test] |