Skip to content

Commit 008eb82

Browse files
tomblindlolleko
authored andcommitted
Ts to lua ast assignment expressions (#317)
* compound assignment expressions * assignment expressions and refactoring in compound assignments * fixed table index expressions that were being given identifiers instead of string literals * moved ternaries out of parameters and changed transformExpressionStatement to take a ts.ExpressionStatement|ts.Expression
1 parent d4f8845 commit 008eb82

File tree

4 files changed

+415
-96
lines changed

4 files changed

+415
-96
lines changed

src/LuaAST.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export enum SyntaxKind {
1111
// Statements
1212
DoStatement,
1313
VariableDeclarationStatement,
14-
VariableAssignmentStatement,
14+
AssignmentStatement,
1515
IfStatement,
1616
WhileStatement,
1717
RepeatStatement,
@@ -40,8 +40,6 @@ export enum SyntaxKind {
4040
Identifier,
4141
TableIndexExpression,
4242
// Operators
43-
AssignmentOperator, // TODO maybe remove this once we figure out the correct way to transform a assignment in a binary expression
44-
// or maybe move change Assignment statement to contain a binaryExpression with an AssignmentOperator somehow?
4543
// Arithmetic
4644
AdditionOperator, // Maybe use abreviations for those add, sub, mul ...
4745
SubractionOperator,
@@ -82,7 +80,6 @@ export type UnaryOperator = SyntaxKind.NegationOperator | SyntaxKind.LengthOpera
8280
SyntaxKind.NotOperator | SyntaxKind.BitwiseNotOperator;
8381

8482
export type BinaryOperator =
85-
SyntaxKind.AssignmentOperator | // TODO @see above
8683
// Arithmetic
8784
SyntaxKind.AdditionOperator | SyntaxKind.SubractionOperator | SyntaxKind.MultiplicationOperator |
8885
SyntaxKind.DivisionOperator | SyntaxKind.FloorDivisionOperator |
@@ -214,24 +211,24 @@ export function createVariableDeclarationStatement(
214211
}
215212

216213
// `test1, test2 = 12, 42`
217-
export interface VariableAssignmentStatement extends Statement {
218-
kind: SyntaxKind.VariableAssignmentStatement;
214+
export interface AssignmentStatement extends Statement {
215+
kind: SyntaxKind.AssignmentStatement;
219216
left: IdentifierOrTableIndexExpression[];
220217
right: Expression[];
221218
}
222219

223-
export function isVariableAssignmentStatement(node: Node): node is VariableAssignmentStatement {
224-
return node.kind === SyntaxKind.VariableAssignmentStatement;
220+
export function isAssignmentStatement(node: Node): node is AssignmentStatement {
221+
return node.kind === SyntaxKind.AssignmentStatement;
225222
}
226223

227-
export function createVariableAssignmentStatement(
224+
export function createAssignmentStatement(
228225
left: IdentifierOrTableIndexExpression | IdentifierOrTableIndexExpression[],
229226
right: Expression | Expression[],
230227
parent?: Node,
231-
tsOriginal?: ts.Node): VariableAssignmentStatement {
228+
tsOriginal?: ts.Node): AssignmentStatement {
232229

233230
const statement =
234-
createNode(SyntaxKind.VariableAssignmentStatement, parent, tsOriginal) as VariableAssignmentStatement;
231+
createNode(SyntaxKind.AssignmentStatement, parent, tsOriginal) as AssignmentStatement;
235232
setParent(left, statement);
236233
if (Array.isArray(left)) {
237234
statement.left = left;

src/LuaPrinter.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import * as tstl from "./LuaAST";
22

3+
import {TSHelper as tsHelper} from "./TSHelper";
4+
35
export class LuaPrinter {
46

57
/* tslint:disable:object-literal-sort-keys */
68
private static operatorMap: {[key in tstl.Operator]: string} = {
7-
[tstl.SyntaxKind.AssignmentOperator]: "=",
89
[tstl.SyntaxKind.AdditionOperator]: "+",
910
[tstl.SyntaxKind.SubractionOperator]: "-",
1011
[tstl.SyntaxKind.MultiplicationOperator]: "*",
@@ -65,8 +66,8 @@ export class LuaPrinter {
6566
return this.printDoStatement(statement as tstl.DoStatement);
6667
case tstl.SyntaxKind.VariableDeclarationStatement:
6768
return this.printVariableDeclarationStatement(statement as tstl.VariableDeclarationStatement);
68-
case tstl.SyntaxKind.VariableAssignmentStatement:
69-
return this.printVariableAssignmentStatement(statement as tstl.VariableAssignmentStatement);
69+
case tstl.SyntaxKind.AssignmentStatement:
70+
return this.printVariableAssignmentStatement(statement as tstl.AssignmentStatement);
7071
case tstl.SyntaxKind.IfStatement:
7172
return this.printIfStatement(statement as tstl.IfStatement);
7273
case tstl.SyntaxKind.WhileStatement:
@@ -109,7 +110,7 @@ export class LuaPrinter {
109110
}
110111
}
111112

112-
private printVariableAssignmentStatement(statement: tstl.VariableAssignmentStatement): string {
113+
private printVariableAssignmentStatement(statement: tstl.AssignmentStatement): string {
113114
return this.indent(`${statement.left.map(e => this.printExpression(e)).join(", ")} = ` +
114115
`${statement.right.map(e => this.printExpression(e)).join(", ")};\n`);
115116
}
@@ -272,7 +273,7 @@ export class LuaPrinter {
272273
}
273274

274275
private printFunctionExpression(expression: tstl.FunctionExpression): string {
275-
const paramterArr: string[] = expression.params.map(i => this.printIdentifier(i));
276+
const paramterArr: string[] = expression.params ? expression.params.map(i => this.printIdentifier(i)) : [];
276277
if (expression.dots) {
277278
paramterArr.push(this.printDotsLiteral(expression.dots));
278279
}
@@ -290,7 +291,11 @@ export class LuaPrinter {
290291
const value = this.printExpression(expression.value);
291292

292293
if (expression.key) {
293-
return `[${this.printExpression(expression.key)}] = ${value}`;
294+
if (tstl.isIdentifier(expression.key)) {
295+
return `${this.printExpression(expression.key)} = ${value}`;
296+
} else {
297+
return `[${this.printExpression(expression.key)}] = ${value}`;
298+
}
294299
} else {
295300
return value;
296301
}
@@ -320,7 +325,7 @@ export class LuaPrinter {
320325
}
321326

322327
private printCallExpression(expression: tstl.CallExpression): string {
323-
const params = expression.params.map(e => this.printExpression(e)).join(", ");
328+
const params = expression.params ? expression.params.map(e => this.printExpression(e)).join(", ") : "";
324329
return `${this.printExpression(expression.expression)}(${params})`;
325330
}
326331

@@ -337,8 +342,8 @@ export class LuaPrinter {
337342

338343
private printTableIndexExpression(expression: tstl.TableIndexExpression): string {
339344
const table = this.printExpression(expression.table);
340-
if (tstl.isIdentifier(expression.index)) {
341-
return `${table}.${this.printIdentifier(expression.index)}`;
345+
if (tstl.isStringLiteral(expression.index) && tsHelper.isValidLuaIdentifier(expression.index.value)) {
346+
return `${table}.${expression.index.value}`;
342347
}
343348
return `${table}[${this.printExpression(expression.index)}]`;
344349
}

0 commit comments

Comments
 (0)