1use crate::Expr;
2use proc_macro2::{TokenStream, TokenTree};
3use std::fmt;
4use syn::{parse::ParseStream, punctuated::Punctuated, Result, Token};
5
6pub(crate) trait ParseNested: Sized {
8 fn parse_nested(expr: Box<Expr>, input: ParseStream<'_>) -> Result<Self>;
10}
11
12#[repr(transparent)]
13pub(crate) struct DebugPunctuated<T, P>(Punctuated<T, P>);
14
15impl<T, P> DebugPunctuated<T, P> {
16 #[inline(always)]
17 pub(crate) fn new(punctuated: &Punctuated<T, P>) -> &Self {
18 unsafe { &*(punctuated as *const Punctuated<T, P> as *const Self) }
19 }
20}
21
22impl<T: fmt::Debug, P> fmt::Debug for DebugPunctuated<T, P> {
23 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24 f.debug_list().entries(self.0.iter()).finish()
25 }
26}
27
28pub(crate) fn tts_until_semi(input: ParseStream<'_>) -> TokenStream {
29 let mut tts = TokenStream::new();
30 while !input.is_empty() && !input.peek(Token![;]) {
31 let tt = input.parse::<TokenTree>().unwrap();
32 tts.extend(std::iter::once(tt));
33 }
34 tts
35}