@@ -7,6 +7,7 @@ use std::{panic::RefUnwindSafe, sync};
77use base_db:: { Crate , CrateBuilderId , CratesIdMap , Env , ProcMacroLoadingError } ;
88use intern:: Symbol ;
99use rustc_hash:: FxHashMap ;
10+ use salsa:: { Durability , Setter } ;
1011use span:: Span ;
1112use triomphe:: Arc ;
1213
@@ -83,14 +84,24 @@ impl ProcMacrosBuilder {
8384 ) ;
8485 }
8586
86- pub ( crate ) fn build ( self , crates_id_map : & CratesIdMap ) -> ProcMacros {
87+ /// Builds [`ProcMacros`] and adds id to `db` with the provided `durability`.
88+ pub ( crate ) fn build_in (
89+ self ,
90+ db : & mut dyn ExpandDatabase ,
91+ durability : Durability ,
92+ crates_id_map : & CratesIdMap ,
93+ ) {
8794 let mut map = self
8895 . 0
8996 . into_iter ( )
9097 . map ( |( krate, proc_macro) | ( crates_id_map[ & krate] , proc_macro) )
9198 . collect :: < FxHashMap < _ , _ > > ( ) ;
9299 map. shrink_to_fit ( ) ;
93- ProcMacros ( map)
100+ ProcMacros :: try_get ( db)
101+ . unwrap_or_else ( || ProcMacros :: new ( db, Default :: default ( ) ) )
102+ . set_by_crate ( db)
103+ . with_durability ( durability)
104+ . to ( map) ;
94105 }
95106}
96107
@@ -107,11 +118,19 @@ impl FromIterator<(CrateBuilderId, ProcMacroLoadResult)> for ProcMacrosBuilder {
107118#[ derive( Debug , PartialEq , Eq ) ]
108119pub struct CrateProcMacros ( StoredProcMacroLoadResult ) ;
109120
110- #[ derive( Default , Debug ) ]
111- pub struct ProcMacros ( FxHashMap < Crate , Arc < CrateProcMacros > > ) ;
121+ #[ salsa:: input( singleton, debug) ]
122+ pub struct ProcMacros {
123+ #[ returns( ref) ]
124+ pub by_crate : FxHashMap < Crate , Arc < CrateProcMacros > > ,
125+ }
126+
112127impl ProcMacros {
113- fn get ( & self , krate : Crate ) -> Option < Arc < CrateProcMacros > > {
114- self . 0 . get ( & krate) . cloned ( )
128+ pub fn init_default ( db : & dyn ExpandDatabase , durability : Durability ) {
129+ _ = Self :: builder ( Default :: default ( ) ) . durability ( durability) . new ( db) ;
130+ }
131+
132+ fn get_for_crate ( & self , db : & dyn ExpandDatabase , krate : Crate ) -> Option < Arc < CrateProcMacros > > {
133+ self . by_crate ( db) . get ( & krate) . cloned ( )
115134 }
116135}
117136
@@ -352,5 +371,5 @@ pub(crate) fn proc_macros_for_crate(
352371 db : & dyn ExpandDatabase ,
353372 krate : Crate ,
354373) -> Option < Arc < CrateProcMacros > > {
355- db . proc_macros ( ) . get ( krate)
374+ ProcMacros :: get ( db ) . get_for_crate ( db , krate)
356375}
0 commit comments