Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-expand/src/proc_macro.rs')
| -rw-r--r-- | crates/hir-expand/src/proc_macro.rs | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/crates/hir-expand/src/proc_macro.rs b/crates/hir-expand/src/proc_macro.rs index 467eae3122..93bc5daa5b 100644 --- a/crates/hir-expand/src/proc_macro.rs +++ b/crates/hir-expand/src/proc_macro.rs @@ -7,6 +7,7 @@ use std::{panic::RefUnwindSafe, sync}; use base_db::{Crate, CrateBuilderId, CratesIdMap, Env, ProcMacroLoadingError}; use intern::Symbol; use rustc_hash::FxHashMap; +use salsa::{Durability, Setter}; use span::Span; use triomphe::Arc; @@ -83,14 +84,24 @@ impl ProcMacrosBuilder { ); } - pub(crate) fn build(self, crates_id_map: &CratesIdMap) -> ProcMacros { + /// Builds [`ProcMacros`] and adds id to `db` with the provided `durability`. + pub(crate) fn build_in( + self, + db: &mut dyn ExpandDatabase, + durability: Durability, + crates_id_map: &CratesIdMap, + ) { let mut map = self .0 .into_iter() .map(|(krate, proc_macro)| (crates_id_map[&krate], proc_macro)) .collect::<FxHashMap<_, _>>(); map.shrink_to_fit(); - ProcMacros(map) + ProcMacros::try_get(db) + .unwrap_or_else(|| ProcMacros::new(db, Default::default())) + .set_by_crate(db) + .with_durability(durability) + .to(map); } } @@ -107,11 +118,25 @@ impl FromIterator<(CrateBuilderId, ProcMacroLoadResult)> for ProcMacrosBuilder { #[derive(Debug, PartialEq, Eq)] pub struct CrateProcMacros(StoredProcMacroLoadResult); -#[derive(Default, Debug)] -pub struct ProcMacros(FxHashMap<Crate, Arc<CrateProcMacros>>); +/// The proc macros. Do not use [`Self::get`]! Use [`Self::get_for_crate`] instead. +#[salsa::input(singleton, debug)] +pub struct ProcMacros { + #[returns(ref)] + pub by_crate: FxHashMap<Crate, Arc<CrateProcMacros>>, +} + impl ProcMacros { - fn get(&self, krate: Crate) -> Option<Arc<CrateProcMacros>> { - self.0.get(&krate).cloned() + pub fn init_default(db: &dyn ExpandDatabase, durability: Durability) { + _ = Self::builder(Default::default()).durability(durability).new(db); + } +} + +#[salsa::tracked] +impl ProcMacros { + /// Incrementality query to prevent queries from directly depending on [`Self::get`]. + #[salsa::tracked(returns(as_ref))] + pub fn get_for_crate(db: &dyn ExpandDatabase, krate: Crate) -> Option<Arc<CrateProcMacros>> { + Self::get(db).by_crate(db).get(&krate).cloned() } } @@ -276,7 +301,7 @@ impl CustomProcMacroExpander { ExpandError::new(call_site, ExpandErrorKind::MacroDisabled), ), id => { - let proc_macros = match db.proc_macros_for_crate(def_crate) { + let proc_macros = match ProcMacros::get_for_crate(db, def_crate) { Some(it) => it, None => { return ExpandResult::new( @@ -347,10 +372,3 @@ impl CustomProcMacroExpander { } } } - -pub(crate) fn proc_macros_for_crate( - db: &dyn ExpandDatabase, - krate: Crate, -) -> Option<Arc<CrateProcMacros>> { - db.proc_macros().get(krate) -} |