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.rs46
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)
-}