Skip to content

Commit e2ef63d

Browse files
authored
Feature/move parenthesis handling to printer (#801)
* Moved parenthesis logic from transformer to printer * Updated snapshots * Fixed remaining issue with object literal access * Removed lua.ParenthesizedExpression and let printer figure it out
1 parent 8504525 commit e2ef63d

File tree

22 files changed

+93
-158
lines changed

22 files changed

+93
-158
lines changed

src/LuaAST.ts

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ export enum SyntaxKind {
3636
TableExpression,
3737
UnaryExpression,
3838
BinaryExpression,
39-
ParenthesizedExpression,
4039
CallExpression,
4140
MethodCallExpression,
4241
Identifier,
@@ -669,24 +668,6 @@ export function createBinaryExpression(
669668
return expression;
670669
}
671670

672-
export interface ParenthesizedExpression extends Expression {
673-
kind: SyntaxKind.ParenthesizedExpression;
674-
innerExpression: Expression;
675-
}
676-
677-
export function isParenthesizedExpression(node: Node): node is ParenthesizedExpression {
678-
return node.kind === SyntaxKind.ParenthesizedExpression;
679-
}
680-
681-
export function createParenthesizedExpression(
682-
innerExpression: Expression,
683-
tsOriginal?: ts.Node
684-
): ParenthesizedExpression {
685-
const expression = createNode(SyntaxKind.ParenthesizedExpression, tsOriginal) as ParenthesizedExpression;
686-
expression.innerExpression = innerExpression;
687-
return expression;
688-
}
689-
690671
export interface CallExpression extends Expression {
691672
kind: SyntaxKind.CallExpression;
692673
expression: Expression;

src/LuaPrinter.ts

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,6 @@ function isSimpleExpression(expression: lua.Expression): boolean {
6464
case lua.SyntaxKind.BinaryExpression:
6565
const binaryExpression = expression as lua.BinaryExpression;
6666
return isSimpleExpression(binaryExpression.left) && isSimpleExpression(binaryExpression.right);
67-
68-
case lua.SyntaxKind.ParenthesizedExpression:
69-
return isSimpleExpression((expression as lua.ParenthesizedExpression).innerExpression);
7067
}
7168

7269
return true;
@@ -560,8 +557,6 @@ export class LuaPrinter {
560557
return this.printUnaryExpression(expression as lua.UnaryExpression);
561558
case lua.SyntaxKind.BinaryExpression:
562559
return this.printBinaryExpression(expression as lua.BinaryExpression);
563-
case lua.SyntaxKind.ParenthesizedExpression:
564-
return this.printParenthesizedExpression(expression as lua.ParenthesizedExpression);
565560
case lua.SyntaxKind.CallExpression:
566561
return this.printCallExpression(expression as lua.CallExpression);
567562
case lua.SyntaxKind.MethodCallExpression:
@@ -689,46 +684,40 @@ export class LuaPrinter {
689684
const chunks: SourceChunk[] = [];
690685

691686
chunks.push(this.printOperator(expression.operator));
692-
chunks.push(this.printExpression(expression.operand));
687+
chunks.push(this.printExpressionInParenthesesIfNeeded(expression.operand));
693688

694689
return this.createSourceNode(expression, chunks);
695690
}
696691

697692
public printBinaryExpression(expression: lua.BinaryExpression): SourceNode {
698693
const chunks: SourceChunk[] = [];
699694

700-
chunks.push(this.printExpression(expression.left));
695+
chunks.push(this.printExpressionInParenthesesIfNeeded(expression.left));
701696
chunks.push(" ", this.printOperator(expression.operator), " ");
702-
chunks.push(this.printExpression(expression.right));
697+
chunks.push(this.printExpressionInParenthesesIfNeeded(expression.right));
703698

704699
return this.createSourceNode(expression, chunks);
705700
}
706701

707-
private canStripParenthesis(expression: lua.Expression): boolean {
708-
return (
709-
lua.isParenthesizedExpression(expression) ||
710-
lua.isTableIndexExpression(expression) ||
711-
lua.isCallExpression(expression) ||
712-
lua.isMethodCallExpression(expression) ||
713-
lua.isIdentifier(expression) ||
714-
lua.isNilLiteral(expression) ||
715-
lua.isNumericLiteral(expression) ||
716-
lua.isBooleanLiteral(expression)
717-
);
702+
private printExpressionInParenthesesIfNeeded(expression: lua.Expression): SourceNode {
703+
return this.needsParenthesis(expression)
704+
? this.createSourceNode(expression, ["(", this.printExpression(expression), ")"])
705+
: this.printExpression(expression);
718706
}
719707

720-
public printParenthesizedExpression(expression: lua.ParenthesizedExpression): SourceNode {
721-
const innerExpression = this.printExpression(expression.innerExpression);
722-
if (this.canStripParenthesis(expression.innerExpression)) {
723-
return this.createSourceNode(expression, innerExpression);
724-
}
725-
return this.createSourceNode(expression, ["(", innerExpression, ")"]);
708+
private needsParenthesis(expression: lua.Expression): boolean {
709+
return (
710+
lua.isBinaryExpression(expression) ||
711+
lua.isFunctionExpression(expression) ||
712+
lua.isTableExpression(expression) ||
713+
(lua.isUnaryExpression(expression) && expression.operator === lua.SyntaxKind.NotOperator)
714+
);
726715
}
727716

728717
public printCallExpression(expression: lua.CallExpression): SourceNode {
729718
const chunks = [];
730719

731-
chunks.push(this.printExpression(expression.expression), "(");
720+
chunks.push(this.printExpressionInParenthesesIfNeeded(expression.expression), "(");
732721

733722
if (expression.params) {
734723
chunks.push(...this.printExpressionList(expression.params));
@@ -742,13 +731,14 @@ export class LuaPrinter {
742731
public printMethodCallExpression(expression: lua.MethodCallExpression): SourceNode {
743732
const chunks = [];
744733

745-
const prefix = lua.isStringLiteral(expression.prefixExpression)
746-
? this.printExpression(lua.createParenthesizedExpression(expression.prefixExpression))
747-
: this.printExpression(expression.prefixExpression);
734+
const prefix =
735+
this.needsParenthesis(expression.prefixExpression) || lua.isStringLiteral(expression.prefixExpression)
736+
? ["(", this.printExpression(expression.prefixExpression), ")"]
737+
: [this.printExpression(expression.prefixExpression)];
748738

749739
const name = this.printIdentifier(expression.name);
750740

751-
chunks.push(prefix, ":", name, "(");
741+
chunks.push(...prefix, ":", name, "(");
752742

753743
if (expression.params) {
754744
chunks.push(...this.printExpressionList(expression.params));
@@ -770,7 +760,7 @@ export class LuaPrinter {
770760
public printTableIndexExpression(expression: lua.TableIndexExpression): SourceNode {
771761
const chunks: SourceChunk[] = [];
772762

773-
chunks.push(this.printExpression(expression.table));
763+
chunks.push(this.printExpressionInParenthesesIfNeeded(expression.table));
774764
if (
775765
lua.isStringLiteral(expression.index) &&
776766
isValidLuaIdentifier(expression.index.value) &&

src/transformation/builtins/array.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,7 @@ export function transformArrayProperty(
8989
): lua.UnaryExpression | undefined {
9090
switch (node.name.text) {
9191
case "length":
92-
let expression = context.transformExpression(node.expression);
93-
if (lua.isTableExpression(expression)) {
94-
expression = lua.createParenthesizedExpression(expression);
95-
}
92+
const expression = context.transformExpression(node.expression);
9693
return lua.createUnaryExpression(expression, lua.SyntaxKind.LengthOperator, node);
9794
default:
9895
return undefined;

src/transformation/builtins/index.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,11 @@ export function transformBuiltinIdentifierExpression(
120120
): lua.Expression | undefined {
121121
switch (node.text) {
122122
case "NaN":
123-
return lua.createParenthesizedExpression(
124-
lua.createBinaryExpression(
125-
lua.createNumericLiteral(0),
126-
lua.createNumericLiteral(0),
127-
lua.SyntaxKind.DivisionOperator,
128-
node
129-
)
123+
return lua.createBinaryExpression(
124+
lua.createNumericLiteral(0),
125+
lua.createNumericLiteral(0),
126+
lua.SyntaxKind.DivisionOperator,
127+
node
130128
);
131129

132130
case "Infinity":

src/transformation/builtins/math.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ export function transformMathCall(context: TransformationContext, node: Property
5050
const log1 = lua.createTableIndexExpression(math, lua.createStringLiteral("log"));
5151
const logCall1 = lua.createCallExpression(log1, params);
5252
const e = lua.createNumericLiteral(expressionName === "log10" ? Math.LN10 : Math.LN2);
53-
const div = lua.createBinaryExpression(logCall1, e, lua.SyntaxKind.DivisionOperator);
54-
return lua.createParenthesizedExpression(div, node);
53+
return lua.createBinaryExpression(logCall1, e, lua.SyntaxKind.DivisionOperator, node);
5554
}
5655

5756
// math.log(1 + x)

src/transformation/builtins/object.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,11 @@ export function transformObjectPrototypeCall(
4949
const parameters = transformArguments(context, node.arguments, signature);
5050
const rawGetIdentifier = lua.createIdentifier("rawget");
5151
const rawGetCall = lua.createCallExpression(rawGetIdentifier, [expr, ...parameters]);
52-
return lua.createParenthesizedExpression(
53-
lua.createBinaryExpression(rawGetCall, lua.createNilLiteral(), lua.SyntaxKind.InequalityOperator, node)
52+
return lua.createBinaryExpression(
53+
rawGetCall,
54+
lua.createNilLiteral(),
55+
lua.SyntaxKind.InequalityOperator,
56+
node
5457
);
5558
}
5659
}

src/transformation/builtins/string.ts

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -40,34 +40,20 @@ export function transformStringPrototypeCall(
4040
lua.createBooleanLiteral(true)
4141
);
4242

43-
return lua.createParenthesizedExpression(
44-
lua.createBinaryExpression(
45-
lua.createParenthesizedExpression(
46-
lua.createBinaryExpression(
47-
stringExpression,
48-
lua.createNumericLiteral(0),
49-
lua.SyntaxKind.OrOperator
50-
)
51-
),
52-
lua.createNumericLiteral(1),
53-
lua.SyntaxKind.SubtractionOperator,
54-
node
55-
)
43+
return lua.createBinaryExpression(
44+
lua.createBinaryExpression(stringExpression, lua.createNumericLiteral(0), lua.SyntaxKind.OrOperator),
45+
lua.createNumericLiteral(1),
46+
lua.SyntaxKind.SubtractionOperator,
47+
node
5648
);
5749
case "substr":
5850
if (node.arguments.length === 1) {
5951
const argument = context.transformExpression(node.arguments[0]);
6052
const arg1 = createExpressionPlusOne(argument);
6153
return createStringCall("sub", node, caller, arg1);
6254
} else {
63-
const arg1 = params[0];
64-
const arg2 = params[1];
65-
const sumArg = lua.createBinaryExpression(
66-
lua.createParenthesizedExpression(arg1),
67-
lua.createParenthesizedExpression(arg2),
68-
lua.SyntaxKind.AdditionOperator
69-
);
70-
return createStringCall("sub", node, caller, createExpressionPlusOne(arg1), sumArg);
55+
const sumArg = lua.createBinaryExpression(params[0], params[1], lua.SyntaxKind.AdditionOperator);
56+
return createStringCall("sub", node, caller, createExpressionPlusOne(params[0]), sumArg);
7157
}
7258
case "substring":
7359
if (node.arguments.length === 1) {
@@ -156,10 +142,7 @@ export function transformStringProperty(
156142
): lua.UnaryExpression {
157143
switch (node.name.text) {
158144
case "length":
159-
let expression = context.transformExpression(node.expression);
160-
if (ts.isTemplateExpression(node.expression)) {
161-
expression = lua.createParenthesizedExpression(expression);
162-
}
145+
const expression = context.transformExpression(node.expression);
163146
return lua.createUnaryExpression(expression, lua.SyntaxKind.LengthOperator, node);
164147
default:
165148
throw UnsupportedProperty("string", node.name.text, node);

src/transformation/utils/lua-ast.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ export function createExpressionPlusOne(expression: lua.Expression): lua.Express
4141
) {
4242
return expression.left;
4343
}
44-
45-
expression = lua.createParenthesizedExpression(expression);
4644
}
4745

4846
return lua.createBinaryExpression(expression, lua.createNumericLiteral(1), lua.SyntaxKind.AdditionOperator);
@@ -57,7 +55,7 @@ export function createImmediatelyInvokedFunctionExpression(
5755
body.push(lua.createReturnStatement(Array.isArray(result) ? result : [result]));
5856
const flags = statements.length === 0 ? lua.FunctionExpressionFlags.Inline : lua.FunctionExpressionFlags.None;
5957
const iife = lua.createFunctionExpression(lua.createBlock(body), undefined, undefined, undefined, flags);
60-
return lua.createCallExpression(lua.createParenthesizedExpression(iife), [], tsOriginal);
58+
return lua.createCallExpression(iife, [], tsOriginal);
6159
}
6260

6361
export function createUnpackCall(
@@ -73,9 +71,9 @@ export function createUnpackCall(
7371
return lua.createCallExpression(unpack, [expression], tsOriginal);
7472
}
7573

76-
export function wrapInTable(...expressions: lua.Expression[]): lua.ParenthesizedExpression {
74+
export function wrapInTable(...expressions: lua.Expression[]): lua.TableExpression {
7775
const fields = expressions.map(e => lua.createTableFieldExpression(e));
78-
return lua.createParenthesizedExpression(lua.createTableExpression(fields));
76+
return lua.createTableExpression(fields);
7977
}
8078

8179
export function wrapInToStringForConcat(expression: lua.Expression): lua.Expression {

src/transformation/visitors/access.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,7 @@ export const transformElementAccessExpression: FunctionVisitor<ts.ElementAccessE
3131
return constEnumValue;
3232
}
3333

34-
let table = context.transformExpression(expression.expression);
35-
if (lua.isTableExpression(table)) {
36-
table = lua.createParenthesizedExpression(table);
37-
}
34+
const table = context.transformExpression(expression.expression);
3835

3936
const argumentType = context.checker.getTypeAtLocation(expression.argumentExpression);
4037
const type = context.checker.getTypeAtLocation(expression.expression);
@@ -87,11 +84,7 @@ export const transformPropertyAccessExpression: FunctionVisitor<ts.PropertyAcces
8784
}
8885
}
8986

90-
let callPath = context.transformExpression(expression.expression);
91-
if (lua.isTableExpression(callPath)) {
92-
callPath = lua.createParenthesizedExpression(callPath);
93-
}
94-
87+
const callPath = context.transformExpression(expression.expression);
9588
return lua.createTableIndexExpression(callPath, lua.createStringLiteral(property), expression);
9689
};
9790

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export function transformAssignmentExpression(
127127
}
128128

129129
const args = [objExpression, indexExpression, context.transformExpression(expression.right)];
130-
return lua.createCallExpression(lua.createParenthesizedExpression(iife), args, expression);
130+
return lua.createCallExpression(iife, args, expression);
131131
} else {
132132
// Simple assignment
133133
// (function() ${left} = ${right}; return ${left} end)()

0 commit comments

Comments
 (0)