New J2K: Convert tiled prefix operation to inv invocation

This commit is contained in:
Ilya Kirillov
2019-01-17 17:30:58 +03:00
committed by Ilya Kirillov
parent d09e72656a
commit 6c696f6c60
2 changed files with 25 additions and 3 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.j2k.conversions
import com.intellij.psi.JavaTokenType
import org.jetbrains.kotlin.j2k.*
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.*
@@ -14,20 +15,21 @@ import org.jetbrains.kotlin.lexer.KtTokens
class OperatorExpressionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKOperatorExpression) return recurse(element)
val operatorToken =
(element.operator as? JKJavaOperatorImpl)?.token?.toKtToken() ?: return recurse(element)
val operator = element.operator as? JKJavaOperatorImpl ?: return recurse(element)
return when (element) {
is JKBinaryExpression -> {
val operatorToken = operator.token.toKtToken()
val left = applyToElement(element::left.detached()) as JKExpression
val right = applyToElement(element::right.detached()) as JKExpression
recurse(convertBinaryExpression(left, right, operatorToken))
}
is JKPrefixExpression -> {
val operand = applyToElement(element::expression.detached()) as JKExpression
recurse(kotlinPrefixExpression(operand, operatorToken, context.symbolProvider))
recurse(convertPrefixExpression(operand, operator))
}
is JKPostfixExpression -> {
val operatorToken = operator.token.toKtToken()
val operand = applyToElement(element::expression.detached()) as JKExpression
recurse(kotlinPostfixExpression(operand, operatorToken, context.symbolProvider))
}
@@ -35,6 +37,25 @@ class OperatorExpressionConversion(private val context: ConversionContext) : Rec
} ?: recurse(element)
}
private fun convertPrefixExpression(operand: JKExpression, javaOperator: JKJavaOperatorImpl) =
convertTildeExpression(operand, javaOperator)
?: kotlinPrefixExpression(operand, javaOperator.token.toKtToken(), context.symbolProvider)
private fun convertTildeExpression(operand: JKExpression, javaOperator: JKJavaOperatorImpl): JKExpression? =
if (javaOperator.token.psiToken == JavaTokenType.TILDE) {
val invCall =
JKKtCallExpressionImpl(
context.symbolProvider.provideByFqName("kotlin.Int.inv"),//TODO check if Long
JKExpressionListImpl()
)
JKQualifiedExpressionImpl(
JKParenthesizedExpressionImpl(operand),
JKKtQualifierImpl.DOT,
invCall
)
} else null
private fun convertBinaryExpression(left: JKExpression, right: JKExpression, token: JKKtOperatorToken): JKBinaryExpression =
convertStringImplicitConcatenation(left, right, token)
?: kotlinBinaryExpression(left, right, token, context.symbolProvider)
@@ -118,6 +118,7 @@ class JKJavaOperatorToken(val psiToken: IElementType) : JKOperatorToken {
JavaTokenType.GTGTGTEQ -> "ushr"
JavaTokenType.PLUSPLUS -> "++"
JavaTokenType.MINUSMINUS -> "--"
JavaTokenType.TILDE -> "~"
else -> TODO(psiToken.toString())
}
}