New J2K: Polyadic expression conversion.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user