Fix loading class literal value void.class in reflection

#KT-27878 Fixed
This commit is contained in:
Alexander Udalov
2018-10-30 17:44:41 +01:00
parent 902d414d39
commit 2f72f68e1a
7 changed files with 61 additions and 2 deletions
@@ -16,11 +16,13 @@
package kotlin.reflect.jvm.internal.components
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
import org.jetbrains.kotlin.load.kotlin.header.ReadKotlinClassHeaderAnnotationVisitor
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.constants.ClassLiteralValue
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
@@ -195,6 +197,11 @@ private object ReflectClassStructure {
currentClass = currentClass.componentType
}
if (currentClass.isPrimitive) {
if (currentClass == Void.TYPE) {
// void.class is not representable in Kotlin, we approximate it by Unit::class
return ClassLiteralValue(ClassId.topLevel(KotlinBuiltIns.FQ_NAMES.unit.toSafe()), dimensions)
}
val primitiveType = JvmPrimitiveType.get(currentClass.name).primitiveType
if (dimensions > 0) {
return ClassLiteralValue(ClassId.topLevel(primitiveType.arrayTypeFqName), dimensions - 1)