syn_solidity/
utils.rs

1use crate::Expr;
2use proc_macro2::{TokenStream, TokenTree};
3use std::fmt;
4use syn::{parse::ParseStream, punctuated::Punctuated, Result, Token};
5
6/// Helper trait to parsing nested expressions.
7pub(crate) trait ParseNested: Sized {
8    /// Parse `Self` as an expression that starts with `expr`.
9    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}