New J2K: Make JKExpression.type nullable

This commit is contained in:
Ilya Kirillov
2018-11-27 13:34:27 +03:00
committed by Ilya Kirillov
parent 28aeaa040e
commit 9532dec452
3 changed files with 12 additions and 11 deletions
@@ -24,17 +24,17 @@ class OperatorExpressionConversion(private val context: ConversionContext) : Rec
is JKBinaryExpression -> { is JKBinaryExpression -> {
val left = applyToElement(element::left.detached()) as JKExpression val left = applyToElement(element::left.detached()) as JKExpression
val right = applyToElement(element::right.detached()) as JKExpression val right = applyToElement(element::right.detached()) as JKExpression
recurse(kotlinBinaryExpression(left, right, operatorToken, context)!!) kotlinBinaryExpression(left, right, operatorToken, context)?.let { recurse(it) }
} }
is JKPrefixExpression -> { is JKPrefixExpression -> {
val operand = applyToElement(element::expression.detached()) as JKExpression val operand = applyToElement(element::expression.detached()) as JKExpression
recurse(kotlinPrefixExpression(operand, operatorToken, context)) kotlinPrefixExpression(operand, operatorToken, context)?.let { recurse(it) }
} }
is JKPostfixExpression -> { is JKPostfixExpression -> {
val operand = applyToElement(element::expression.detached()) as JKExpression val operand = applyToElement(element::expression.detached()) as JKExpression
recurse(kotlinPostfixExpression(operand, operatorToken, context)) kotlinPostfixExpression(operand, operatorToken, context)?.let { recurse(it) }
} }
else -> TODO(element.javaClass.toString()) else -> TODO(element.javaClass.toString())
} } ?: recurse(element)
} }
} }
@@ -79,8 +79,8 @@ fun kotlinBinaryExpression(
token: JKKtOperatorToken, token: JKKtOperatorToken,
context: ConversionContext context: ConversionContext
): JKBinaryExpression? { ): JKBinaryExpression? {
val leftType = left.type(context) val leftType = left.type(context) ?: return null
val rightType = right.type(context) val rightType = right.type(context) ?: return null
val methodSymbol = token.binaryExpressionMethodSymbol(leftType, rightType, context.symbolProvider) val methodSymbol = token.binaryExpressionMethodSymbol(leftType, rightType, context.symbolProvider)
return JKBinaryExpressionImpl(left, right, JKKtOperatorImpl(token, methodSymbol)) return JKBinaryExpressionImpl(left, right, JKKtOperatorImpl(token, methodSymbol))
} }
@@ -89,8 +89,8 @@ fun kotlinPrefixExpression(
operand: JKExpression, operand: JKExpression,
token: JKKtOperatorToken, token: JKKtOperatorToken,
context: ConversionContext context: ConversionContext
): JKPrefixExpression { ): JKPrefixExpression? {
val operandType = operand.type(context) val operandType = operand.type(context) ?: return null
val methodSymbol = token.unaryExpressionMethodSymbol(operandType, context.symbolProvider) val methodSymbol = token.unaryExpressionMethodSymbol(operandType, context.symbolProvider)
return JKPrefixExpressionImpl(operand, JKKtOperatorImpl(token, methodSymbol)) return JKPrefixExpressionImpl(operand, JKKtOperatorImpl(token, methodSymbol))
} }
@@ -99,8 +99,8 @@ fun kotlinPostfixExpression(
operand: JKExpression, operand: JKExpression,
token: JKKtOperatorToken, token: JKKtOperatorToken,
context: ConversionContext context: ConversionContext
): JKPostfixExpression { ): JKPostfixExpression? {
val operandType = operand.type(context) val operandType = operand.type(context) ?: return null
val methodSymbol = token.unaryExpressionMethodSymbol(operandType, context.symbolProvider) val methodSymbol = token.unaryExpressionMethodSymbol(operandType, context.symbolProvider)
return JKPostfixExpressionImpl(operand, JKKtOperatorImpl(token, methodSymbol)) return JKPostfixExpressionImpl(operand, JKKtOperatorImpl(token, methodSymbol))
} }
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.util.*
import org.jetbrains.kotlin.j2k.kotlinTypeByName import org.jetbrains.kotlin.j2k.kotlinTypeByName
import org.jetbrains.kotlin.psi.KtNullableType import org.jetbrains.kotlin.psi.KtNullableType
fun JKExpression.type(context: ConversionContext): JKType = fun JKExpression.type(context: ConversionContext): JKType? =
when (this) { when (this) {
is JKLiteralExpression -> type.toJkType(context.symbolProvider) is JKLiteralExpression -> type.toJkType(context.symbolProvider)
is JKOperatorExpression -> { is JKOperatorExpression -> {
@@ -42,6 +42,7 @@ fun JKExpression.type(context: ConversionContext): JKType =
is JKFieldAccessExpressionImpl -> identifier.fieldType is JKFieldAccessExpressionImpl -> identifier.fieldType
is JKQualifiedExpressionImpl -> this.selector.type(context) is JKQualifiedExpressionImpl -> this.selector.type(context)
is JKKtThrowExpression -> kotlinTypeByName(KotlinBuiltIns.FQ_NAMES.nothing.asString(), context.symbolProvider) is JKKtThrowExpression -> kotlinTypeByName(KotlinBuiltIns.FQ_NAMES.nothing.asString(), context.symbolProvider)
is JKClassAccessExpression -> null
else -> TODO(this::class.java.toString()) else -> TODO(this::class.java.toString())
} }