swc_estree_compat/babelify/
function.rs

1use 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}