@@ -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