swc_ecma_quote_macros/
input.rs

1use syn::{
2    parse::{Parse, ParseStream},
3    punctuated::Punctuated,
4    Token,
5};
6
7pub(super) struct QuoteInput {
8    pub src: syn::LitStr,
9    #[allow(unused)]
10    pub as_token: Token![as],
11    pub output_type: syn::Type,
12
13    pub vars: Option<(Token![,], Punctuated<QuoteVar, Token![,]>)>,
14}
15
16pub(super) struct QuoteVar {
17    pub name: syn::Ident,
18    /// Defaults to `swc_ecma_ast::Ident`
19    pub ty: Option<syn::Type>,
20
21    #[allow(unused)]
22    pub eq_token: Token![=],
23    pub value: syn::Expr,
24}
25
26impl Parse for QuoteInput {
27    fn parse(input: ParseStream) -> syn::Result<Self> {
28        let src = input.parse()?;
29        let as_token = input.parse()?;
30        let output_type = input.parse()?;
31        let vars = if input.is_empty() {
32            None
33        } else {
34            let comma_token = input.parse()?;
35            let vars = Punctuated::parse_terminated(input)?;
36            Some((comma_token, vars))
37        };
38
39        Ok(Self {
40            src,
41            as_token,
42            output_type,
43            vars,
44        })
45    }
46}
47
48impl Parse for QuoteVar {
49    fn parse(input: ParseStream) -> syn::Result<Self> {
50        let name = input.parse()?;
51
52        let ty = if input.peek(Token![:]) {
53            let _: Token![:] = input.parse()?;
54            Some(input.parse()?)
55        } else {
56            None
57        };
58
59        Ok(Self {
60            name,
61            ty,
62            eq_token: input.parse()?,
63            value: input.parse()?,
64        })
65    }
66}