@@ -86,14 +86,11 @@ struct QueryModifiers {
8686 desc: (Option<Ident>, Punctuated<Expr, Token![,]>),
8787
8888 /// Use this type for the in-memory cache.
89- storage : Option<Type >,
89+ arena_cache : Option<Ident >,
9090
9191 /// Cache the query to disk if the `Block` returns true.
9292 cache: Option<(Option<Pat>, Block)>,
9393
94- /// Custom code to load the query from disk.
95- load_cached: Option<(Ident, Ident, Block)>,
96-
9794 /// A cycle error for this query aborting the compilation with a fatal error.
9895 fatal_cycle: Option<Ident>,
9996
@@ -120,8 +117,7 @@ struct QueryModifiers {
120117}
121118
122119fn parse_query_modifiers(input: ParseStream<'_>) -> Result<QueryModifiers> {
123- let mut load_cached = None;
124- let mut storage = None;
120+ let mut arena_cache = None;
125121 let mut cache = None;
126122 let mut desc = None;
127123 let mut fatal_cycle = None;
@@ -173,21 +169,8 @@ fn parse_query_modifiers(input: ParseStream<'_>) -> Result<QueryModifiers> {
173169 };
174170 let block = input.parse()?;
175171 try_insert!(cache = (args, block));
176- } else if modifier == "load_cached" {
177- // Parse a load_cached modifier like:
178- // `load_cached(tcx, id) { tcx.on_disk_cache.try_load_query_result(tcx, id) }`
179- let args;
180- parenthesized!(args in input);
181- let tcx = args.parse()?;
182- args.parse::<Token![,]>()?;
183- let id = args.parse()?;
184- let block = input.parse()?;
185- try_insert!(load_cached = (tcx, id, block));
186- } else if modifier == "storage" {
187- let args;
188- parenthesized!(args in input);
189- let ty = args.parse()?;
190- try_insert!(storage = ty);
172+ } else if modifier == "arena_cache" {
173+ try_insert!(arena_cache = modifier);
191174 } else if modifier == "fatal_cycle" {
192175 try_insert!(fatal_cycle = modifier);
193176 } else if modifier == "cycle_delay_bug" {
@@ -212,8 +195,7 @@ fn parse_query_modifiers(input: ParseStream<'_>) -> Result<QueryModifiers> {
212195 return Err(input.error("no description provided"));
213196 };
214197 Ok(QueryModifiers {
215- load_cached,
216- storage,
198+ arena_cache,
217199 cache,
218200 desc,
219201 fatal_cycle,
@@ -262,20 +244,6 @@ fn add_query_description_impl(query: &Query, impls: &mut proc_macro2::TokenStrea
262244
263245 // Find out if we should cache the query on disk
264246 let cache = if let Some((args, expr)) = modifiers.cache.as_ref() {
265- let try_load_from_disk = if let Some((tcx, id, block)) = modifiers.load_cached.as_ref() {
266- // Use custom code to load the query from disk
267- quote! {
268- const TRY_LOAD_FROM_DISK: Option<fn(QueryCtxt<'tcx>, SerializedDepNodeIndex) -> Option<Self::Value>>
269- = Some(|#tcx, #id| { #block });
270- }
271- } else {
272- // Use the default code to load the query from disk
273- quote! {
274- const TRY_LOAD_FROM_DISK: Option<fn(QueryCtxt<'tcx>, SerializedDepNodeIndex) -> Option<Self::Value>>
275- = Some(|tcx, id| tcx.on_disk_cache().as_ref()?.try_load_query_result(*tcx, id));
276- }
277- };
278-
279247 let tcx = args.as_ref().map(|t| quote! { #t }).unwrap_or_else(|| quote! { _ });
280248 // expr is a `Block`, meaning that `{ #expr }` gets expanded
281249 // to `{ { stmts... } }`, which triggers the `unused_braces` lint.
@@ -285,20 +253,13 @@ fn add_query_description_impl(query: &Query, impls: &mut proc_macro2::TokenStrea
285253 fn cache_on_disk(#tcx: TyCtxt<'tcx>, #key: &Self::Key) -> bool {
286254 #expr
287255 }
288-
289- #try_load_from_disk
290256 }
291257 } else {
292- if modifiers.load_cached.is_some() {
293- panic!("load_cached modifier on query `{}` without a cache modifier", name);
294- }
295258 quote! {
296259 #[inline]
297260 fn cache_on_disk(_: TyCtxt<'tcx>, _: &Self::Key) -> bool {
298261 false
299262 }
300-
301- const TRY_LOAD_FROM_DISK: Option<fn(QueryCtxt<'tcx>, SerializedDepNodeIndex) -> Option<Self::Value>> = None;
302263 }
303264 };
304265
@@ -347,42 +308,28 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream {
347308
348309 let mut attributes = Vec::new();
349310
350- // Pass on the fatal_cycle modifier
351- if let Some(fatal_cycle) = &modifiers.fatal_cycle {
352- attributes.push(quote! { (#fatal_cycle) });
353- };
354- // Pass on the storage modifier
355- if let Some(ref ty) = modifiers.storage {
356- let span = ty.span();
357- attributes.push(quote_spanned! {span=> (storage #ty) });
358- };
359- // Pass on the cycle_delay_bug modifier
360- if let Some(cycle_delay_bug) = &modifiers.cycle_delay_bug {
361- attributes.push(quote! { (#cycle_delay_bug) });
362- };
363- // Pass on the no_hash modifier
364- if let Some(no_hash) = &modifiers.no_hash {
365- attributes.push(quote! { (#no_hash) });
366- };
367- // Pass on the anon modifier
368- if let Some(anon) = &modifiers.anon {
369- attributes.push(quote! { (#anon) });
370- };
371- // Pass on the eval_always modifier
372- if let Some(eval_always) = &modifiers.eval_always {
373- attributes.push(quote! { (#eval_always) });
374- };
375- // Pass on the depth_limit modifier
376- if let Some(depth_limit) = &modifiers.depth_limit {
377- attributes.push(quote! { (#depth_limit) });
378- };
379- // Pass on the separate_provide_extern modifier
380- if let Some(separate_provide_extern) = &modifiers.separate_provide_extern {
381- attributes.push(quote! { (#separate_provide_extern) });
311+ macro_rules! passthrough {
312+ ( $( $modifier:ident ),+ $(,)? ) => {
313+ $( if let Some($modifier) = &modifiers.$modifier {
314+ attributes.push(quote! { (#$modifier) });
315+ }; )+
316+ }
382317 }
383- // Pass on the remap_env_constness modifier
384- if let Some(remap_env_constness) = &modifiers.remap_env_constness {
385- attributes.push(quote! { (#remap_env_constness) });
318+
319+ passthrough!(
320+ fatal_cycle,
321+ arena_cache,
322+ cycle_delay_bug,
323+ no_hash,
324+ anon,
325+ eval_always,
326+ depth_limit,
327+ separate_provide_extern,
328+ remap_env_constness,
329+ );
330+
331+ if modifiers.cache.is_some() {
332+ attributes.push(quote! { (cache) });
386333 }
387334
388335 // This uses the span of the query definition for the commas,
0 commit comments