From 29c536579face128383b34cd01b6b704d78ce476 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 31 Oct 2018 18:52:16 +0300 Subject: [PATCH] New J2K: Add converting type functions from kotlin one to j2k one --- .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 11 +----- .../jetbrains/kotlin/j2k/tree/impl/symbols.kt | 1 + .../org/jetbrains/kotlin/j2k/tree/jk.kt | 1 + .../org/jetbrains/kotlin/j2k/tree/markers.kt | 1 + .../org/jetbrains/kotlin/j2k/tree/types.kt | 38 ++++++++++++++++++- 5 files changed, 41 insertions(+), 11 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt index 16190bf0c54..4886c967860 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -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 accept(visitor: JKVisitor, 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 accept(visitor: JKVisitor, 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( diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt index 93629a236d3..06febee8c9a 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt @@ -33,6 +33,7 @@ interface JKUniverseSymbol : JKSymbol { interface JKClassSymbol : JKNamedSymbol + interface JKMethodSymbol : JKNamedSymbol { override val fqName: String val receiverType: JKType? diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 35c8af52c4d..0b72bf800d1 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -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 diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt index 2bda4f4bebb..4a7f0a8f0a0 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt @@ -64,6 +64,7 @@ interface JKParametrizedType : JKType { interface JKClassType : JKParametrizedType { val classReference: JKClassSymbol + override val nullability: Nullability } interface JKJavaPrimitiveType : JKType { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt index e85688a5d49..449b8b6017f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt @@ -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()) - } \ No newline at end of file + } + +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 +}