swc_ecma_quote_macros/
input.rs1use 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 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}