X Tutup
Skip to content

Commit bda4042

Browse files
committed
fix back assignment
1 parent e238cc7 commit bda4042

File tree

4 files changed

+33
-16
lines changed

4 files changed

+33
-16
lines changed

src/transformation/utils/export.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,7 @@ export function isSymbolExportedFromScope(
9898
return false;
9999
}
100100

101-
// ts.Iterator is not a ES6-compatible iterator, because TypeScript targets ES5
102-
const it: Iterable<ts.Symbol> = { [Symbol.iterator]: () => scopeSymbol!.exports!.values() };
103-
return [...it].includes(symbol);
101+
return scopeSymbol.exports.has(symbol.escapedName);
104102
}
105103

106104
export function addExportToIdentifier(

src/transformation/visitors/binary-expression/assignments.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
11
import * as ts from "typescript";
22
import * as lua from "../../../LuaAST";
3-
import { cast, castEach } from "../../../utils";
43
import { TransformationContext } from "../../context";
54
import { isTupleReturnCall } from "../../utils/annotations";
65
import { validateAssignment, validatePropertyAssignment } from "../../utils/assignment-validation";
6+
import { createExportedIdentifier, isSymbolExported } from "../../utils/export";
77
import { createImmediatelyInvokedFunctionExpression, createUnpackCall, wrapInTable } from "../../utils/lua-ast";
88
import { LuaLibFeature, transformLuaLibFunction } from "../../utils/lualib";
99
import { isArrayType, isDestructuringAssignment } from "../../utils/typescript";
1010
import { transformElementAccessArgument } from "../access";
1111
import { isArrayLength, transformDestructuringAssignment } from "./destructuring-assignments";
1212

13+
export function transformAssignmentLeftHandSideExpression(
14+
context: TransformationContext,
15+
node: ts.Expression
16+
): lua.AssignmentLeftHandSideExpression {
17+
const symbol = context.checker.getSymbolAtLocation(node);
18+
const left = context.transformExpression(node);
19+
20+
return lua.isIdentifier(left) && symbol && isSymbolExported(context, symbol)
21+
? createExportedIdentifier(context, left)
22+
: (left as lua.AssignmentLeftHandSideExpression);
23+
}
24+
1325
export function transformAssignment(
1426
context: TransformationContext,
1527
// TODO: Change type to ts.LeftHandSideExpression?
@@ -29,11 +41,7 @@ export function transformAssignment(
2941
);
3042
}
3143

32-
return lua.createAssignmentStatement(
33-
cast(context.transformExpression(lhs), lua.isAssignmentLeftHandSideExpression),
34-
right,
35-
lhs.parent
36-
);
44+
return lua.createAssignmentStatement(transformAssignmentLeftHandSideExpression(context, lhs), right, lhs.parent);
3745
}
3846

3947
export function transformAssignmentExpression(
@@ -139,10 +147,7 @@ export function transformAssignmentStatement(
139147
right = createUnpackCall(context, right, expression.right);
140148
}
141149

142-
const left = castEach(
143-
expression.left.elements.map(e => context.transformExpression(e)),
144-
lua.isAssignmentLeftHandSideExpression
145-
);
150+
const left = expression.left.elements.map(e => transformAssignmentLeftHandSideExpression(context, e));
146151

147152
return [lua.createAssignmentStatement(left, right, expression)];
148153
}

src/transformation/visitors/binary-expression/destructuring-assignments.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@ import { TransformationContext } from "../../context";
55
import { UnsupportedKind } from "../../utils/errors";
66
import { LuaLibFeature, transformLuaLibFunction } from "../../utils/lualib";
77
import { isArrayType, isAssignmentPattern } from "../../utils/typescript";
8-
import { transformIdentifier } from "../identifier";
98
import { transformPropertyName } from "../literal";
10-
import { transformAssignment, transformAssignmentStatement } from "./assignments";
9+
import {
10+
transformAssignment,
11+
transformAssignmentLeftHandSideExpression,
12+
transformAssignmentStatement,
13+
} from "./assignments";
1114

1215
export function isArrayLength(
1316
context: TransformationContext,
@@ -170,7 +173,7 @@ function transformShorthandPropertyAssignment(
170173
root: lua.Expression
171174
): lua.Statement[] {
172175
const result: lua.Statement[] = [];
173-
const assignmentVariableName = transformIdentifier(context, node.name);
176+
const assignmentVariableName = transformAssignmentLeftHandSideExpression(context, node.name);
174177
const extractionIndex = lua.createStringLiteral(node.name.text);
175178
const variableExtractionAssignmentStatement = lua.createAssignmentStatement(
176179
assignmentVariableName,

test/unit/modules/modules.spec.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,3 +209,14 @@ test("Export Equals", () => {
209209

210210
expect(result).toBe(true);
211211
});
212+
213+
test.each(["x = true", "[x] = [true]", "[[x]] = [[true]]", "({ x } = { x: true })", "({ y: x } = { y: true })"])(
214+
"export specifier with reassignment afterwards (%p)",
215+
reassignment => {
216+
util.testModule`
217+
let x = false;
218+
export { x };
219+
${reassignment};
220+
`.expectToMatchJsResult();
221+
}
222+
);

0 commit comments

Comments
 (0)
X Tutup