New J2K: Add parenthesis to binary expression in a case of line break before operator
This commit is contained in:
committed by
Ilya Kirillov
parent
c20e537b81
commit
0b92b3160f
@@ -5,21 +5,20 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.nj2k.conversions
|
package org.jetbrains.kotlin.nj2k.conversions
|
||||||
|
|
||||||
import org.jetbrains.kotlin.nj2k.ConversionContext
|
|
||||||
import org.jetbrains.kotlin.nj2k.kotlinBinaryExpression
|
|
||||||
import org.jetbrains.kotlin.nj2k.tree.*
|
import org.jetbrains.kotlin.nj2k.tree.*
|
||||||
import org.jetbrains.kotlin.nj2k.tree.impl.*
|
import org.jetbrains.kotlin.nj2k.tree.impl.JKBinaryExpressionImpl
|
||||||
|
import org.jetbrains.kotlin.nj2k.tree.impl.JKParenthesizedExpressionImpl
|
||||||
|
|
||||||
|
|
||||||
class PolyadicExpressionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
|
class PolyadicExpressionConversion : RecursiveApplicableConversionBase() {
|
||||||
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||||
|
if (element !is JKJavaPolyadicExpression) return recurse(element)
|
||||||
|
val needParenthesis = element.operands.any { it.containsNewLine() }
|
||||||
|
val polyadic = convertPolyadic(element.operands.also { element.operands = emptyList() }, element.tokens)
|
||||||
|
|
||||||
return recurse(
|
return recurse(
|
||||||
if (element is JKJavaPolyadicExpression)
|
if (needParenthesis) JKParenthesizedExpressionImpl(polyadic)
|
||||||
convertPolyadic(
|
else polyadic
|
||||||
element.operands.also { element.operands = emptyList() },
|
|
||||||
element.tokens
|
|
||||||
)
|
|
||||||
else element
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,12 +26,7 @@ class PolyadicExpressionConversion(private val context: ConversionContext) : Rec
|
|||||||
return if (operators.isEmpty())
|
return if (operators.isEmpty())
|
||||||
operands.first()
|
operands.first()
|
||||||
else {
|
else {
|
||||||
val operator = operators.maxBy { it.precedence }
|
val operator = operators.maxBy { it.precedence }!!
|
||||||
when (operator) {
|
|
||||||
is JKJavaOperatorImpl -> operator.token.toKtToken()
|
|
||||||
is JKKtOperatorImpl -> operator.token
|
|
||||||
else -> error("operator should be either kotlin or java")
|
|
||||||
}
|
|
||||||
val index = operators.indexOf(operator)
|
val index = operators.indexOf(operator)
|
||||||
val left = convertPolyadic(operands.subList(0, index + 1), operators.subList(0, index))
|
val left = convertPolyadic(operands.subList(0, index + 1), operators.subList(0, index))
|
||||||
val right = convertPolyadic(operands.subList(index + 1, operands.size), operators.subList(index + 1, operators.size))
|
val right = convertPolyadic(operands.subList(index + 1, operands.size), operators.subList(index + 1, operators.size))
|
||||||
|
|||||||
Reference in New Issue
Block a user