From 8b63963f79e122eec6d47bfc5f1b007677a5eaab Mon Sep 17 00:00:00 2001 From: benStre Date: Tue, 3 Sep 2024 13:45:06 +0200 Subject: [PATCH] add support for $ methods --- src/lib.rs | 30 +++++++++++++++++++- src/visitor.rs | 34 +++++++++++++++++++++++ tests/__swc_snapshots__/src/lib.rs/t18.js | 6 ++-- tests/__swc_snapshots__/src/lib.rs/t19.js | 11 ++++++++ 4 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 tests/__swc_snapshots__/src/lib.rs/t19.js diff --git a/src/lib.rs b/src/lib.rs index 29ea020..36aea59 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -202,7 +202,35 @@ test!( array.map((item) => { return {item} }) - } + } + + "# +); + + +test!( + Syntax::Es(EsSyntax { + jsx: true, + ..Default::default() + },), + |_| TransformVisitor, + t19, + r#"
+ { + array.map((item) => { + return {item * 2} + }) + } + { + array.filter((item) => { + return {item * 2} + }) + } + { + array.normalMethod((item) => { + return {item * 2} + }) + }
"# ); diff --git a/src/visitor.rs b/src/visitor.rs index c9f107c..4e26ac3 100644 --- a/src/visitor.rs +++ b/src/visitor.rs @@ -51,6 +51,14 @@ impl Visit for VariableCollector { } } + +const DOLLAR_METHODS: [&'static str; 3] = [ + "map", + "filter", + "reduce", +]; + + pub struct TransformVisitor; impl TransformVisitor { @@ -103,6 +111,32 @@ impl TransformVisitor { // convert array.map(() => {}) to array.$.map(() => {}) // TODO + Expr::Call(c) + if c.callee.is_expr() + && c.callee.as_expr().unwrap().is_member() + // any DOLLAR_METHODS + && DOLLAR_METHODS.iter().any(|m| c.callee.as_expr().unwrap().as_member().unwrap().prop.is_ident_with(m)) => + // && (c.callee.as_expr().unwrap().as_member().unwrap().prop.is_ident_with("map")) => + { + let member = c.callee.as_expr().unwrap().as_member().unwrap(); + let obj = member.obj.clone(); + let prop = member.prop.clone(); + + Box::new(Expr::Call(CallExpr { + span: c.span, + callee: Callee::Expr(Box::new(Expr::Member(MemberExpr { + span: DUMMY_SP, + obj: obj, + prop: MemberProp::Ident(IdentName::from( + format!("$.{}", prop.as_ident().unwrap().sym).to_string() + )), + }))), + args: c.args.clone(), + type_args: Take::dummy(), + ctxt: Default::default(), + })) + } + // already has an always() or $$() wrapper Expr::Call(c) diff --git a/tests/__swc_snapshots__/src/lib.rs/t18.js b/tests/__swc_snapshots__/src/lib.rs/t18.js index 77a0dbe..a703aaa 100644 --- a/tests/__swc_snapshots__/src/lib.rs/t18.js +++ b/tests/__swc_snapshots__/src/lib.rs/t18.js @@ -1,5 +1,5 @@
- {always(()=>array.map((item)=>{ - return {item}; - }))} + {array.$.map((item)=>{ + return {item}; +})}
; diff --git a/tests/__swc_snapshots__/src/lib.rs/t19.js b/tests/__swc_snapshots__/src/lib.rs/t19.js new file mode 100644 index 0000000..0f0a283 --- /dev/null +++ b/tests/__swc_snapshots__/src/lib.rs/t19.js @@ -0,0 +1,11 @@ +
+ {array.$.map((item)=>{ + return {item * 2}; +})} + {array.$.filter((item)=>{ + return {item * 2}; +})} + {always(()=>array.normalMethod((item)=>{ + return {item * 2}; + }))} +
;