diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/classes/jvmName.kt b/compiler/testData/codegen/boxWithStdlib/reflection/classes/jvmName.kt new file mode 100644 index 00000000000..919900c354e --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/reflection/classes/jvmName.kt @@ -0,0 +1,41 @@ +import kotlin.test.assertEquals +import kotlin.test.assertTrue +import kotlin.reflect.jvm.jvmName +import kotlin.reflect.jvm.kotlin + +class Klass { + class Nested + companion object +} + +fun box(): String { + assertEquals("Klass", Klass::class.jvmName) + assertEquals("Klass\$Nested", Klass.Nested::class.jvmName) + assertEquals("Klass\$Companion", Klass.Companion::class.jvmName) + + assertEquals("java.lang.Object", Any::class.jvmName) + assertEquals("int", Int::class.jvmName) + assertEquals("[I", IntArray::class.jvmName) + assertEquals("java.util.List", List::class.jvmName) + assertEquals("java.util.List", MutableList::class.jvmName) + assertEquals("java.lang.String", String::class.jvmName) + assertEquals("java.lang.String", java.lang.String::class.jvmName) + + assertEquals("[Ljava.lang.Object;", Array::class.jvmName) + assertEquals("[Ljava.lang.Integer;", Array::class.jvmName) + assertEquals("[[Ljava.lang.String;", Array>::class.jvmName) + + assertEquals("java.util.Date", java.util.Date::class.jvmName) + assertEquals("kotlin.jvm.internal.KotlinSyntheticClass\$Kind", kotlin.jvm.internal.KotlinSyntheticClass.Kind::class.jvmName) + assertEquals("java.lang.Void", java.lang.Void::class.jvmName) + + class Local + val l = Local::class.jvmName + assertTrue(l != null && l.startsWith("_DefaultPackage\$") && "\$box\$" in l && l.endsWith("\$Local")) + + val obj = object {} + val o = obj.javaClass.kotlin.jvmName + assertTrue(o != null && o.startsWith("_DefaultPackage\$") && "\$box\$" in o && o.endsWith("\$1")) + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index 2da111d3b3f..09519dcd9ba 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -2802,6 +2802,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib(fileName); } + @TestMetadata("jvmName.kt") + public void testJvmName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/classes/jvmName.kt"); + doTestWithStdlib(fileName); + } + @TestMetadata("localClassSimpleName.kt") public void testLocalClassSimpleName() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/classes/localClassSimpleName.kt"); diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/classes.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/classes.kt new file mode 100644 index 00000000000..f059b078f0f --- /dev/null +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/classes.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package kotlin.reflect.jvm + +import kotlin.reflect.KClass +import kotlin.reflect.jvm.internal.KClassImpl + +/** + * Returns the JVM name of the class represented by this [KClass] instance. + * + * @see [java.lang.Class.getName] + */ +public val KClass<*>.jvmName: String + get() { + return (this as KClassImpl).jClass.getName() + }