Skip to content

Commit 9711ecc

Browse files
committed
fix array destructuring not preserving evaluation order with side effects (#1405)
1 parent 5176fcd commit 9711ecc

2 files changed

Lines changed: 11 additions & 2 deletions

File tree

src/transformation/visitors/variable-declaration.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { createCallableTable, isFunctionTypeWithProperties } from "./function";
1212
import { transformIdentifier } from "./identifier";
1313
import { isMultiReturnCall } from "./language-extensions/multi";
1414
import { transformPropertyName } from "./literal";
15-
import { moveToPrecedingTemp } from "./expression-list";
15+
import { moveToPrecedingTemp, transformExpressionList } from "./expression-list";
1616

1717
export function transformArrayBindingElement(
1818
context: TransformationContext,
@@ -205,7 +205,7 @@ export function transformBindingVariableDeclaration(
205205
// Don't unpack array literals
206206
const values =
207207
initializer.elements.length > 0
208-
? initializer.elements.map(e => context.transformExpression(e))
208+
? transformExpressionList(context, initializer.elements)
209209
: lua.createNilLiteral();
210210
statements.push(...createLocalOrExportedOrGlobalDeclaration(context, vars, values, initializer));
211211
} else {

test/unit/destructuring.spec.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,15 @@ describe("array destructuring optimization", () => {
226226
.expectToMatchJsResult();
227227
});
228228

229+
test("array literal with side effects in elements", () => {
230+
util.testFunction`
231+
const arr = [1, 2];
232+
let i = 0;
233+
let [v1, v2] = [arr[i], arr[++i]];
234+
return { v1, v2 };
235+
`.expectToMatchJsResult();
236+
});
237+
229238
test("array union", () => {
230239
util.testFunction`
231240
const array: [string] | [] = ["bar"];

0 commit comments

Comments
 (0)