dia_core/compiler/
constructs.rs

1use swc_common::DUMMY_SP;
2use swc_ecma_ast::*;
3
4pub fn ident(name: &str) -> Ident {
5    Ident::new(name.into(), DUMMY_SP)
6}
7
8pub fn var_name(name: &str) -> PropName {
9    PropName::Ident(ident(name))
10}
11
12pub fn const_declare(ident: Ident, value: Box<Expr>) -> Decl {
13    let declaration = VarDeclarator {
14        span: DUMMY_SP,
15        name: Pat::Ident(BindingIdent {
16            id: ident,
17            type_ann: None,
18        }),
19        init: Some(value),
20        definite: false,
21    };
22    Decl::Var(Box::new(VarDecl {
23        span: DUMMY_SP,
24        kind: VarDeclKind::Const,
25        declare: false,
26        decls: vec![declaration],
27    }))
28}
29
30pub fn expr_arrow_cb(body: Box<Expr>) -> Box<Expr> {
31    Box::new(Expr::Arrow(ArrowExpr {
32        span: DUMMY_SP,
33        is_async: false,
34        is_generator: false,
35        params: vec![],
36        body: Box::new(BlockStmtOrExpr::Expr(body)),
37        type_params: None,
38        return_type: None,
39    }))
40}
41
42pub fn string(value: &str) -> Box<Expr> {
43    Box::new(Expr::Lit(Lit::Str(Str {
44        span: DUMMY_SP,
45        value: value.into(),
46        raw: None,
47    })))
48}
49
50pub fn array(exprs: Vec<Box<Expr>>) -> Box<Expr> {
51    let elems = exprs
52        .into_iter()
53        .map(|expr| Some(ExprOrSpread { spread: None, expr }))
54        .collect();
55
56    Box::new(Expr::Array(ArrayLit {
57        span: DUMMY_SP,
58        elems,
59    }))
60}
61
62pub fn object(key_value_pairs: Vec<KeyValueProp>) -> Box<Expr> {
63    let props = key_value_pairs
64        .into_iter()
65        .map(|prop| PropOrSpread::Prop(Box::new(Prop::KeyValue(prop))))
66        .collect();
67
68    Box::new(Expr::Object(ObjectLit {
69        span: DUMMY_SP,
70        props,
71    }))
72}
73
74pub fn export(decl: Decl) -> ModuleItem {
75    ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl {
76        span: DUMMY_SP,
77        decl,
78    }))
79}
80
81pub fn satisfies(expr: Box<Expr>, type_ann: Box<TsType>) -> Box<Expr> {
82    Box::new(Expr::TsSatisfies(TsSatisfiesExpr {
83        span: DUMMY_SP,
84        expr,
85        type_ann,
86    }))
87}
88
89pub fn as_const(expr: Box<Expr>) -> Box<Expr> {
90    Box::new(Expr::TsConstAssertion(TsConstAssertion {
91        span: DUMMY_SP,
92        expr,
93    }))
94}
95
96pub fn paren(expr: Box<Expr>) -> Box<Expr> {
97    Box::new(Expr::Paren(ParenExpr {
98        span: DUMMY_SP,
99        expr,
100    }))
101}
102
103pub fn ts_type_ref(name: &str) -> Box<TsType> {
104    Box::new(TsType::TsTypeRef(TsTypeRef {
105        span: DUMMY_SP,
106        type_name: TsEntityName::Ident(ident(name)),
107        type_params: None,
108    }))
109}