1use serde::{Deserialize, Serialize};
2use swc_common::ast_serde;
3
4use crate::{
5 class::ClassDeclaration,
6 common::{BaseNode, Identifier, LVal, Param, TypeAnnotOrNoop, TypeParamDeclOrNoop},
7 expr::{Expression, FunctionExpression},
8 flow::{
9 DeclareClass, DeclareExportAllDeclaration, DeclareExportDeclaration, DeclareFunction,
10 DeclareInterface, DeclareModule, DeclareModuleExports, DeclareOpaqueType, DeclareTypeAlias,
11 DeclareVariable, InterfaceDeclaration, OpaqueType, TypeAlias,
12 },
13 lit::{BooleanLiteral, NumericLiteral, StringLiteral},
14 module::{
15 ExportAllDeclaration, ExportDefaultDeclaration, ExportNamedDeclaration, ImportDeclaration,
16 },
17 stmt::BlockStatement,
18 typescript::{
19 TSDeclareFunction, TSEnumDeclaration, TSInterfaceDeclaration, TSModuleDeclaration,
20 TSTypeAliasDeclaration,
21 },
22};
23
24#[derive(Debug, Clone, PartialEq)]
25#[ast_serde]
26pub enum Declaration {
27 #[tag("FunctionDeclaration")]
28 FuncDecl(FunctionDeclaration),
29 #[tag("VariableDeclaration")]
30 VarDecl(VariableDeclaration),
31 #[tag("UsingDeclaration")]
32 UsingDecl(UsingDeclaration),
33 #[tag("ClassDeclaration")]
34 ClassDecl(ClassDeclaration),
35 #[tag("ExportAllDeclaration")]
36 ExportAllDecl(ExportAllDeclaration),
37 #[tag("ExportDefaultDeclaration")]
38 ExportDefaultDecl(ExportDefaultDeclaration),
39 #[tag("ExportNamedDeclaration")]
40 ExportNamedDecl(ExportNamedDeclaration),
41 #[tag("ImportDeclaration")]
42 ImportDecl(ImportDeclaration),
43 #[tag("DeclareClass")]
44 DeclClass(DeclareClass),
45 #[tag("DeclareFunction")]
46 DeclFunc(DeclareFunction),
47 #[tag("DeclareInterface")]
48 DeclInterface(DeclareInterface),
49 #[tag("DeclareModule")]
50 DeclModule(DeclareModule),
51 #[tag("DeclareModuleExports")]
52 DeclModuleExports(DeclareModuleExports),
53 #[tag("DeclareTypeAlias")]
54 DeclTypeAlias(DeclareTypeAlias),
55 #[tag("DeclareOpaqueType")]
56 DeclOpaqueType(DeclareOpaqueType),
57 #[tag("DeclareVariable")]
58 DeclVar(DeclareVariable),
59 #[tag("DeclareExportDeclaration")]
60 DeclExportDecl(DeclareExportDeclaration),
61 #[tag("DeclareExportAllDeclaration")]
62 DeclExportAllDecl(DeclareExportAllDeclaration),
63 #[tag("InterfaceDeclaration")]
64 InterfaceDecl(InterfaceDeclaration),
65 #[tag("OpaqueType")]
66 OpaqueType(OpaqueType),
67 #[tag("TypeAlias")]
68 TypeAlias(TypeAlias),
69 #[tag("EnumDeclaration")]
70 EnumDecl(EnumDeclaration),
71 #[tag("TSDeclareFunction")]
72 TSDeclFunc(TSDeclareFunction),
73 #[tag("TSInterfaceDeclaration")]
74 TSInterfaceDecl(TSInterfaceDeclaration),
75 #[tag("TSTypeAliasDeclaration")]
76 TSTypeAliasDecl(TSTypeAliasDeclaration),
77 #[tag("TSEnumDeclaration")]
78 TSEnumDecl(TSEnumDeclaration),
79 #[tag("TSModuleDeclaration")]
80 TSModuleDecl(TSModuleDeclaration),
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
84#[serde(rename_all = "lowercase")]
85pub enum VariableDeclarationKind {
86 Var,
87 Let,
88 Const,
89}
90
91#[derive(Debug, Clone, PartialEq)]
92#[ast_serde("VariableDeclarator")]
93pub struct VariableDeclarator {
94 #[serde(flatten)]
95 pub base: BaseNode,
96 pub id: LVal,
97 #[serde(default)]
98 pub init: Option<Box<Expression>>,
99 #[serde(
100 default,
101 skip_serializing_if = "crate::flavor::Flavor::skip_none_and_false"
102 )]
103 pub definite: Option<bool>,
104}
105
106#[derive(Debug, Clone, PartialEq)]
107#[ast_serde("VariableDeclaration")]
108pub struct VariableDeclaration {
109 #[serde(flatten)]
110 pub base: BaseNode,
111 pub kind: VariableDeclarationKind,
112 #[serde(default)]
113 pub declarations: Vec<VariableDeclarator>,
114 #[serde(
115 default,
116 skip_serializing_if = "crate::flavor::Flavor::skip_none_and_false"
117 )]
118 pub declare: Option<bool>,
119}
120
121#[derive(Debug, Clone, PartialEq)]
122#[ast_serde("FunctionDeclaration")]
123pub struct FunctionDeclaration {
124 #[serde(flatten)]
125 pub base: BaseNode,
126 #[serde(default)]
127 pub id: Option<Identifier>,
128 #[serde(default)]
129 pub params: Vec<Param>,
130 pub body: BlockStatement,
131 #[serde(default)]
132 pub generator: Option<bool>,
133 #[serde(default, rename = "async")]
134 pub is_async: Option<bool>,
135 #[serde(default, skip_serializing_if = "crate::ser::skip_expression_for_fn")]
136 pub expression: bool,
137 #[serde(default, skip_serializing_if = "crate::flavor::Flavor::skip_none")]
138 pub return_type: Option<Box<TypeAnnotOrNoop>>,
139 #[serde(default, skip_serializing_if = "crate::flavor::Flavor::skip_none")]
140 pub type_parameters: Option<TypeParamDeclOrNoop>,
141}
142
143impl From<FunctionExpression> for FunctionDeclaration {
144 fn from(expr: FunctionExpression) -> Self {
145 FunctionDeclaration {
146 base: expr.base,
147 id: expr.id,
148 params: expr.params,
149 body: expr.body,
150 generator: expr.generator,
151 is_async: expr.is_async,
152 expression: false,
153 return_type: expr.return_type,
154 type_parameters: expr.type_parameters,
155 }
156 }
157}
158
159#[derive(Debug, Clone, PartialEq)]
160#[ast_serde("EnumBooleanMember")]
161pub struct EnumBooleanMember {
162 #[serde(flatten)]
163 pub base: BaseNode,
164 pub id: Identifier,
165 pub init: BooleanLiteral,
166}
167
168#[derive(Debug, Clone, PartialEq)]
169#[ast_serde("EnumNumberMember")]
170pub struct EnumNumberMember {
171 #[serde(flatten)]
172 pub base: BaseNode,
173 pub id: Identifier,
174 pub init: NumericLiteral,
175}
176
177#[derive(Debug, Clone, PartialEq)]
178#[ast_serde("EnumStringMember")]
179pub struct EnumStringMember {
180 #[serde(flatten)]
181 pub base: BaseNode,
182 pub id: Identifier,
183 pub init: StringLiteral,
184}
185
186#[derive(Debug, Clone, PartialEq)]
187#[ast_serde]
188pub enum EnumStringBodyMember {
189 #[tag("EnumStringBodyMember")]
190 String(EnumStringMember),
191 #[tag("EnumDefaultedMember")]
192 Defaulted(EnumDefaultedMember),
193}
194
195#[derive(Debug, Clone, PartialEq)]
196#[ast_serde("EnumDefaultedMember")]
197pub struct EnumDefaultedMember {
198 #[serde(flatten)]
199 pub base: BaseNode,
200 pub id: Identifier,
201}
202
203#[derive(Debug, Clone, PartialEq)]
204#[ast_serde]
205pub enum EnumMember {
206 #[tag("EnumBooleanMember")]
207 Boolean(EnumBooleanMember),
208 #[tag("EnumNumberMember")]
209 Number(EnumNumberMember),
210 #[tag("EnumStringMember")]
211 String(EnumStringMember),
212 #[tag("EnumDefaultedMember")]
213 Defaulted(EnumDefaultedMember),
214}
215
216#[derive(Debug, Clone, PartialEq)]
217#[ast_serde("EnumBooleanBody")]
218pub struct EnumBooleanBody {
219 #[serde(flatten)]
220 pub base: BaseNode,
221 #[serde(default)]
222 pub members: Vec<EnumBooleanMember>,
223 #[serde(default)]
224 pub explicit_type: bool,
225 #[serde(default)]
226 pub has_unknown_members: bool,
227}
228
229#[derive(Debug, Clone, PartialEq)]
230#[ast_serde("EnumNumberBody")]
231pub struct EnumNumberBody {
232 #[serde(flatten)]
233 pub base: BaseNode,
234 #[serde(default)]
235 pub members: Vec<EnumNumberMember>,
236 #[serde(default)]
237 pub explicit_type: bool,
238 #[serde(default)]
239 pub has_unknown_members: bool,
240}
241
242#[derive(Debug, Clone, PartialEq)]
243#[ast_serde("EnumStringBody")]
244pub struct EnumStringBody {
245 #[serde(flatten)]
246 pub base: BaseNode,
247 #[serde(default)]
248 pub members: Vec<EnumStringBodyMember>,
249 #[serde(default)]
250 pub explicit_type: bool,
251 #[serde(default)]
252 pub has_unknown_members: bool,
253}
254
255#[derive(Debug, Clone, PartialEq)]
256#[ast_serde("EnumSymbolBody")]
257pub struct EnumSymbolBody {
258 #[serde(flatten)]
259 pub base: BaseNode,
260 #[serde(default)]
261 pub members: Vec<EnumDefaultedMember>,
262 #[serde(default)]
263 pub has_unknown_members: bool,
264}
265
266#[derive(Debug, Clone, PartialEq)]
267#[ast_serde]
268pub enum EnumBody {
269 #[tag("EnumBooleanBody")]
270 Boolean(EnumBooleanBody),
271 #[tag("EnumNumberBody")]
272 Number(EnumNumberBody),
273 #[tag("EnumStringBody")]
274 String(EnumStringBody),
275 #[tag("EnumSymbolBody")]
276 Symbol(EnumSymbolBody),
277}
278
279#[derive(Debug, Clone, PartialEq)]
280#[ast_serde("EnumDeclaration")]
281pub struct EnumDeclaration {
282 #[serde(flatten)]
283 pub base: BaseNode,
284 pub id: Identifier,
285 pub body: EnumBody,
286}
287
288#[derive(Debug, Clone, PartialEq)]
289#[ast_serde("EnumDeclaration")]
290pub struct UsingDeclaration {
291 #[serde(flatten)]
292 pub base: BaseNode,
293
294 #[serde(default)]
295 pub declarations: Vec<VariableDeclarator>,
296}