New J2K: Add type calculating for equals operator
This commit is contained in:
committed by
Ilya Kirillov
parent
a1ac0c2e4b
commit
fad9c52853
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.j2k.tree
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.j2k.JKSymbolProvider
|
||||||
|
import org.jetbrains.kotlin.j2k.conversions.resolveFqName
|
||||||
|
import org.jetbrains.kotlin.j2k.tree.impl.JKClassSymbol
|
||||||
|
import org.jetbrains.kotlin.j2k.tree.impl.JKClassTypeImpl
|
||||||
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
|
||||||
|
fun kotlinTypeByName(name: String, symbolProvider: JKSymbolProvider): JKClassType {
|
||||||
|
val symbol =
|
||||||
|
symbolProvider.provideDirectSymbol(
|
||||||
|
resolveFqName(ClassId.fromString(name), symbolProvider.symbolsByPsi.keys.first())!!
|
||||||
|
) as JKClassSymbol
|
||||||
|
return JKClassTypeImpl(symbol, emptyList())
|
||||||
|
}
|
||||||
@@ -139,10 +139,13 @@ class JKBinaryExpressionImpl(
|
|||||||
else ->
|
else ->
|
||||||
TODO(leftType::class.java.toString())
|
TODO(leftType::class.java.toString())
|
||||||
}
|
}
|
||||||
|
val operatorNames =
|
||||||
|
if(token.operatorName == "equals") listOf("equals", "compareTo")
|
||||||
|
else listOf(token.operatorName)
|
||||||
return classSymbol.target.declarations// todo look for extensions
|
return classSymbol.target.declarations// todo look for extensions
|
||||||
.asSequence()
|
.asSequence()
|
||||||
.filterIsInstance<KtNamedFunction>()
|
.filterIsInstance<KtNamedFunction>()
|
||||||
.filter { it.name == token.operatorName }
|
.filter { it.name in operatorNames }
|
||||||
.mapNotNull { symbolProvider.provideDirectSymbol(it) as? JKMethodSymbol }
|
.mapNotNull { symbolProvider.provideDirectSymbol(it) as? JKMethodSymbol }
|
||||||
.firstOrNull { it.parameterTypes.singleOrNull()?.takeIf { it.isSubtypeOf(rightType, symbolProvider) } != null }!!
|
.firstOrNull { it.parameterTypes.singleOrNull()?.takeIf { it.isSubtypeOf(rightType, symbolProvider) } != null }!!
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,11 +22,17 @@ import org.jetbrains.kotlin.types.KotlinType
|
|||||||
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
||||||
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.util.*
|
import org.jetbrains.kotlin.idea.caches.resolve.util.*
|
||||||
|
import org.jetbrains.kotlin.load.java.structure.impl.JavaPrimitiveTypeImpl
|
||||||
|
|
||||||
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 JKBinaryExpression -> (operator as JKKtOperatorImpl).methodSymbol.returnType
|
is JKBinaryExpression -> {
|
||||||
|
val operatorSymbol = (operator as JKKtOperatorImpl).methodSymbol
|
||||||
|
if (operatorSymbol.name == "compareTo") {
|
||||||
|
kotlinTypeByName("kotlin.Boolean", context.symbolProvider)
|
||||||
|
} else operatorSymbol.returnType
|
||||||
|
}
|
||||||
is JKMethodCallExpression -> identifier.returnType
|
is JKMethodCallExpression -> identifier.returnType
|
||||||
is JKFieldAccessExpressionImpl -> identifier.fieldType
|
is JKFieldAccessExpressionImpl -> identifier.fieldType
|
||||||
is JKQualifiedExpressionImpl -> this.selector.type(context)
|
is JKQualifiedExpressionImpl -> this.selector.type(context)
|
||||||
@@ -84,6 +90,8 @@ fun KtTypeElement.toJK(symbolProvider: JKSymbolProvider): JKType =
|
|||||||
fun JKType.toKtType(symbolProvider: JKSymbolProvider): KotlinType =
|
fun JKType.toKtType(symbolProvider: JKSymbolProvider): KotlinType =
|
||||||
when (this) {
|
when (this) {
|
||||||
is JKClassType -> classReference!!.toKtType(symbolProvider)
|
is JKClassType -> classReference!!.toKtType(symbolProvider)
|
||||||
|
is JKJavaPrimitiveType ->
|
||||||
|
kotlinTypeByName(jvmPrimitiveType.primitiveType.typeFqName.asString(), symbolProvider).toKtType(symbolProvider)
|
||||||
else -> TODO(this::class.java.toString())
|
else -> TODO(this::class.java.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user