From fb3c7e87a1640f170b428ee3756b01c0794e74a1 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 4 Dec 2018 18:48:20 +0300 Subject: [PATCH] New J2K: Fix binaryExpressionMethodSymbol in a case of not JKMultiverseKtClassSymbol --- .../org/jetbrains/kotlin/j2k/expressions.kt | 17 +++++++++++++++++ .../org/jetbrains/kotlin/j2k/tree/types.kt | 2 ++ 2 files changed, 19 insertions(+) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt index 70fbae4fae0..b5c01cb1dd0 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt @@ -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()?.methodSymbol()!! + is JKMultiverseClassSymbol -> classSymbol.target.methodSymbol()!! + else -> TODO(classSymbol::class.toString()) } } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt index 42630ac791e..60652aafed4 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt @@ -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()) }