swc_ecma_quote_macros/
builder.rs

1use proc_macro2::Span;
2use syn::{punctuated::Punctuated, Expr, ExprStruct, FieldValue, Ident, Member, Token};
3
4pub(crate) struct Builder {
5    type_name: syn::Ident,
6    fields: Punctuated<FieldValue, Token![,]>,
7}
8
9impl Builder {
10    pub fn new(ident: &str) -> Self {
11        Self {
12            type_name: Ident::new(ident, Span::call_site()),
13            fields: Default::default(),
14        }
15    }
16
17    pub fn add(&mut self, name: &str, value: Expr) {
18        self.fields.push(FieldValue {
19            attrs: Default::default(),
20            member: Member::Named(Ident::new(name, Span::call_site())),
21            colon_token: Some(Default::default()),
22            expr: value,
23        });
24    }
25
26    pub fn build(self) -> ExprStruct {
27        let type_name = self.type_name;
28
29        ExprStruct {
30            attrs: Default::default(),
31            brace_token: Default::default(),
32            path: syn::parse_quote!(swc_core::ecma::ast::#type_name),
33            fields: self.fields,
34            dot2_token: Default::default(),
35            rest: Default::default(),
36            qself: None,
37        }
38    }
39}