Skip to content

Instantly share code, notes, and snippets.

@Kixiron
Created July 11, 2020 22:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Kixiron/c4c5f18f8160693791fa7f54c9221e4c to your computer and use it in GitHub Desktop.
Save Kixiron/c4c5f18f8160693791fa7f54c9221e4c to your computer and use it in GitHub Desktop.
macro_rules! compile_expr {
($(
if #[$meta:meta] {
$( $stmt:tt )*
} $(else if #[$else_if_meta:meta] {
$( $else_if_stmt:tt )*
})* $(else {
$( $else_stmt:tt )*
})?
)+) => {
$(
#[cfg($meta)]
{
$( $stmt )*
}
compile_expr! {
@inner
( $meta, )
$(else if #[$else_if_meta] {
$( $else_if_stmt )*
})* $(else {
$( $else_stmt )*
})?
}
)+
};
(@recurse ($( $prev_metas:tt)* ) ($new_meta:meta) $( $rem:tt )*) => {
compile_expr! {
@inner
($( $prev_metas )* $new_meta,)
$( $rem )*
}
};
(@inner
$prev_metas:tt
else if #[$meta:meta] {
$( $else_if_stmt:tt )*
}
$( $rem:tt )*
) => {
#[cfg(all(not(any $prev_metas), $meta))]
{
$( $else_if_stmt )*
}
compile_expr! {
@recurse $prev_metas ($meta) $( $rem )*
}
};
(@inner $prev_metas:tt
else {
$( $else_stmt:tt )*
}
) => {
#[cfg(not(any $prev_metas))]
{
$( $else_stmt )*
}
};
(@inner ($($prev_metas:tt)*)) => {};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment