New J2K: Polyadic expression conversion.
This commit is contained in:
@@ -31,6 +31,7 @@ object ConversionsRunner {
|
|||||||
JavaMethodToKotlinFunctionConversion().runConversion(it, context)
|
JavaMethodToKotlinFunctionConversion().runConversion(it, context)
|
||||||
LiteralConversion().runConversion(it, context)
|
LiteralConversion().runConversion(it, context)
|
||||||
ModifiersConversion().runConversion(it, context)
|
ModifiersConversion().runConversion(it, context)
|
||||||
|
PolyadicExpressionConversion().runConversion(it, context)
|
||||||
BinaryExpressionConversion().runConversion(it, context)
|
BinaryExpressionConversion().runConversion(it, context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,8 +12,9 @@ import org.jetbrains.kotlin.j2k.tree.impl.JKKtOperatorImpl
|
|||||||
|
|
||||||
class BinaryExpressionConversion : RecursiveApplicableConversionBase() {
|
class BinaryExpressionConversion : RecursiveApplicableConversionBase() {
|
||||||
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
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
|
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
|
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.impl.source.tree.ElementType.OPERATION_BIT_SET
|
||||||
import com.intellij.psi.tree.IElementType
|
import com.intellij.psi.tree.IElementType
|
||||||
import org.jetbrains.kotlin.j2k.ast.Nullability
|
import org.jetbrains.kotlin.j2k.ast.Nullability
|
||||||
import org.jetbrains.kotlin.j2k.tree.*
|
import org.jetbrains.kotlin.j2k.tree.*
|
||||||
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.*
|
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.*
|
||||||
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
|
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
||||||
|
|
||||||
class JKJavaFieldImpl(modifierList: JKModifierList, type: JKTypeElement, name: JKNameIdentifier, initializer: JKExpression) : JKJavaField,
|
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
|
override val operatorText: String
|
||||||
get() = TODO(token.toString())
|
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 {
|
companion object {
|
||||||
val tokenToOperator = OPERATION_BIT_SET.types.associate {
|
val tokenToOperator = OPERATION_BIT_SET.types.associate {
|
||||||
it to JKJavaOperatorImpl(it)
|
it to JKJavaOperatorImpl(it)
|
||||||
|
|||||||
@@ -83,6 +83,8 @@ class JKKtLiteralExpressionImpl(
|
|||||||
}
|
}
|
||||||
|
|
||||||
class JKKtOperatorImpl private constructor(val token: KtSingleValueToken) : JKOperator, JKElementBase() {
|
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
|
override val operatorText: String
|
||||||
get() = token.value
|
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() {
|
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)
|
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 {
|
interface JKOperator {
|
||||||
val operatorText: String
|
val operatorText: String
|
||||||
|
val precedence: Int
|
||||||
}
|
}
|
||||||
|
|
||||||
interface JKQualifier
|
interface JKQualifier
|
||||||
|
|||||||
Reference in New Issue
Block a user