Rollup merge of #89466 - Mark-Simulacrum:query-macros, r=oli-obk
Fix bug with query modifier parsing The previous macro_rules! parsers failed when an additional modifier was added with ambiguity errors. The error is pretty unclear as to what exactly the cause here is, but this change simplifies the argument parsing code such that the error is avoided. Extracted from other work, and somewhat duplicates 0358edeb5 from #85830, but this approach seems a little simpler to me. Not technically currently necessary but seems like a good cleanup.
This commit is contained in:
commit
36f173f0a9
@ -455,28 +455,28 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream {
|
||||
|
||||
// Pass on the fatal_cycle modifier
|
||||
if let Some(fatal_cycle) = &modifiers.fatal_cycle {
|
||||
attributes.push(quote! { #fatal_cycle });
|
||||
attributes.push(quote! { (#fatal_cycle) });
|
||||
};
|
||||
// Pass on the storage modifier
|
||||
if let Some(ref ty) = modifiers.storage {
|
||||
let span = ty.span();
|
||||
attributes.push(quote_spanned! {span=> storage(#ty) });
|
||||
attributes.push(quote_spanned! {span=> (storage #ty) });
|
||||
};
|
||||
// Pass on the cycle_delay_bug modifier
|
||||
if let Some(cycle_delay_bug) = &modifiers.cycle_delay_bug {
|
||||
attributes.push(quote! { #cycle_delay_bug });
|
||||
attributes.push(quote! { (#cycle_delay_bug) });
|
||||
};
|
||||
// Pass on the no_hash modifier
|
||||
if let Some(no_hash) = &modifiers.no_hash {
|
||||
attributes.push(quote! { #no_hash });
|
||||
attributes.push(quote! { (#no_hash) });
|
||||
};
|
||||
// Pass on the anon modifier
|
||||
if let Some(anon) = &modifiers.anon {
|
||||
attributes.push(quote! { #anon });
|
||||
attributes.push(quote! { (#anon) });
|
||||
};
|
||||
// Pass on the eval_always modifier
|
||||
if let Some(eval_always) = &modifiers.eval_always {
|
||||
attributes.push(quote! { #eval_always });
|
||||
attributes.push(quote! { (#eval_always) });
|
||||
};
|
||||
|
||||
// This uses the span of the query definition for the commas,
|
||||
|
@ -140,11 +140,11 @@ macro_rules! is_eval_always_attr {
|
||||
}
|
||||
|
||||
macro_rules! contains_anon_attr {
|
||||
($($attr:ident $(($($attr_args:tt)*))* ),*) => ({$(is_anon_attr!($attr) | )* false});
|
||||
($(($attr:ident $($attr_args:tt)* )),*) => ({$(is_anon_attr!($attr) | )* false});
|
||||
}
|
||||
|
||||
macro_rules! contains_eval_always_attr {
|
||||
($($attr:ident $(($($attr_args:tt)*))* ),*) => ({$(is_eval_always_attr!($attr) | )* false});
|
||||
($(($attr:ident $($attr_args:tt)* )),*) => ({$(is_eval_always_attr!($attr) | )* false});
|
||||
}
|
||||
|
||||
#[allow(non_upper_case_globals)]
|
||||
|
@ -111,11 +111,11 @@ macro_rules! query_storage {
|
||||
([][$K:ty, $V:ty]) => {
|
||||
<DefaultCacheSelector as CacheSelector<$K, $V>>::Cache
|
||||
};
|
||||
([storage($ty:ty) $($rest:tt)*][$K:ty, $V:ty]) => {
|
||||
([(storage $ty:ty) $($rest:tt)*][$K:ty, $V:ty]) => {
|
||||
<$ty as CacheSelector<$K, $V>>::Cache
|
||||
};
|
||||
([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*][$($args:tt)*]) => {
|
||||
query_storage!([$($($modifiers)*)*][$($args)*])
|
||||
([$other:tt $($modifiers:tt)*][$($args:tt)*]) => {
|
||||
query_storage!([$($modifiers)*][$($args)*])
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -253,17 +253,17 @@ macro_rules! handle_cycle_error {
|
||||
$error.emit();
|
||||
Value::from_cycle_error($tcx)
|
||||
}};
|
||||
([fatal_cycle $($rest:tt)*][$tcx:expr, $error:expr]) => {{
|
||||
([(fatal_cycle) $($rest:tt)*][$tcx:expr, $error:expr]) => {{
|
||||
$error.emit();
|
||||
$tcx.sess.abort_if_errors();
|
||||
unreachable!()
|
||||
}};
|
||||
([cycle_delay_bug $($rest:tt)*][$tcx:expr, $error:expr]) => {{
|
||||
([(cycle_delay_bug) $($rest:tt)*][$tcx:expr, $error:expr]) => {{
|
||||
$error.delay_as_bug();
|
||||
Value::from_cycle_error($tcx)
|
||||
}};
|
||||
([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*][$($args:tt)*]) => {
|
||||
handle_cycle_error!([$($($modifiers)*)*][$($args)*])
|
||||
([$other:tt $($modifiers:tt)*][$($args:tt)*]) => {
|
||||
handle_cycle_error!([$($modifiers)*][$($args)*])
|
||||
};
|
||||
}
|
||||
|
||||
@ -271,11 +271,11 @@ macro_rules! is_anon {
|
||||
([]) => {{
|
||||
false
|
||||
}};
|
||||
([anon $($rest:tt)*]) => {{
|
||||
([(anon) $($rest:tt)*]) => {{
|
||||
true
|
||||
}};
|
||||
([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*]) => {
|
||||
is_anon!([$($($modifiers)*)*])
|
||||
([$other:tt $($modifiers:tt)*]) => {
|
||||
is_anon!([$($modifiers)*])
|
||||
};
|
||||
}
|
||||
|
||||
@ -283,11 +283,11 @@ macro_rules! is_eval_always {
|
||||
([]) => {{
|
||||
false
|
||||
}};
|
||||
([eval_always $($rest:tt)*]) => {{
|
||||
([(eval_always) $($rest:tt)*]) => {{
|
||||
true
|
||||
}};
|
||||
([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*]) => {
|
||||
is_eval_always!([$($($modifiers)*)*])
|
||||
([$other:tt $($modifiers:tt)*]) => {
|
||||
is_eval_always!([$($modifiers)*])
|
||||
};
|
||||
}
|
||||
|
||||
@ -295,11 +295,11 @@ macro_rules! hash_result {
|
||||
([][$hcx:expr, $result:expr]) => {{
|
||||
dep_graph::hash_result($hcx, &$result)
|
||||
}};
|
||||
([no_hash $($rest:tt)*][$hcx:expr, $result:expr]) => {{
|
||||
([(no_hash) $($rest:tt)*][$hcx:expr, $result:expr]) => {{
|
||||
None
|
||||
}};
|
||||
([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*][$($args:tt)*]) => {
|
||||
hash_result!([$($($modifiers)*)*][$($args)*])
|
||||
([$other:tt $($modifiers:tt)*][$($args:tt)*]) => {
|
||||
hash_result!([$($modifiers)*][$($args)*])
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user