diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index 7c190eff5a8..214767d6857 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -31,6 +31,7 @@ object ConversionsRunner { JavaMethodToKotlinFunctionConversion().runConversion(it, context) LiteralConversion().runConversion(it, context) ModifiersConversion().runConversion(it, context) + PolyadicExpressionConversion().runConversion(it, context) BinaryExpressionConversion().runConversion(it, context) } } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BinaryExpressionConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BinaryExpressionConversion.kt index e98a43acec3..1fd18189f79 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BinaryExpressionConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BinaryExpressionConversion.kt @@ -12,8 +12,9 @@ import org.jetbrains.kotlin.j2k.tree.impl.JKKtOperatorImpl class BinaryExpressionConversion : RecursiveApplicableConversionBase() { override fun applyToElement(element: JKTreeElement): JKTreeElement { - return if (element is JKBinaryExpression) element.also { + if (element is JKBinaryExpression) element.also { element.operator = JKKtOperatorImpl.javaToKotlinOperator[element.operator] ?: element.operator - } else recurse(element) + } + return recurse(element) } } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/PolyadicExpressionConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/PolyadicExpressionConversion.kt new file mode 100644 index 00000000000..33b9402391a --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/PolyadicExpressionConversion.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.j2k.conversions + +import org.jetbrains.kotlin.j2k.tree.JKExpression +import org.jetbrains.kotlin.j2k.tree.JKJavaPolyadicExpression +import org.jetbrains.kotlin.j2k.tree.JKOperator +import org.jetbrains.kotlin.j2k.tree.JKTreeElement +import org.jetbrains.kotlin.j2k.tree.impl.JKBinaryExpressionImpl + + +class PolyadicExpressionConversion : RecursiveApplicableConversionBase() { + override fun applyToElement(element: JKTreeElement): JKTreeElement { + return (if (element is JKJavaPolyadicExpression) + convertPolyadic(element.operands.also { element.operands = emptyList() }, element.tokens) + else + element).also { + recurse(element) + } + } + + private fun convertPolyadic(operands: List, operators: List): JKExpression { + return if (operators.isEmpty()) + operands.first() + else { + val op = operators.reduce { a, b -> if (a.precedence > b.precedence) a else b } + val index = operators.indexOf(op) + 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)) + JKBinaryExpressionImpl(left, right, op) + } + } +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt index 4305110a909..c2708be8574 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt @@ -16,12 +16,14 @@ package org.jetbrains.kotlin.j2k.tree.impl +import com.intellij.psi.JavaTokenType import com.intellij.psi.impl.source.tree.ElementType.OPERATION_BIT_SET import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.* import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType class JKJavaFieldImpl(modifierList: JKModifierList, type: JKTypeElement, name: JKNameIdentifier, initializer: JKExpression) : JKJavaField, @@ -66,6 +68,19 @@ class JKJavaOperatorImpl private constructor(val token: IElementType) : JKOperat override val operatorText: String get() = TODO(token.toString()) + override val precedence: Int + get() = when (token) { + JavaTokenType.ASTERISK, JavaTokenType.DIV, JavaTokenType.PERC -> 3 + JavaTokenType.PLUS, JavaTokenType.MINUS -> 4 + KtTokens.ELVIS -> 7 + JavaTokenType.GT, JavaTokenType.LT, JavaTokenType.GE, JavaTokenType.LE -> 9 + JavaTokenType.EQEQ, JavaTokenType.NE, KtTokens.EQEQEQ, KtTokens.EXCLEQEQEQ -> 10 + JavaTokenType.ANDAND -> 11 + JavaTokenType.OROR -> 12 + JavaTokenType.GTGTGT, JavaTokenType.GTGT, JavaTokenType.LTLT -> 7 + else -> 6 /* simple name */ + } + companion object { val tokenToOperator = OPERATION_BIT_SET.types.associate { it to JKJavaOperatorImpl(it) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt index b9c8580de38..46ceac5e587 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -83,6 +83,8 @@ class JKKtLiteralExpressionImpl( } class JKKtOperatorImpl private constructor(val token: KtSingleValueToken) : JKOperator, JKElementBase() { + override val precedence: Int + get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. override val operatorText: String get() = token.value @@ -117,7 +119,10 @@ class JKKtOperatorImpl private constructor(val token: KtSingleValueToken) : JKOp } } -class JKKtWordOperatorImpl constructor(override val operatorText: String) : JKOperator, JKElementBase() +class JKKtWordOperatorImpl constructor(override val operatorText: String) : JKOperator, JKElementBase() { + override val precedence: Int + get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. +} class JKKtModifierImpl(override val type: JKKtModifier.KtModifierType) : JKKtModifier, JKElementBase() { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtModifier(this, data) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt index 7f3789d01a0..f7ee2cadb2d 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType interface JKOperator { val operatorText: String + val precedence: Int } interface JKQualifier