Skip to content

Commit

Permalink
fix(es/compat): Preserve spread in the generator pass (#8401)
Browse files Browse the repository at this point in the history
**Related issue:**
 - Closes #8397
  • Loading branch information
magic-akari committed Dec 8, 2023
1 parent 0bde652 commit 29bec98
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 26 deletions.
21 changes: 21 additions & 0 deletions 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"
}
}
9 changes: 9 additions & 0 deletions 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];
}
38 changes: 38 additions & 0 deletions 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);
}
36 changes: 10 additions & 26 deletions crates/swc_ecma_compat_es2015/src/generator.rs
Expand Up @@ -1098,7 +1098,7 @@ impl Generator {
);
}

let mut expressions = elements
let expressions = elements
.iter_mut()
.skip(num_initial_elements)
.map(|v| v.take())
Expand All @@ -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(),
Expand All @@ -1130,24 +1126,19 @@ impl Generator {
.take()
.into_iter()
.map(Some)
.chain(
expressions
.take()
.into_iter()
.map(|expr| Some(ExprOrSpread { spread: None, expr })),
)
.chain(expressions)
.collect(),
})
}
}

fn reduce_element(
&mut self,
mut expressions: Vec<Box<Expr>>,
mut expressions: Vec<Option<ExprOrSpread>>,
mut element: Option<ExprOrSpread>,
leading_element: &mut Option<ExprOrSpread>,
temp: &mut Option<Ident>,
) -> Vec<Box<Expr>> {
) -> Vec<Option<ExprOrSpread>> {
if contains_yield(&element) && !expressions.is_empty() {
let has_assigned_temp = temp.is_some();
if temp.is_none() {
Expand All @@ -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(),
Expand All @@ -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(),
Expand All @@ -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
}

Expand Down

0 comments on commit 29bec98

Please sign in to comment.