New J2K: Make polyadic expression converter to resolve real operator type
This commit is contained in:
committed by
Ilya Kirillov
parent
841cd9c749
commit
7dbe16d305
@@ -5,14 +5,16 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.j2k.conversions
|
package org.jetbrains.kotlin.j2k.conversions
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.j2k.ConversionContext
|
||||||
|
import org.jetbrains.kotlin.j2k.kotlinBinaryExpression
|
||||||
import org.jetbrains.kotlin.j2k.tree.JKExpression
|
import org.jetbrains.kotlin.j2k.tree.JKExpression
|
||||||
import org.jetbrains.kotlin.j2k.tree.JKJavaPolyadicExpression
|
import org.jetbrains.kotlin.j2k.tree.JKJavaPolyadicExpression
|
||||||
import org.jetbrains.kotlin.j2k.tree.JKOperator
|
import org.jetbrains.kotlin.j2k.tree.JKOperator
|
||||||
import org.jetbrains.kotlin.j2k.tree.JKTreeElement
|
import org.jetbrains.kotlin.j2k.tree.JKTreeElement
|
||||||
import org.jetbrains.kotlin.j2k.tree.impl.JKBinaryExpressionImpl
|
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||||
|
|
||||||
|
|
||||||
class PolyadicExpressionConversion : RecursiveApplicableConversionBase() {
|
class PolyadicExpressionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
|
||||||
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||||
return (if (element is JKJavaPolyadicExpression)
|
return (if (element is JKJavaPolyadicExpression)
|
||||||
convertPolyadic(element.operands.also { element.operands = emptyList() }, element.tokens)
|
convertPolyadic(element.operands.also { element.operands = emptyList() }, element.tokens)
|
||||||
@@ -26,11 +28,17 @@ class PolyadicExpressionConversion : RecursiveApplicableConversionBase() {
|
|||||||
return if (operators.isEmpty())
|
return if (operators.isEmpty())
|
||||||
operands.first()
|
operands.first()
|
||||||
else {
|
else {
|
||||||
val op = operators.reduce { a, b -> if (a.precedence > b.precedence) a else b }
|
val operator = operators.maxBy { it.precedence }
|
||||||
val index = operators.indexOf(op)
|
val token =
|
||||||
|
when (operator) {
|
||||||
|
is JKJavaOperatorImpl -> operator.token.toKtToken()
|
||||||
|
is JKKtOperatorImpl -> operator.token
|
||||||
|
else -> error("operator should be either kotlin or java")
|
||||||
|
}
|
||||||
|
val index = operators.indexOf(operator)
|
||||||
val left = convertPolyadic(operands.subList(0, index + 1), operators.subList(0, index))
|
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))
|
val right = convertPolyadic(operands.subList(index + 1, operands.size), operators.subList(index + 1, operators.size))
|
||||||
JKBinaryExpressionImpl(left, right, op)
|
kotlinBinaryExpression(left, right, token, context)!!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user