Remove recursion from define_{provider|map}_struct
This commit is contained in:
parent
2160bab0da
commit
fcb8bc9d4e
@ -468,8 +468,7 @@ macro_rules! define_maps {
|
|||||||
|
|
||||||
define_provider_struct! {
|
define_provider_struct! {
|
||||||
tcx: $tcx,
|
tcx: $tcx,
|
||||||
input: ($(([$($modifiers)*] [$name] [$K] [$V]))*),
|
input: ($(([$($modifiers)*] [$name] [$K] [$V]))*)
|
||||||
output: ()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<$tcx> Copy for Providers<$tcx> {}
|
impl<$tcx> Copy for Providers<$tcx> {}
|
||||||
@ -480,78 +479,19 @@ macro_rules! define_maps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! define_map_struct {
|
macro_rules! define_map_struct {
|
||||||
// Initial state
|
|
||||||
(tcx: $tcx:tt,
|
(tcx: $tcx:tt,
|
||||||
input: $input:tt) => {
|
input: ($(([$(modifiers:tt)*] [$($attr:tt)*] [$name:ident]))*)) => {
|
||||||
define_map_struct! {
|
|
||||||
tcx: $tcx,
|
|
||||||
input: $input,
|
|
||||||
output: ()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Final output
|
|
||||||
(tcx: $tcx:tt,
|
|
||||||
input: (),
|
|
||||||
output: ($($output:tt)*)) => {
|
|
||||||
pub struct Maps<$tcx> {
|
pub struct Maps<$tcx> {
|
||||||
providers: IndexVec<CrateNum, Providers<$tcx>>,
|
providers: IndexVec<CrateNum, Providers<$tcx>>,
|
||||||
query_stack: RefCell<Vec<(Span, Query<$tcx>)>>,
|
query_stack: RefCell<Vec<(Span, Query<$tcx>)>>,
|
||||||
$($output)*
|
$($(#[$attr])* $name: RefCell<QueryMap<queries::$name<$tcx>>>,)*
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Field recognized and ready to shift into the output
|
|
||||||
(tcx: $tcx:tt,
|
|
||||||
ready: ([$($pub:tt)*] [$($attr:tt)*] [$name:ident]),
|
|
||||||
input: $input:tt,
|
|
||||||
output: ($($output:tt)*)) => {
|
|
||||||
define_map_struct! {
|
|
||||||
tcx: $tcx,
|
|
||||||
input: $input,
|
|
||||||
output: ($($output)*
|
|
||||||
$(#[$attr])* $($pub)* $name: RefCell<QueryMap<queries::$name<$tcx>>>,)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// No modifiers left? This is a private item.
|
|
||||||
(tcx: $tcx:tt,
|
|
||||||
input: (([] $attrs:tt $name:tt) $($input:tt)*),
|
|
||||||
output: $output:tt) => {
|
|
||||||
define_map_struct! {
|
|
||||||
tcx: $tcx,
|
|
||||||
ready: ([] $attrs $name),
|
|
||||||
input: ($($input)*),
|
|
||||||
output: $output
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Skip other modifiers
|
|
||||||
(tcx: $tcx:tt,
|
|
||||||
input: (([$other_modifier:tt $($modifiers:tt)*] $($fields:tt)*) $($input:tt)*),
|
|
||||||
output: $output:tt) => {
|
|
||||||
define_map_struct! {
|
|
||||||
tcx: $tcx,
|
|
||||||
input: (([$($modifiers)*] $($fields)*) $($input)*),
|
|
||||||
output: $output
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! define_provider_struct {
|
macro_rules! define_provider_struct {
|
||||||
// Initial state:
|
|
||||||
(tcx: $tcx:tt, input: $input:tt) => {
|
|
||||||
define_provider_struct! {
|
|
||||||
tcx: $tcx,
|
|
||||||
input: $input,
|
|
||||||
output: ()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Final state:
|
|
||||||
(tcx: $tcx:tt,
|
(tcx: $tcx:tt,
|
||||||
input: (),
|
input: ($(([$($modifiers:tt)*] [$name:ident] [$K:ty] [$R:ty]))*)) => {
|
||||||
output: ($(([$name:ident] [$K:ty] [$R:ty]))*)) => {
|
|
||||||
pub struct Providers<$tcx> {
|
pub struct Providers<$tcx> {
|
||||||
$(pub $name: for<'a> fn(TyCtxt<'a, $tcx, $tcx>, $K) -> $R,)*
|
$(pub $name: for<'a> fn(TyCtxt<'a, $tcx, $tcx>, $K) -> $R,)*
|
||||||
}
|
}
|
||||||
@ -566,41 +506,6 @@ macro_rules! define_provider_struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Something ready to shift:
|
|
||||||
(tcx: $tcx:tt,
|
|
||||||
ready: ($name:tt $K:tt $V:tt),
|
|
||||||
input: $input:tt,
|
|
||||||
output: ($($output:tt)*)) => {
|
|
||||||
define_provider_struct! {
|
|
||||||
tcx: $tcx,
|
|
||||||
input: $input,
|
|
||||||
output: ($($output)* ($name $K $V))
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Regular queries produce a `V` only.
|
|
||||||
(tcx: $tcx:tt,
|
|
||||||
input: (([] $name:tt $K:tt $V:tt) $($input:tt)*),
|
|
||||||
output: $output:tt) => {
|
|
||||||
define_provider_struct! {
|
|
||||||
tcx: $tcx,
|
|
||||||
ready: ($name $K $V),
|
|
||||||
input: ($($input)*),
|
|
||||||
output: $output
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Skip modifiers.
|
|
||||||
(tcx: $tcx:tt,
|
|
||||||
input: (([$other_modifier:tt $($modifiers:tt)*] $($fields:tt)*) $($input:tt)*),
|
|
||||||
output: $output:tt) => {
|
|
||||||
define_provider_struct! {
|
|
||||||
tcx: $tcx,
|
|
||||||
input: (([$($modifiers)*] $($fields)*) $($input)*),
|
|
||||||
output: $output
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user