From 3efa738bc0d4199a363f3b3f9096ee925d66205e Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 8 Aug 2016 18:29:03 +0300 Subject: [PATCH] Fix NPE on .companionObjectInstance for built-in classes #KT-13370 Fixed --- .../box/reflection/classes/companionObject.kt | 19 +++++++++++++++++++ .../box/reflection/classes/objectInstance.kt | 2 ++ .../kotlin/reflect/jvm/internal/KClassImpl.kt | 3 ++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/compiler/testData/codegen/box/reflection/classes/companionObject.kt b/compiler/testData/codegen/box/reflection/classes/companionObject.kt index af1a4d9444c..d0bc23f1750 100644 --- a/compiler/testData/codegen/box/reflection/classes/companionObject.kt +++ b/compiler/testData/codegen/box/reflection/classes/companionObject.kt @@ -25,5 +25,24 @@ fun box(): String { assertEquals(E.Companion, E::class.companionObjectInstance) + assertEquals(String, String::class.companionObjectInstance) + assertEquals(String, String.Companion::class.objectInstance) + assertEquals(Enum, Enum::class.companionObjectInstance) + assertEquals(Enum, Enum.Companion::class.objectInstance) + assertEquals(Double, Double::class.companionObjectInstance) + assertEquals(Double, Double.Companion::class.objectInstance) + assertEquals(Float, Float::class.companionObjectInstance) + assertEquals(Float, Float.Companion::class.objectInstance) + assertEquals(Int, Int::class.companionObjectInstance) + assertEquals(Int, Int.Companion::class.objectInstance) + assertEquals(Long, Long::class.companionObjectInstance) + assertEquals(Long, Long.Companion::class.objectInstance) + assertEquals(Short, Short::class.companionObjectInstance) + assertEquals(Short, Short.Companion::class.objectInstance) + assertEquals(Byte, Byte::class.companionObjectInstance) + assertEquals(Byte, Byte.Companion::class.objectInstance) + assertEquals(Char, Char::class.companionObjectInstance) + assertEquals(Char, Char.Companion::class.objectInstance) + return "OK" } diff --git a/compiler/testData/codegen/box/reflection/classes/objectInstance.kt b/compiler/testData/codegen/box/reflection/classes/objectInstance.kt index 8189d66d9e0..ff9e264bef6 100644 --- a/compiler/testData/codegen/box/reflection/classes/objectInstance.kt +++ b/compiler/testData/codegen/box/reflection/classes/objectInstance.kt @@ -26,6 +26,8 @@ fun box(): String { assertEquals(3, B.Factory::class.objectInstance!!.foo()) assertEquals(null, C::class.objectInstance) + assertEquals(null, String::class.objectInstance) + assertEquals(Unit, Unit::class.objectInstance) return "OK" } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt index b44d3d5b0b8..790cd71606c 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt @@ -16,6 +16,7 @@ package kotlin.reflect.jvm.internal +import org.jetbrains.kotlin.builtins.CompanionObjectMapping import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotated import org.jetbrains.kotlin.incremental.components.NoLookupLocation @@ -127,7 +128,7 @@ internal class KClassImpl(override val jClass: Class) : val descriptor = descriptor if (descriptor.kind != ClassKind.OBJECT) return@lazy null - val field = if (descriptor.isCompanionObject) { + val field = if (descriptor.isCompanionObject && !CompanionObjectMapping.hasMappingToObject(descriptor)) { jClass.enclosingClass.getDeclaredField(descriptor.name.asString()) } else {