New J2K: Add types to JKExpression.type
This commit is contained in:
committed by
Ilya Kirillov
parent
2e353ccf86
commit
3d62734cc6
@@ -49,6 +49,21 @@ fun JKExpression.type(context: ConversionContext): JKType? =
|
|||||||
is JKTypeCastExpression -> type.type
|
is JKTypeCastExpression -> type.type
|
||||||
is JKThisExpression -> null// TODO return actual type
|
is JKThisExpression -> null// TODO return actual type
|
||||||
is JKSuperExpression -> null// TODO return actual type
|
is JKSuperExpression -> null// TODO return actual type
|
||||||
|
is JKStubExpression -> null
|
||||||
|
is JKIfElseExpression -> thenBranch.type(context)// TODO return actual type
|
||||||
|
is JKArrayAccessExpression ->
|
||||||
|
(expression.type(context) as? JKParametrizedType)?.parameters?.lastOrNull()
|
||||||
|
is JKClassLiteralExpression -> {
|
||||||
|
val symbol = when (literalType) {
|
||||||
|
JKClassLiteralExpression.LiteralType.KOTLIN_CLASS ->
|
||||||
|
context.symbolProvider.provideByFqName<JKClassSymbol>("kotlin.reflect.KClass")
|
||||||
|
JKClassLiteralExpression.LiteralType.JAVA_CLASS,
|
||||||
|
JKClassLiteralExpression.LiteralType.JAVA_PRIMITIVE_CLASS, JKClassLiteralExpression.LiteralType.JAVA_VOID_TYPE ->
|
||||||
|
context.symbolProvider.provideByFqName("java.lang.Class")
|
||||||
|
}
|
||||||
|
JKClassTypeImpl(symbol, listOf(classType.type), Nullability.NotNull)
|
||||||
|
}
|
||||||
|
|
||||||
else -> TODO(this::class.java.toString())
|
else -> TODO(this::class.java.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,21 +123,21 @@ fun JKType.isSubtypeOf(other: JKType, symbolProvider: JKSymbolProvider): Boolean
|
|||||||
?.let { otherType -> this.toKtType(symbolProvider)?.isSubtypeOf(otherType) } == true
|
?.let { otherType -> this.toKtType(symbolProvider)?.isSubtypeOf(otherType) } == true
|
||||||
|
|
||||||
|
|
||||||
fun KtTypeElement.toJK(symbolProvider: JKSymbolProvider): JKType =
|
fun KtTypeElement.toJK(symbolProvider: JKSymbolProvider): JKType? {
|
||||||
when (this) {
|
return when (this) {
|
||||||
is KtUserType -> {
|
is KtUserType -> {
|
||||||
val qualifiedName = qualifier?.text?.let { it + "." }.orEmpty() + referencedName
|
val qualifiedName = qualifier?.text?.let { it + "." }.orEmpty() + referencedName
|
||||||
val typeParameters = typeArguments.map { it.typeReference!!.typeElement!!.toJK(symbolProvider) }
|
val typeParameters = typeArguments.map { it.typeReference?.typeElement?.toJK(symbolProvider) }
|
||||||
val symbol = symbolProvider.provideDirectSymbol(
|
if (typeParameters.any { it == null }) return null
|
||||||
resolveFqName(ClassId.fromString(qualifiedName), this)!!
|
val fqName = resolveFqName(ClassId.fromString(qualifiedName), this) ?: return null
|
||||||
) as JKClassSymbol
|
val symbol = symbolProvider.provideDirectSymbol(fqName) as? JKClassSymbol ?: return null
|
||||||
|
JKClassTypeImpl(symbol, typeParameters as List<JKType>)
|
||||||
JKClassTypeImpl(symbol, typeParameters)
|
|
||||||
}
|
}
|
||||||
is KtNullableType ->
|
is KtNullableType ->
|
||||||
innerType!!.toJK(symbolProvider).updateNullability(Nullability.Nullable)
|
innerType?.toJK(symbolProvider)?.updateNullability(Nullability.Nullable)
|
||||||
else -> TODO(this::class.java.toString())
|
else -> null
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun JKType.toKtType(symbolProvider: JKSymbolProvider): KotlinType? =
|
fun JKType.toKtType(symbolProvider: JKSymbolProvider): KotlinType? =
|
||||||
when (this) {
|
when (this) {
|
||||||
@@ -161,6 +176,27 @@ inline fun <reified T : JKType> T.updateNullability(newNullability: Nullability)
|
|||||||
is JKJavaVoidType -> this
|
is JKJavaVoidType -> this
|
||||||
is JKJavaPrimitiveType -> this
|
is JKJavaPrimitiveType -> this
|
||||||
is JKJavaArrayType -> JKJavaArrayTypeImpl(type, newNullability)
|
is JKJavaArrayType -> JKJavaArrayTypeImpl(type, newNullability)
|
||||||
|
is JKContextType -> JKContextType
|
||||||
|
is JKJavaDisjunctionType -> this
|
||||||
|
else -> TODO(this::class.toString())
|
||||||
|
} as T
|
||||||
|
|
||||||
|
fun <T : JKType> T.updateNullabilityRecursively(newNullability: Nullability): T =
|
||||||
|
if (nullability == newNullability) this
|
||||||
|
else when (this) {
|
||||||
|
is JKTypeParameterTypeImpl -> JKTypeParameterTypeImpl(name, newNullability)
|
||||||
|
is JKClassTypeImpl ->
|
||||||
|
JKClassTypeImpl(
|
||||||
|
classReference,
|
||||||
|
parameters.map { it.updateNullabilityRecursively(newNullability) },
|
||||||
|
newNullability
|
||||||
|
)
|
||||||
|
is JKNoType -> this
|
||||||
|
is JKJavaVoidType -> this
|
||||||
|
is JKJavaPrimitiveType -> this
|
||||||
|
is JKJavaArrayType -> JKJavaArrayTypeImpl(type.updateNullabilityRecursively(newNullability), newNullability)
|
||||||
|
is JKContextType -> JKContextType
|
||||||
|
is JKJavaDisjunctionType -> this
|
||||||
else -> TODO(this::class.toString())
|
else -> TODO(this::class.toString())
|
||||||
} as T
|
} as T
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user