swc_estree_ast/
decl.rs

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}