@@ -2,7 +2,7 @@ use std::mem;
2
2
3
3
use serde:: Deserialize ;
4
4
use 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 } ;
6
6
use swc_ecma_ast:: * ;
7
7
use swc_ecma_transforms_base:: { ext:: ExprRefExt , helper, perf:: Check } ;
8
8
use swc_ecma_transforms_macros:: fast_path;
@@ -14,9 +14,11 @@ use swc_ecma_visit::{
14
14
} ;
15
15
use swc_trace_macro:: swc_trace;
16
16
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) ;
18
19
visit_mut_pass ( Spread {
19
20
c,
21
+ unresolved_ctxt,
20
22
vars : Default :: default ( ) ,
21
23
} )
22
24
}
@@ -28,9 +30,9 @@ pub struct Config {
28
30
}
29
31
30
32
/// es2015 - `SpreadElement`
31
- #[ derive( Default ) ]
32
33
struct Spread {
33
34
c : Config ,
35
+ unresolved_ctxt : SyntaxContext ,
34
36
vars : Vec < VarDeclarator > ,
35
37
}
36
38
@@ -271,7 +273,7 @@ impl Spread {
271
273
for arg in args. flatten ( ) {
272
274
let expr = arg. expr ;
273
275
match arg. spread {
274
- Some ( _ ) => {
276
+ Some ( span ) => {
275
277
if !current_elems. is_empty ( ) {
276
278
arg_list. push (
277
279
ArrayLit {
@@ -282,6 +284,27 @@ impl Spread {
282
284
) ;
283
285
current_elems = Vec :: new ( ) ;
284
286
}
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
+ } ;
285
308
arg_list. push ( expr. as_arg ( ) ) ;
286
309
}
287
310
None => {
0 commit comments