New J2K: Add converting type functions from kotlin one to j2k one

This commit is contained in:
Ilya Kirillov
2018-10-31 18:52:16 +03:00
committed by Ilya Kirillov
parent dbdd39c6ab
commit 29c536579f
5 changed files with 41 additions and 11 deletions
@@ -28,11 +28,9 @@ import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.BOOLEAN
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.NULL
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
import org.jetbrains.kotlin.lexer.KtSingleValueToken
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.types.expressions.OperatorConventions
class JKFileImpl : JKFile, JKBranchElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitFile(this, data)
@@ -163,13 +161,6 @@ class JKBinaryExpressionImpl(
}
}
infix fun JKType?.equalsIgnoreMutability(other: JKType?) =
when {
(this is JKClassTypeImpl && other is JKClassTypeImpl) ->
this.classReference == other.classReference && this.parameters == other.parameters
else -> TODO("No comparation for $this and $other")
}
class JKPrefixExpressionImpl(expression: JKExpression, override var operator: JKOperator) : JKPrefixExpression, JKBranchElementBase() {
@@ -291,7 +282,7 @@ class JKBooleanLiteral(val value: Boolean) : JKLiteralExpression, JKElementBase(
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitLiteralExpression(this, data)
}
fun JKLiteralExpression.LiteralType.toJkType(symbolProvider: JKSymbolProvider): JKType {
fun JKLiteralExpression.LiteralType.toJkType(symbolProvider: JKSymbolProvider): JKType {
fun defaultTypeByName(name: String) =
JKClassTypeImpl(
symbolProvider.provideDirectSymbol(
@@ -33,6 +33,7 @@ interface JKUniverseSymbol<T: JKTreeElement> : JKSymbol {
interface JKClassSymbol : JKNamedSymbol
interface JKMethodSymbol : JKNamedSymbol {
override val fqName: String
val receiverType: JKType?
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.j2k.tree
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.j2k.ast.Mutability
import org.jetbrains.kotlin.j2k.tree.impl.JKClassSymbol
import org.jetbrains.kotlin.j2k.tree.impl.JKFieldSymbol
@@ -64,6 +64,7 @@ interface JKParametrizedType : JKType {
interface JKClassType : JKParametrizedType {
val classReference: JKClassSymbol
override val nullability: Nullability
}
interface JKJavaPrimitiveType : JKType {
@@ -6,15 +6,26 @@
package org.jetbrains.kotlin.j2k.tree
import com.intellij.psi.*
import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference
import com.intellij.util.reverse
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.JKSymbolProvider
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.conversions.resolveFqName
import org.jetbrains.kotlin.j2k.tree.impl.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtTypeElement
import org.jetbrains.kotlin.psi.KtTypeReference
import org.jetbrains.kotlin.psi.KtUserType
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.callUtil.getType
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
import org.jetbrains.kotlin.idea.caches.resolve.util.*
fun JKExpression.type(context: ConversionContext): JKType =
when (this) {
@@ -57,6 +68,9 @@ fun PsiType.toJK(symbolProvider: JKSymbolProvider, nullability: Nullability = Nu
}
}
fun JKType.isSubtypeOf(other: JKType, symbolProvider: JKSymbolProvider): Boolean =
toKtType(symbolProvider).isSubtypeOf(other.toKtType(symbolProvider))
fun KtTypeElement.toJK(symbolProvider: JKSymbolProvider): JKType =
when (this) {
is KtUserType -> {
@@ -69,4 +83,26 @@ fun KtTypeElement.toJK(symbolProvider: JKSymbolProvider): JKType =
JKClassTypeImpl(symbol, typeParameters)
}
else -> TODO(this::class.java.toString())
}
}
fun JKType.toKtType(symbolProvider: JKSymbolProvider): KotlinType =
when (this) {
is JKClassType -> classReference!!.toKtType(symbolProvider)
else -> TODO(this::class.java.toString())
}
fun JKClassSymbol.toKtType(symbolProvider: JKSymbolProvider): KotlinType {
val classDescriptor = when (this) {
is JKMultiverseKtClassSymbol -> {
val bindingContext = target.analyze()
bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, target] as ClassDescriptor
}
is JKMultiverseClassSymbol ->
target.getJavaClassDescriptor()!!
is JKUniverseClassSymbol ->
(symbolProvider.symbolsByPsi.reverse()[target] as PsiClass).getJavaClassDescriptor()!!
else -> TODO(this::class.java.toString())
}
return classDescriptor.defaultType
}