New J2K: Fix binaryExpressionMethodSymbol in a case of not JKMultiverseKtClassSymbol

This commit is contained in:
Ilya Kirillov
2018-12-04 18:48:20 +03:00
committed by Ilya Kirillov
parent 2c7e44f41e
commit fb3c7e87a1
2 changed files with 19 additions and 0 deletions
@@ -44,6 +44,20 @@ private fun JKKtOperatorToken.binaryExpressionMethodSymbol(
val operatorNames =
if (operatorName == "equals") listOf("equals", "compareTo")
else listOf(operatorName)
fun PsiClass.methodSymbol() =
allMethods
.filter { it.name in operatorNames }
.firstOrNull {
it.parameterList.parameters.singleOrNull()?.takeIf {
rightType.isSubtypeOf(
it.type.toJK(symbolProvider),
symbolProvider
)
} != null
}?.let { symbolProvider.provideDirectSymbol(it) as JKMethodSymbol }
val classSymbol = leftType.classSymbol(symbolProvider)
return when (classSymbol) {
is JKMultiverseKtClassSymbol ->
@@ -53,6 +67,9 @@ private fun JKKtOperatorToken.binaryExpressionMethodSymbol(
.filter { it.name in operatorNames }
.mapNotNull { symbolProvider.provideDirectSymbol(it) as? JKMethodSymbol }
.firstOrNull { it.parameterTypes.singleOrNull()?.takeIf { rightType.isSubtypeOf(it, symbolProvider) } != null }!!
is JKUniverseClassSymbol -> classSymbol.target.psi<PsiClass>()?.methodSymbol()!!
is JKMultiverseClassSymbol -> classSymbol.target.methodSymbol()!!
else -> TODO(classSymbol::class.toString())
}
}
@@ -43,6 +43,8 @@ fun JKExpression.type(context: ConversionContext): JKType? =
is JKQualifiedExpressionImpl -> this.selector.type(context)
is JKKtThrowExpression -> kotlinTypeByName(KotlinBuiltIns.FQ_NAMES.nothing.asString(), context.symbolProvider)
is JKClassAccessExpression -> null
is JKJavaNewExpression -> JKClassTypeImpl(classSymbol)
is JKJavaInstanceOfExpression -> kotlinTypeByName(KotlinBuiltIns.FQ_NAMES._boolean.asString(), context.symbolProvider)
else -> TODO(this::class.java.toString())
}