New J2K: Inherit JKBinaryExpression & JKUnaryExpression from JKOperatorExpression

This commit is contained in:
Ilya Kirillov
2018-11-13 17:31:46 +03:00
committed by Ilya Kirillov
parent 9374816823
commit f76a3504cc
3 changed files with 14 additions and 20 deletions
@@ -16,16 +16,9 @@ import org.jetbrains.kotlin.j2k.tree.impl.toKtToken
class OperatorExpressionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKOperatorExpression) return recurse(element)
val operatorToken =
((when (element) {
is JKBinaryExpression ->
element.operator
is JKPrefixExpression ->
element.operator
is JKPostfixExpression ->
element.operator
else -> null
} as? JKJavaOperatorImpl)?.token)?.toKtToken() ?: return recurse(element)
(element.operator as? JKJavaOperatorImpl)?.token?.toKtToken() ?: return recurse(element)
return when (element) {
is JKBinaryExpression -> {
@@ -41,7 +34,7 @@ class OperatorExpressionConversion(private val context: ConversionContext) : Rec
val operand = applyToElement(element::expression.detached()) as JKExpression
recurse(kotlinPostfixExpression(operand, operatorToken, context))
}
else -> recurse(element)
else -> TODO(element.javaClass.toString())
}
}
}
@@ -129,15 +129,17 @@ interface JKDeclarationStatement : JKStatement {
val declaredStatements: List<JKDeclaration>
}
interface JKBinaryExpression : JKExpression {
var left: JKExpression
var right: JKExpression
interface JKOperatorExpression : JKExpression {
var operator: JKOperator
}
interface JKUnaryExpression : JKExpression {
interface JKBinaryExpression : JKOperatorExpression {
var left: JKExpression
var right: JKExpression
}
interface JKUnaryExpression : JKOperatorExpression {
var expression: JKExpression
var operator: JKOperator
}
interface JKPrefixExpression : JKUnaryExpression
@@ -28,16 +28,15 @@ import org.jetbrains.kotlin.j2k.kotlinTypeByName
fun JKExpression.type(context: ConversionContext): JKType =
when (this) {
is JKLiteralExpression -> type.toJkType(context.symbolProvider)
is JKBinaryExpression -> {
is JKOperatorExpression -> {
if (operator !is JKKtOperatorImpl) {
error("Cannot get type of ${operator::class}, it should be first converted to KtOperator")
}
val operatorSymbol = (operator as JKKtOperatorImpl).methodSymbol
if (operatorSymbol.name == "compareTo") {
kotlinTypeByName("kotlin.Boolean", context.symbolProvider)
} else operatorSymbol.returnType
}
is JKPostfixExpressionImpl ->
(operator as JKKtOperatorImpl).methodSymbol.returnType
is JKPrefixExpression ->
(operator as JKKtOperatorImpl).methodSymbol.returnType
is JKMethodCallExpression -> identifier.returnType
is JKFieldAccessExpressionImpl -> identifier.fieldType
is JKQualifiedExpressionImpl -> this.selector.type(context)