}
}
-#[macro_export]
-macro_rules! BraceStructLiftImpl {
- (impl<$($p:tt),*> Lift<$tcx:tt> for $s:path {
- type Lifted = $lifted:ty;
- $($field:ident),* $(,)?
- } $(where $($wc:tt)*)*) => {
- impl<$($p),*> $crate::ty::Lift<$tcx> for $s
- $(where $($wc)*)*
- {
- type Lifted = $lifted;
-
- fn lift_to_tcx(&self, tcx: TyCtxt<$tcx>) -> Option<$lifted> {
- $(let $field = tcx.lift(&self.$field)?;)*
- Some(Self::Lifted { $($field),* })
- }
- }
- };
-}
-
-#[macro_export]
-macro_rules! EnumLiftImpl {
- (impl<$($p:tt),*> Lift<$tcx:tt> for $s:path {
- type Lifted = $lifted:ty;
- $($variants:tt)*
- } $(where $($wc:tt)*)*) => {
- impl<$($p),*> $crate::ty::Lift<$tcx> for $s
- $(where $($wc)*)*
- {
- type Lifted = $lifted;
-
- fn lift_to_tcx(&self, tcx: TyCtxt<$tcx>) -> Option<$lifted> {
- EnumLiftImpl!(@Variants(self, tcx) input($($variants)*) output())
- }
- }
- };
-
- (@Variants($this:expr, $tcx:expr) input() output($($output:tt)*)) => {
- match $this {
- $($output)*
- }
- };
-
- (@Variants($this:expr, $tcx:expr)
- input( ($variant:path) ( $($variant_arg:ident),* ) , $($input:tt)*)
- output( $($output:tt)*) ) => {
- EnumLiftImpl!(
- @Variants($this, $tcx)
- input($($input)*)
- output(
- $variant ( $($variant_arg),* ) => {
- Some($variant ( $($tcx.lift($variant_arg)?),* ))
- }
- $($output)*
- )
- )
- };
-
- (@Variants($this:expr, $tcx:expr)
- input( ($variant:path), $($input:tt)*)
- output( $($output:tt)*) ) => {
- EnumLiftImpl!(
- @Variants($this, $tcx)
- input($($input)*)
- output(
- $variant => { Some($variant) }
- $($output)*
- )
- )
- };
-}
-
#[macro_export]
macro_rules! EnumTypeFoldableImpl {
(impl<$($p:tt),*> TypeFoldable<$tcx:tt> for $s:path {