ast_node/
ast_node_macro.rs

1use swc_macros_common::prelude::*;
2use syn::{
3    parse::{Parse, ParseStream},
4    *,
5};
6
7#[derive(Clone)]
8pub struct Args {
9    pub ty: Literal,
10}
11
12impl Parse for Args {
13    fn parse(i: ParseStream<'_>) -> syn::Result<Self> {
14        Ok(Args { ty: i.parse()? })
15    }
16}
17
18pub fn expand_struct(args: Args, i: DeriveInput) -> Vec<ItemImpl> {
19    let mut items = Vec::new();
20    let generics = i.generics.clone();
21    // let item_ident = Ident::new("Item", i.ident.span());
22
23    {
24        let ty = &i.ident;
25        let type_str = &args.ty;
26        let item: ItemImpl = parse_quote!(
27            impl ::swc_common::AstNode for #ty {
28                const TYPE: &'static str = #type_str;
29            }
30        );
31        items.push(item.with_generics(generics));
32    }
33
34    // let ident = i.ident.clone();
35    // let cloned = i.clone();
36
37    // items.push({
38    //     let (fields, item_data) = match i.data {
39    //         Data::Struct(DataStruct {
40    //             struct_token,
41    //             semi_token,
42    //             fields: Fields::Named(FieldsNamed { brace_token, named }),
43    //         }) => {
44    //             let fields: Punctuated<_, token::Comma> = named
45    //                 .clone()
46    //                 .into_iter()
47    //                 .map(|field| FieldValue {
48    //                     member: Member::Named(field.ident.clone().unwrap()),
49    //                     expr: Quote::new_call_site()
50    //                         .quote_with(smart_quote!(
51    //                             Vars {
52    //                                 field: &field.ident
53    //                             },
54    //                             { node.node.field }
55    //                         ))
56    //                         .parse(),
57
58    //                     attrs: field
59    //                         .attrs
60    //                         .into_iter()
61    //                         .filter(|attr| is_attr_name(attr, "cfg"))
62    //                         .collect(),
63    //                     colon_token: Some(call_site()),
64    //                 })
65    //                 .collect();
66
67    //             let item_data = Data::Struct(DataStruct {
68    //                 struct_token,
69    //                 semi_token,
70    //                 fields: Fields::Named(FieldsNamed {
71    //                     brace_token,
72    //                     named: named
73    //                         .into_pairs()
74    //                         .map(|pair| {
75    //                             let handle = |v: Field| Field {
76    //                                 vis: Visibility::Inherited,
77    //                                 attrs: v
78    //                                     .attrs
79    //                                     .into_iter()
80    //                                     .filter(|attr| {
81    //                                         is_attr_name(attr, "serde") ||
82    // is_attr_name(attr, "cfg")                                     })
83    //                                     .collect(),
84    //                                 ..v
85    //                             };
86
87    //                             match pair {
88    //                                 Pair::End(v) => Pair::End(handle(v)),
89    //                                 Pair::Punctuated(v, p) =>
90    // Pair::Punctuated(handle(v), p),                             }
91    //                         })
92    //                         .collect(),
93    //                 }),
94    //             });
95
96    //             (fields, item_data)
97    //         }
98    //         _ => unreachable!("enum / tuple struct / union with
99    // #[ast_node(\"Foo\")]"),     };
100
101    //     let convert_item_to_self =
102    // Quote::new_call_site().quote_with(smart_quote!(         Vars {
103    //             fields,
104    //             Type: &ident
105    //         },
106    //         { Type { fields } }
107    //     ));
108
109    //     let body = Quote::new_call_site().quote_with(smart_quote!(
110    //         Vars {
111    //             convert_item_to_self
112    //         },
113    //         {
114    //             let node =
115    // ::swc_common::serializer::Node::<Item>::deserialize(deserializer)?;
116
117    //             if node.ty != <Self as ::swc_common::AstNode>::TYPE {
118    //                 return Err(D::Error::unknown_variant(
119    //                     &node.ty,
120    //                     &[<Self as ::swc_common::AstNode>::TYPE],
121    //                 ));
122    //             }
123
124    //             Ok(convert_item_to_self)
125    //         }
126    //     ));
127
128    //     let item = DeriveInput {
129    //         vis: Visibility::Inherited,
130    //         ident: item_ident,
131    //         attrs: Vec::new(),
132    //         data: item_data,
133    //         ..cloned
134    //     };
135    //     Quote::new_call_site()
136    //         .quote_with(smart_quote!(
137    //             Vars {
138    //                 // A new item which implements Deserialize
139    //                 item,
140    //                 Type: ident,
141    //                 body
142    //             },
143    //             {
144    //                 impl<'de> ::serde::Deserialize<'de> for Type {
145    //                     fn deserialize<D>(deserializer: D) -> Result<Self,
146    // D::Error>                     where
147    //                         D: ::serde::Deserializer<'de>,
148    //                     {
149    //                         use ::serde::de::Error;
150    //                         #[derive(::serde::Deserialize)]
151    //                         #[serde(rename_all = "camelCase")]
152    //                         ite
153    //                         body
154    //                     }
155    //                 }
156    //             }
157    //         ))
158    //         .parse::<ItemImpl>()
159    //         .with_generics(generics)
160    // });
161
162    items
163}