macro_rules! unexpected {
($parser:expr_2021, $found:expr_2021, $expected:expr_2021 $(, @$span:expr_2021)? $(, $($t:tt)* )?) => {{
let __found: $crate::syn::token::Token = $found;
match __found.kind{
$crate::syn::token::TokenKind::Invalid => {
return Err($parser.lexer.error.take().unwrap());
}
$crate::syn::token::TokenKind::Eof => {
let error = $crate::syn::error::syntax_error!("Unexpected end of file, expected {}",$expected, @__found.span $( $($t)* )?);
return Err(error)
}
x => {
$crate::syn::error::bail!("Unexpected token `{}`, expected {}",x,$expected, @__found.span$( $($t)* )?)
}
}
}};
}
macro_rules! expected {
($parser:expr_2021, $($kind:tt)*) => {{
let token: crate::syn::token::Token = $parser.next();
if let $($kind)* = token.kind{
token
}else{
$crate::syn::parser::unexpected!($parser,token, $($kind)*)
}
}};
}
macro_rules! expected_whitespace {
($parser:expr_2021, $($kind:tt)*) => {{
if let Some(token) = $parser.next_whitespace() {
if let $($kind)* = token.kind{
token
}else{
$crate::syn::parser::unexpected!($parser,token, $($kind)*)
}
}else{
$crate::syn::error::bail!("Unexpected whitespace",@$parser.last_span() => "No whitespace allowed after this token")
}
}};
}
macro_rules! enter_object_recursion {
($name:ident = $this:expr_2021 => { $($t:tt)* }) => {{
if $this.settings.object_recursion_limit == 0 {
return Err($crate::syn::parser::SyntaxError::new("Exceeded object recursion depth limit")
.with_span($this.last_span(), $crate::syn::error::MessageKind::Error))
}
struct Dropper<'a, 'b>(&'a mut $crate::syn::parser::Parser<'b>);
impl Drop for Dropper<'_, '_> {
fn drop(&mut self) {
self.0.settings.object_recursion_limit += 1;
}
}
impl<'a> ::std::ops::Deref for Dropper<'_,'a>{
type Target = $crate::syn::parser::Parser<'a>;
fn deref(&self) -> &Self::Target{
self.0
}
}
impl<'a> ::std::ops::DerefMut for Dropper<'_,'a>{
fn deref_mut(&mut self) -> &mut Self::Target{
self.0
}
}
$this.settings.object_recursion_limit -= 1;
let mut $name = Dropper($this);
{
$($t)*
}
}};
}
macro_rules! enter_query_recursion {
($name:ident = $this:expr_2021 => { $($t:tt)* }) => {{
if $this.settings.query_recursion_limit == 0 {
return Err($crate::syn::parser::SyntaxError::new("Exceeded query recursion depth limit")
.with_span($this.last_span(), $crate::syn::error::MessageKind::Error))
}
struct Dropper<'a, 'b>(&'a mut $crate::syn::parser::Parser<'b>);
impl Drop for Dropper<'_, '_> {
fn drop(&mut self) {
self.0.settings.query_recursion_limit += 1;
}
}
impl<'a> ::std::ops::Deref for Dropper<'_,'a>{
type Target = $crate::syn::parser::Parser<'a>;
fn deref(&self) -> &Self::Target{
self.0
}
}
impl<'a> ::std::ops::DerefMut for Dropper<'_,'a>{
fn deref_mut(&mut self) -> &mut Self::Target{
self.0
}
}
$this.settings.query_recursion_limit -= 1;
let mut $name = Dropper($this);
{
$($t)*
}
}};
}
pub(crate) use enter_object_recursion;
pub(crate) use enter_query_recursion;
pub(crate) use expected;
pub(crate) use expected_whitespace;
pub(crate) use unexpected;