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}