@@ -2,7 +2,7 @@ use std::mem;
22
33use serde:: Deserialize ;
44use swc_atoms:: atom;
5- use swc_common:: { util:: take:: Take , Span , Spanned , DUMMY_SP } ;
5+ use swc_common:: { util:: take:: Take , Mark , Span , Spanned , SyntaxContext , DUMMY_SP } ;
66use swc_ecma_ast:: * ;
77use swc_ecma_transforms_base:: { ext:: ExprRefExt , helper, perf:: Check } ;
88use swc_ecma_transforms_macros:: fast_path;
@@ -14,9 +14,11 @@ use swc_ecma_visit::{
1414} ;
1515use swc_trace_macro:: swc_trace;
1616
17- pub fn spread ( c : Config ) -> impl Pass {
17+ pub fn spread ( c : Config , unresolved_mark : Mark ) -> impl Pass {
18+ let unresolved_ctxt = SyntaxContext :: empty ( ) . apply_mark ( unresolved_mark) ;
1819 visit_mut_pass ( Spread {
1920 c,
21+ unresolved_ctxt,
2022 vars : Default :: default ( ) ,
2123 } )
2224}
@@ -28,9 +30,9 @@ pub struct Config {
2830}
2931
3032/// es2015 - `SpreadElement`
31- #[ derive( Default ) ]
3233struct Spread {
3334 c : Config ,
35+ unresolved_ctxt : SyntaxContext ,
3436 vars : Vec < VarDeclarator > ,
3537}
3638
@@ -271,7 +273,7 @@ impl Spread {
271273 for arg in args. flatten ( ) {
272274 let expr = arg. expr ;
273275 match arg. spread {
274- Some ( _ ) => {
276+ Some ( span ) => {
275277 if !current_elems. is_empty ( ) {
276278 arg_list. push (
277279 ArrayLit {
@@ -282,6 +284,27 @@ impl Spread {
282284 ) ;
283285 current_elems = Vec :: new ( ) ;
284286 }
287+ // Special handling for `arguments` to call Array.prototype.slice
288+ // https://github.com/babel/babel/blob/61ad8555b875cb0c0996f18f803b6bf1d2150173/packages/babel-plugin-transform-spread/src/index.ts#L43-L47
289+ let expr = match * expr {
290+ Expr :: Ident ( Ident { ref sym, ctxt, .. } )
291+ if & * * sym == "arguments" && ctxt == self . unresolved_ctxt =>
292+ {
293+ CallExpr {
294+ span,
295+ callee : member_expr ! (
296+ Default :: default ( ) ,
297+ DUMMY_SP ,
298+ Array . prototype. slice. call
299+ )
300+ . as_callee ( ) ,
301+ args : vec ! [ expr. as_arg( ) ] ,
302+ ..Default :: default ( )
303+ }
304+ . into ( )
305+ }
306+ _ => * expr,
307+ } ;
285308 arg_list. push ( expr. as_arg ( ) ) ;
286309 }
287310 None => {
0 commit comments