@@ -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 ) &&
0 commit comments