New J2K: Polyadic expression conversion.

This commit is contained in:
Dimach
2018-06-22 12:44:58 +03:00
committed by Ilya Kirillov
parent 15ad2af268
commit 81c0dae139
6 changed files with 62 additions and 3 deletions
@@ -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)
}
}
@@ -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)
}
}
@@ -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<JKExpression>, operators: List<JKOperator>): 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)
}
}
}
@@ -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)
@@ -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 <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtModifier(this, data)
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
interface JKOperator {
val operatorText: String
val precedence: Int
}
interface JKQualifier