From 0b92b3160fae7e5c74f1835c712cf9c8751ab7fa Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 18 Feb 2019 10:35:41 +0300 Subject: [PATCH] New J2K: Add parenthesis to binary expression in a case of line break before operator --- .../PolyadicExpressionConversion.kt | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/PolyadicExpressionConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/PolyadicExpressionConversion.kt index 247d96b2453..ab99b1edcf4 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/PolyadicExpressionConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/PolyadicExpressionConversion.kt @@ -5,21 +5,20 @@ 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.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 { + 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( - if (element is JKJavaPolyadicExpression) - convertPolyadic( - element.operands.also { element.operands = emptyList() }, - element.tokens - ) - else element + if (needParenthesis) JKParenthesizedExpressionImpl(polyadic) + else polyadic ) } @@ -27,12 +26,7 @@ class PolyadicExpressionConversion(private val context: ConversionContext) : Rec return if (operators.isEmpty()) operands.first() else { - 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 operator = operators.maxBy { it.precedence }!! val index = operators.indexOf(operator) 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))