diff --git a/crates/swc/tests/fixture/issues-8xxx/8397/input/.swcrc b/crates/swc/tests/fixture/issues-8xxx/8397/input/.swcrc new file mode 100644 index 000000000000..a111cb48df43 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8397/input/.swcrc @@ -0,0 +1,21 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": false + }, + "loose": false, + "minify": { + "compress": false, + "mangle": false + } + }, + "module": { + "type": "es6" + }, + "minify": false, + "isModule": true, + "env": { + "targets": "Chrome >= 46" + } +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-8xxx/8397/input/index.js b/crates/swc/tests/fixture/issues-8xxx/8397/input/index.js new file mode 100644 index 000000000000..e3073c689342 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8397/input/index.js @@ -0,0 +1,9 @@ +function f() { + const a = [1, 2, 3]; + const b = [...a, 4, 5]; +} + +async function af() { + const a = [1, 2, 3]; + const b = [...a, 4, 5]; +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-8xxx/8397/output/index.js b/crates/swc/tests/fixture/issues-8xxx/8397/output/index.js new file mode 100644 index 000000000000..bed327552524 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8397/output/index.js @@ -0,0 +1,38 @@ +import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator"; +import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator"; +function f() { + var a = [ + 1, + 2, + 3 + ]; + var b = [ + ...a, + 4, + 5 + ]; +} +function af() { + return _af.apply(this, arguments); +} +function _af() { + _af = _async_to_generator(function() { + var a, b; + return _ts_generator(this, function(_state) { + a = [ + 1, + 2, + 3 + ]; + b = [ + ...a, + 4, + 5 + ]; + return [ + 2 + ]; + }); + }); + return _af.apply(this, arguments); +} diff --git a/crates/swc_ecma_compat_es2015/src/generator.rs b/crates/swc_ecma_compat_es2015/src/generator.rs index 8220a8e44e02..aee00f36933e 100644 --- a/crates/swc_ecma_compat_es2015/src/generator.rs +++ b/crates/swc_ecma_compat_es2015/src/generator.rs @@ -1098,7 +1098,7 @@ impl Generator { ); } - let mut expressions = elements + let expressions = elements .iter_mut() .skip(num_initial_elements) .map(|v| v.take()) @@ -1114,11 +1114,7 @@ impl Generator { spread: None, expr: Box::new(Expr::Array(ArrayLit { span: DUMMY_SP, - elems: expressions - .take() - .into_iter() - .map(|expr| Some(ExprOrSpread { spread: None, expr })) - .collect(), + elems: expressions, })), }], type_args: Default::default(), @@ -1130,12 +1126,7 @@ impl Generator { .take() .into_iter() .map(Some) - .chain( - expressions - .take() - .into_iter() - .map(|expr| Some(ExprOrSpread { spread: None, expr })), - ) + .chain(expressions) .collect(), }) } @@ -1143,11 +1134,11 @@ impl Generator { fn reduce_element( &mut self, - mut expressions: Vec>, + mut expressions: Vec>, mut element: Option, leading_element: &mut Option, temp: &mut Option, - ) -> Vec> { + ) -> Vec> { if contains_yield(&element) && !expressions.is_empty() { let has_assigned_temp = temp.is_some(); if temp.is_none() { @@ -1166,11 +1157,7 @@ impl Generator { .as_callee(), args: vec![Box::new(Expr::Array(ArrayLit { span: DUMMY_SP, - elems: expressions - .take() - .into_iter() - .map(|expr| Some(ExprOrSpread { spread: None, expr })) - .collect(), + elems: expressions.take(), })) .as_arg()], type_args: Default::default(), @@ -1183,12 +1170,7 @@ impl Generator { .take() .into_iter() .map(Some) - .chain( - expressions - .take() - .into_iter() - .map(|expr| Some(ExprOrSpread { spread: None, expr })), - ) + .chain(expressions.take()) .collect(), } .into(), @@ -1200,7 +1182,9 @@ impl Generator { } element.visit_mut_with(self); - expressions.extend(element.map(|v| v.expr)); + if element.is_some() { + expressions.push(element); + } expressions }