Skip to content

Commit 613fb05

Browse files
committed
refactored transformBinaryExpression a bit
1 parent 89bc7bb commit 613fb05

1 file changed

Lines changed: 37 additions & 18 deletions

File tree

src/LuaTransformer.ts

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2671,10 +2671,26 @@ export class LuaTransformer {
26712671
return this.transformBinaryOperation(typeCall, comparedExpression, operator, tsOriginal);
26722672
}
26732673

2674+
protected transformComparisonExpression(expression: ts.BinaryExpression): ExpressionVisitResult {
2675+
const left = this.transformExpression(expression.left);
2676+
const right = this.transformExpression(expression.right);
2677+
const operator = expression.operatorToken.kind;
2678+
2679+
// Custom handling for 'typeof(foo) === "type"'
2680+
if (ts.isTypeOfExpression(expression.left) && tstl.isStringLiteral(right)) {
2681+
return this.transformTypeOfLiteralComparison(expression.left, right, operator, expression);
2682+
} else if (ts.isTypeOfExpression(expression.right) && tstl.isStringLiteral(left)) {
2683+
return this.transformTypeOfLiteralComparison(expression.right, left, operator, expression);
2684+
}
2685+
2686+
return this.transformBinaryOperation(left, right, operator, expression);
2687+
}
2688+
26742689
public transformBinaryExpression(expression: ts.BinaryExpression): ExpressionVisitResult {
2675-
// Check if this is an assignment token, then handle accordingly
2690+
const operator = expression.operatorToken.kind;
26762691

2677-
const [isCompound, replacementOperator] = tsHelper.isBinaryAssignmentToken(expression.operatorToken.kind);
2692+
// Check if this is an assignment token, then handle accordingly
2693+
const [isCompound, replacementOperator] = tsHelper.isBinaryAssignmentToken(operator);
26782694
if (isCompound && replacementOperator) {
26792695
return this.transformCompoundAssignmentExpression(
26802696
expression,
@@ -2685,28 +2701,27 @@ export class LuaTransformer {
26852701
);
26862702
}
26872703

2688-
const lhs = this.transformExpression(expression.left);
2689-
const rhs = this.transformExpression(expression.right);
2690-
26912704
// Transpile operators
2692-
const operator = expression.operatorToken.kind;
26932705
switch (operator) {
26942706
case ts.SyntaxKind.AmpersandToken:
26952707
case ts.SyntaxKind.BarToken:
26962708
case ts.SyntaxKind.CaretToken:
26972709
case ts.SyntaxKind.LessThanLessThanToken:
26982710
case ts.SyntaxKind.GreaterThanGreaterThanToken:
26992711
case ts.SyntaxKind.GreaterThanGreaterThanGreaterThanToken:
2700-
return this.transformBinaryBitOperation(expression, lhs, rhs, operator);
27012712
case ts.SyntaxKind.PlusToken:
27022713
case ts.SyntaxKind.AmpersandAmpersandToken:
27032714
case ts.SyntaxKind.BarBarToken:
27042715
case ts.SyntaxKind.MinusToken:
27052716
case ts.SyntaxKind.AsteriskToken:
27062717
case ts.SyntaxKind.AsteriskAsteriskToken:
27072718
case ts.SyntaxKind.SlashToken:
2708-
case ts.SyntaxKind.PercentToken:
2719+
case ts.SyntaxKind.PercentToken: {
2720+
const lhs = this.transformExpression(expression.left);
2721+
const rhs = this.transformExpression(expression.right);
27092722
return this.transformBinaryOperation(lhs, rhs, operator, expression);
2723+
}
2724+
27102725
case ts.SyntaxKind.GreaterThanToken:
27112726
case ts.SyntaxKind.GreaterThanEqualsToken:
27122727
case ts.SyntaxKind.LessThanToken:
@@ -2715,25 +2730,26 @@ export class LuaTransformer {
27152730
case ts.SyntaxKind.EqualsEqualsEqualsToken:
27162731
case ts.SyntaxKind.ExclamationEqualsToken:
27172732
case ts.SyntaxKind.ExclamationEqualsEqualsToken:
2718-
// Custom handling for 'typeof(foo) === "type"'
2719-
if (ts.isTypeOfExpression(expression.left) && tstl.isStringLiteral(rhs)) {
2720-
return this.transformTypeOfLiteralComparison(expression.left, rhs, operator, expression);
2721-
} else if (ts.isTypeOfExpression(expression.right) && tstl.isStringLiteral(lhs)) {
2722-
return this.transformTypeOfLiteralComparison(expression.right, lhs, operator, expression);
2723-
}
2724-
return this.transformBinaryOperation(lhs, rhs, operator, expression);
2733+
return this.transformComparisonExpression(expression);
2734+
27252735
case ts.SyntaxKind.EqualsToken:
27262736
return this.transformAssignmentExpression(expression);
2727-
case ts.SyntaxKind.InKeyword:
2737+
2738+
case ts.SyntaxKind.InKeyword: {
2739+
const lhs = this.transformExpression(expression.left);
2740+
const rhs = this.transformExpression(expression.right);
27282741
const indexExpression = tstl.createTableIndexExpression(rhs, lhs);
27292742
return tstl.createBinaryExpression(
27302743
indexExpression,
27312744
tstl.createNilLiteral(),
27322745
tstl.SyntaxKind.InequalityOperator,
27332746
expression
27342747
);
2748+
}
27352749

2736-
case ts.SyntaxKind.InstanceOfKeyword:
2750+
case ts.SyntaxKind.InstanceOfKeyword: {
2751+
const lhs = this.transformExpression(expression.left);
2752+
const rhs = this.transformExpression(expression.right);
27372753
const rhsType = this.checker.getTypeAtLocation(expression.right);
27382754
const decorators = tsHelper.getCustomDecorators(rhsType, this.checker);
27392755

@@ -2751,13 +2767,16 @@ export class LuaTransformer {
27512767
}
27522768

27532769
return this.transformLuaLibFunction(LuaLibFeature.InstanceOf, expression, lhs, rhs);
2770+
}
27542771

2755-
case ts.SyntaxKind.CommaToken:
2772+
case ts.SyntaxKind.CommaToken: {
2773+
const rhs = this.transformExpression(expression.right);
27562774
return this.createImmediatelyInvokedFunctionExpression(
27572775
this.statementVisitResultToArray(this.transformExpressionStatement(expression.left)),
27582776
rhs,
27592777
expression
27602778
);
2779+
}
27612780

27622781
default:
27632782
throw TSTLErrors.UnsupportedKind("binary operator", operator, expression);

0 commit comments

Comments
 (0)