1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
use crate::{
class::Class,
expr::Expr,
function::Function,
ident::Ident,
pat::Pat,
typescript::{TsEnumDecl, TsInterfaceDecl, TsModuleDecl, TsTypeAliasDecl},
};
use is_macro::Is;
use string_enum::StringEnum;
use swc_common::{ast_node, Span};
#[ast_node]
#[derive(Eq, Hash, Is)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub enum Decl {
#[tag("ClassDeclaration")]
Class(ClassDecl),
#[tag("FunctionDeclaration")]
#[is(name = "fn_decl")]
Fn(FnDecl),
#[tag("VariableDeclaration")]
Var(VarDecl),
#[tag("TsInterfaceDeclaration")]
TsInterface(TsInterfaceDecl),
#[tag("TsTypeAliasDeclaration")]
TsTypeAlias(TsTypeAliasDecl),
#[tag("TsEnumDeclaration")]
TsEnum(TsEnumDecl),
#[tag("TsModuleDeclaration")]
TsModule(TsModuleDecl),
}
#[ast_node("FunctionDeclaration")]
#[derive(Eq, Hash)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct FnDecl {
#[serde(rename = "identifier")]
pub ident: Ident,
#[serde(default)]
pub declare: bool,
#[serde(flatten)]
#[span]
pub function: Function,
}
#[ast_node("ClassDeclaration")]
#[derive(Eq, Hash)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct ClassDecl {
#[serde(rename = "identifier")]
pub ident: Ident,
#[serde(default)]
pub declare: bool,
#[serde(flatten)]
#[span]
pub class: Class,
}
#[ast_node("VariableDeclaration")]
#[derive(Eq, Hash)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct VarDecl {
pub span: Span,
pub kind: VarDeclKind,
#[serde(default)]
pub declare: bool,
#[serde(rename = "declarations")]
pub decls: Vec<VarDeclarator>,
}
#[derive(StringEnum, Clone, Copy, Eq, PartialEq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub enum VarDeclKind {
Var,
Let,
Const,
}
#[ast_node("VariableDeclarator")]
#[derive(Eq, Hash)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct VarDeclarator {
pub span: Span,
#[serde(rename = "id")]
pub name: Pat,
#[serde(default)]
pub init: Option<Box<Expr>>,
#[serde(default)]
pub definite: bool,
}