Skip to content

Commit e42c5be

Browse files
authored
Implemented spread expression transformation (#338)
* Implemented spread element transformation * Removed focusTest that I thought was already removed * Use createUnpackCall instead of re-implementing it
1 parent 5f1b483 commit e42c5be

File tree

2 files changed

+28
-14
lines changed

2 files changed

+28
-14
lines changed

src/LuaTransformer.ts

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,10 @@ export class LuaTransformer {
964964
)];
965965
} else {
966966
// local vars = this.transpileDestructingAssignmentValue(node.initializer);
967-
const initializer = this.createUnpackCall(this.transformExpression(statement.initializer));
967+
const initializer = this.createUnpackCall(
968+
this.transformExpression(statement.initializer),
969+
statement.initializer
970+
);
968971
return [tstl.createVariableDeclarationStatement(vars, initializer)];
969972
}
970973
} else {
@@ -1058,7 +1061,10 @@ export class LuaTransformer {
10581061
.map(elem => this.transformExpression(elem)));
10591062
} else if (!tsHelper.isTupleReturnCall(statement.expression, this.checker)) {
10601063
// If return expression is not another TupleReturn call, unpack it
1061-
const expression = this.createUnpackCall(this.transformExpression(statement.expression));
1064+
const expression = this.createUnpackCall(
1065+
this.transformExpression(statement.expression),
1066+
statement.expression
1067+
);
10621068
return tstl.createReturnStatement([expression]);
10631069
}
10641070
}
@@ -1133,15 +1139,15 @@ export class LuaTransformer {
11331139
// Declaration of new variable
11341140
const variableDeclarations = this.transformVariableDeclaration(initializer.declarations[0]);
11351141
if (ts.isArrayBindingPattern(initializer.declarations[0].name)) {
1136-
expression = this.createUnpackCall(expression);
1142+
expression = this.createUnpackCall(expression, initializer);
11371143
}
11381144
return tstl.createVariableDeclarationStatement(variableDeclarations[0].left, expression);
11391145

11401146
} else {
11411147
// Assignment to existing variable
11421148
let variables: tstl.IdentifierOrTableIndexExpression | tstl.IdentifierOrTableIndexExpression[];
11431149
if (ts.isArrayLiteralExpression(initializer)) {
1144-
expression = this.createUnpackCall(expression);
1150+
expression = this.createUnpackCall(expression, initializer);
11451151
variables = initializer.elements
11461152
.map(e => this.transformExpression(e)) as tstl.IdentifierOrTableIndexExpression[];
11471153
} else {
@@ -1483,7 +1489,7 @@ export class LuaTransformer {
14831489
case ts.SyntaxKind.TypeOfExpression:
14841490
return this.transformTypeOfExpression(expression as ts.TypeOfExpression);
14851491
case ts.SyntaxKind.SpreadElement:
1486-
throw new Error("Not yet implemented");
1492+
return this.transformSpreadElement(expression as ts.SpreadElement);
14871493
case ts.SyntaxKind.NonNullExpression:
14881494
return this.transformExpression((expression as ts.NonNullExpression).expression);
14891495
case ts.SyntaxKind.EmptyStatement:
@@ -1635,7 +1641,7 @@ export class LuaTransformer {
16351641
} else if (tsHelper.isTupleReturnCall(expression.right, this.checker)) {
16361642
right = [this.transformExpression(expression.right)];
16371643
} else {
1638-
right = [this.createUnpackCall(this.transformExpression(expression.right))];
1644+
right = [this.createUnpackCall(this.transformExpression(expression.right), expression.right)];
16391645
}
16401646
return tstl.createAssignmentStatement(
16411647
left as tstl.IdentifierOrTableIndexExpression[],
@@ -1667,7 +1673,7 @@ export class LuaTransformer {
16671673
} else if (tsHelper.isTupleReturnCall(expression.right, this.checker)) {
16681674
right = [this.transformExpression(expression.right)];
16691675
} else {
1670-
right = [this.createUnpackCall(this.transformExpression(expression.right))];
1676+
right = [this.createUnpackCall(this.transformExpression(expression.right), expression.right)];
16711677
}
16721678
const tmps = expression.left.elements.map((_, i) => tstl.createIdentifier(`____TS_tmp${i}`));
16731679
const statements: tstl.Statement[] = [
@@ -2765,6 +2771,12 @@ export class LuaTransformer {
27652771
);
27662772
}
27672773

2774+
public transformSpreadElement(expression: ts.SpreadElement): ExpressionVisitResult {
2775+
const innerExpression = this.transformExpression(expression.expression);
2776+
2777+
return this.createUnpackCall(innerExpression, expression);
2778+
}
2779+
27682780
public transformStringLiteral(literal: ts.StringLiteralLike): tstl.StringLiteral {
27692781
const text = this.escapeString(literal.text);
27702782
return tstl.createStringLiteral(text);
@@ -2888,18 +2900,20 @@ export class LuaTransformer {
28882900
return tstl.createCallExpression(tstl.createParenthesizedExpression(iife), [], undefined, tsOriginal);
28892901
}
28902902

2891-
public createUnpackCall(expression: tstl.Expression): tstl.Expression {
2903+
public createUnpackCall(expression: tstl.Expression, tsOriginal: ts.Node): tstl.Expression {
28922904
switch (this.options.luaTarget) {
28932905
case LuaTarget.Lua51:
28942906
case LuaTarget.LuaJIT:
2895-
return tstl.createCallExpression(tstl.createIdentifier("unpack"), [expression]);
2907+
return tstl.createCallExpression(tstl.createIdentifier("unpack"), [expression], undefined, tsOriginal);
28962908

28972909
case LuaTarget.Lua52:
28982910
case LuaTarget.Lua53:
28992911
default:
29002912
return tstl.createCallExpression(
29012913
tstl.createTableIndexExpression(tstl.createIdentifier("table"), tstl.createStringLiteral("unpack")),
2902-
[expression]
2914+
[expression],
2915+
undefined,
2916+
tsOriginal
29032917
);
29042918
}
29052919
}

test/unit/spreadElement.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,25 @@ export class SpreadElementTest {
2020
{
2121
// Cant test functional because our VM doesn't run on 5.1
2222
const lua = util.transpileString(`[].push(...${JSON.stringify([1, 2, 3])});`, {luaTarget: LuaTarget.Lua51});
23-
Expect(lua).toBe("__TS__ArrayPush({}, unpack({1,2,3}));");
23+
Expect(lua).toBe("__TS__ArrayPush({}, unpack({1, 2, 3}));");
2424
}
2525

2626
@Test("Spread Element Lua 5.2")
2727
public spreadElement52(): void
2828
{
2929
const lua = util.transpileString(`[...[0, 1, 2]]`, {luaTarget: LuaTarget.Lua52, luaLibImport: "none"});
30-
Expect(lua).toBe("{table.unpack({0,1,2})};");
30+
Expect(lua).toBe("{table.unpack({0, 1, 2})};");
3131
}
3232
@Test("Spread Element Lua 5.3")
3333
public spreadElement53(): void
3434
{
3535
const lua = util.transpileString(`[...[0, 1, 2]]`, {luaTarget: LuaTarget.Lua53, luaLibImport: "none"});
36-
Expect(lua).toBe("{table.unpack({0,1,2})};");
36+
Expect(lua).toBe("{table.unpack({0, 1, 2})};");
3737
}
3838
@Test("Spread Element Lua JIT")
3939
public spreadElementJIT(): void
4040
{
4141
const lua = util.transpileString(`[...[0, 1, 2]]`, {luaTarget: LuaTarget.LuaJIT, luaLibImport: "none"});
42-
Expect(lua).toBe("{unpack({0,1,2})};");
42+
Expect(lua).toBe("{unpack({0, 1, 2})};");
4343
}
4444
}

0 commit comments

Comments
 (0)