From 70b64df9bce2bc1648b1898d4e41ea438a149a16 Mon Sep 17 00:00:00 2001 From: hazzard993 Date: Mon, 24 Feb 2020 16:46:02 +1000 Subject: [PATCH] Resolve exported identifiers in for-in loops --- src/transformation/visitors/loops/for-in.ts | 12 ++++++++---- test/unit/modules/modules.spec.ts | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/transformation/visitors/loops/for-in.ts b/src/transformation/visitors/loops/for-in.ts index f4365ac23..8631391d0 100644 --- a/src/transformation/visitors/loops/for-in.ts +++ b/src/transformation/visitors/loops/for-in.ts @@ -4,6 +4,7 @@ import { FunctionVisitor } from "../../context"; import { ForbiddenForIn, UnsupportedForInVariable } from "../../utils/errors"; import { isArrayType } from "../../utils/typescript"; import { transformIdentifier } from "../identifier"; +import { transformAssignment } from "../binary-expression/assignments"; import { getVariableDeclarationBinding, transformLoopBody } from "./utils"; export const transformForInStatement: FunctionVisitor = (statement, context) => { @@ -33,11 +34,14 @@ export const transformForInStatement: FunctionVisitor = (stat // Iteration variable becomes ____key iterationVariable = lua.createIdentifier("____key"); // Push variable = ____key to the start of the loop body to match TS scoping - const initializer = lua.createAssignmentStatement( - transformIdentifier(context, statement.initializer), - iterationVariable + const assignment = transformAssignment( + context, + statement.initializer, + iterationVariable, + statement.initializer ); - body.statements.unshift(initializer); + + body.statements.unshift(...assignment); } else { // This should never occur throw UnsupportedForInVariable(statement.initializer); diff --git a/test/unit/modules/modules.spec.ts b/test/unit/modules/modules.spec.ts index 6b5a86068..141c2d6e2 100644 --- a/test/unit/modules/modules.spec.ts +++ b/test/unit/modules/modules.spec.ts @@ -253,3 +253,22 @@ test("export as specifier shouldn't effect local vars", () => { a = 6; `.expectToMatchJsResult(); }); + +test("export modified in for in loop", () => { + util.testModule` + export let foo = ''; + for (foo in { x: true }) {} + ` + .setReturnExport("x") + .expectToMatchJsResult(); +}); + +test("export dependency modified in for in loop", () => { + util.testModule` + let foo = ''; + export { foo as bar }; + for (foo in { x: true }) {} + ` + .setReturnExport("bar") + .expectToEqual("x"); +});