mod buffer;
pub use self::buffer::{Location, Quote};
#[macro_export]
#[doc(hidden)]
macro_rules! quoter_location {
() => {{
$crate::spanned_quote::Location {
line: line!(),
col: column!(),
file_name: file!(),
}
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! handle_vars_for_quote {
(
@NORMALIZED {
$(
$name:ident: $value:expr,
)*
},
) => {
$crate::declare_vars_for_quote!(
$($name: $value,)*
);
};
(
@NORMALIZED {
$($norm:tt)*
},
$name:ident,
$($rest:tt)*
) => {
$crate::handle_vars_for_quote!(
@NORMALIZED {
$($norm)*
$name: $name,
},
$($rest)*
)
};
(
@NORMALIZED {
$($norm:tt)*
},
$name:ident
) => {
$crate::handle_vars_for_quote!(
@NORMALIZED {
$($norm)*
$name: $name,
},
)
};
(
@NORMALIZED {
$($norm:tt)*
},
$name:ident: $value:expr,
$($rest:tt)*
) => {
$crate::handle_vars_for_quote!(
@NORMALIZED {
$($norm)*
$name: $value,
},
$($rest)*
)
};
(
@NORMALIZED {
$($norm:tt)*
},
$name:ident: $value:expr
) => {
$crate::handle_vars_for_quote!(
@NORMALIZED {
$($norm)*
$name: $value,
},
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! declare_vars_for_quote {
(
$(
$name:ident: $val:expr,
)*
) => {
$(
#[allow(non_snake_case)]
let $name = $val;
)*
macro_rules! __sq_push_token_custom {
$(
($tokens:expr, $name) => {
$tokens.push_tokens(&$name);
};
)*
($tokens:expr, $t:tt) => {
$tokens.push_parsed(stringify!($t));
};
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __sq_quote_tokens_to {
($tokens:expr,) => {{}};
($tokens:expr, ( $($inner:tt)* ) $($rest:tt)*) => {{
$tokens.push_group(::proc_macro2::Delimiter::Parenthesis, $crate::__sq_quote_closure! {
$($inner)*
});
$crate::__sq_quote_tokens_to!($tokens, $($rest)*);
}};
($tokens:expr, { $($inner:tt)* } $($rest:tt)*) => {{
$tokens.push_group(::proc_macro2::Delimiter::Brace, $crate::__sq_quote_closure! {
$($inner)*
});
$crate::__sq_quote_tokens_to!($tokens, $($rest)*);
}};
($tokens:expr, [ $($inner:tt)* ] $($rest:tt)*) => {{
$tokens.push_group(::proc_macro2::Delimiter::Bracket, $crate::__sq_quote_closure! {
$($inner)*
});
$crate::__sq_quote_tokens_to!($tokens, $($rest)*);
}};
($tokens:expr, $first:tt $($rest:tt)*) => {
__sq_push_token_custom!($tokens, $first);
$crate::__sq_quote_tokens_to!($tokens, $($rest)*);
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __sq_quote_closure {
( $($tokens:tt)* ) => {{
|_tokens: &mut $crate::Quote| {
_tokens.report_loc($crate::quoter_location!());
$crate::__sq_quote_tokens_to!(_tokens, $($tokens)*);
}
}};
}
#[macro_export]
macro_rules! smart_quote {
(
Vars{ $($vars:tt)* },
{
$(
$tokens:tt
)*
}
) => {{
|_tokens: &mut $crate::Quote| {
$crate::handle_vars_for_quote!(@NORMALIZED{}, $($vars)*);
_tokens.report_loc($crate::quoter_location!());
$crate::__sq_quote_tokens_to!(_tokens, $($tokens)*);
}
}};
(
Vars{ $($vars:tt)* },
(
$(
$tokens:tt
)*
)
) => {{
|_tokens: &mut $crate::Quote| {
$crate::handle_vars_for_quote!(@NORMALIZED{}, $($vars)*);
_tokens.report_loc($crate::quoter_location!());
$crate::__sq_quote_tokens_to!(_tokens, $($tokens)*);
}
}};
}