swc_estree_compat/babelify/
function.rs1use copyless::BoxHelper;
2use swc_ecma_ast::{Function, Param, ParamOrTsParamProp, Pat};
3use swc_estree_ast::{
4 ArrayPattern, AssignmentPattern, FunctionExpression, Identifier, ObjectPattern,
5 Param as BabelParam, Pattern, RestElement,
6};
7
8use crate::babelify::{Babelify, Context};
9
10impl Babelify for Function {
11 type Output = FunctionExpression;
12
13 fn babelify(self, ctx: &Context) -> Self::Output {
14 FunctionExpression {
15 base: ctx.base(self.span),
16 params: self.params.babelify(ctx),
17 body: self.body.unwrap().babelify(ctx),
18 generator: Some(self.is_generator),
19 is_async: Some(self.is_async),
20 type_parameters: self.type_params.map(|t| t.babelify(ctx).into()),
21 return_type: self
22 .return_type
23 .map(|t| Box::alloc().init(t.babelify(ctx).into())),
24 id: None,
25 }
26 }
27}
28
29impl Babelify for Param {
30 type Output = BabelParam;
31
32 fn babelify(self, ctx: &Context) -> Self::Output {
33 match self.pat {
34 Pat::Ident(i) => BabelParam::Id(Identifier {
35 base: ctx.base(self.span),
36 decorators: Some(self.decorators.babelify(ctx)),
37 ..i.babelify(ctx)
38 }),
39 Pat::Array(a) => BabelParam::Pat(Pattern::Array(ArrayPattern {
40 base: ctx.base(self.span),
41 decorators: Some(self.decorators.babelify(ctx)),
42 ..a.babelify(ctx)
43 })),
44 Pat::Rest(r) => BabelParam::Rest(RestElement {
45 base: ctx.base(self.span),
46 decorators: Some(self.decorators.babelify(ctx)),
47 ..r.babelify(ctx)
48 }),
49 Pat::Object(o) => BabelParam::Pat(Pattern::Object(ObjectPattern {
50 base: ctx.base(self.span),
51 decorators: Some(self.decorators.babelify(ctx)),
52 ..o.babelify(ctx)
53 })),
54 Pat::Assign(a) => BabelParam::Pat(Pattern::Assignment(AssignmentPattern {
55 base: ctx.base(self.span),
56 decorators: Some(self.decorators.babelify(ctx)),
57 ..a.babelify(ctx)
58 })),
59 Pat::Expr(_) => panic!(
60 "illegal conversion: Cannot convert {:?} to BabelParam",
61 &self.pat
62 ),
63 Pat::Invalid(_) => panic!(
64 "illegal conversion: Cannot convert {:?} to BabelParam",
65 &self.pat
66 ),
67 }
68 }
69}
70
71impl Babelify for ParamOrTsParamProp {
72 type Output = BabelParam;
73
74 fn babelify(self, ctx: &Context) -> Self::Output {
75 match self {
76 ParamOrTsParamProp::TsParamProp(p) => BabelParam::TSProp(p.babelify(ctx)),
77 ParamOrTsParamProp::Param(p) => p.babelify(ctx),
78 }
79 }
80}