diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index d80265f92c5..a137f4a6511 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -2719,8 +2719,9 @@ public class ExpressionCodegen extends JetVisitor implem @Override public Unit invoke(InstructionAdapter v) { Type classAsmType = typeMapper.mapClass(descriptor); - if (descriptor instanceof JavaClassDescriptor) { - v.aconst(classAsmType); + ModuleDescriptor module = DescriptorUtils.getContainingModule(descriptor); + if (descriptor instanceof JavaClassDescriptor || module == module.getBuiltIns().getBuiltInsModule()) { + putJavaLangClassInstance(v, classAsmType); v.invokestatic(REFLECTION, "foreignKotlinClass", Type.getMethodDescriptor(K_CLASS_TYPE, getType(Class.class)), false); } else { diff --git a/compiler/testData/codegen/boxAgainstJava/reflection/classLiterals/javaClassLiteral.java b/compiler/testData/codegen/boxAgainstJava/reflection/classLiterals/javaClassLiteral.java new file mode 100644 index 00000000000..e553ede479a --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/reflection/classLiterals/javaClassLiteral.java @@ -0,0 +1,2 @@ +public class javaClassLiteral { +} diff --git a/compiler/testData/codegen/boxAgainstJava/reflection/classLiterals/javaClassLiteral.kt b/compiler/testData/codegen/boxAgainstJava/reflection/classLiterals/javaClassLiteral.kt new file mode 100644 index 00000000000..dceaecb4de3 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/reflection/classLiterals/javaClassLiteral.kt @@ -0,0 +1,8 @@ +import javaClassLiteral as J + +fun box(): String { + val j = J::class + if (j.simpleName != "javaClassLiteral") return "Fail: ${j.simpleName}" + + return "OK" +} diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/classLiterals/builtinClassLiterals.kt b/compiler/testData/codegen/boxWithStdlib/reflection/classLiterals/builtinClassLiterals.kt new file mode 100644 index 00000000000..9813359f5b3 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/reflection/classLiterals/builtinClassLiterals.kt @@ -0,0 +1,22 @@ +import kotlin.test.assertEquals + +fun box(): String { + assertEquals("Any", Any::class.simpleName) + assertEquals("String", String::class.simpleName) + assertEquals("CharSequence", CharSequence::class.simpleName) + assertEquals("Number", Number::class.simpleName) + assertEquals("Int", Int::class.simpleName) + assertEquals("Long", Long::class.simpleName) + + assertEquals("Default", Int.Default::class.simpleName) + assertEquals("Default", Double.Default::class.simpleName) + + assertEquals("IntRange", IntRange::class.simpleName) + + assertEquals("List", List::class.simpleName) + + // TODO: this is wrong but should be fixed + assertEquals("List", MutableList::class.simpleName) + + return "OK" +} diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/classLiterals/classSimpleName.kt b/compiler/testData/codegen/boxWithStdlib/reflection/classLiterals/classSimpleName.kt new file mode 100644 index 00000000000..6899989aaca --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/reflection/classLiterals/classSimpleName.kt @@ -0,0 +1,14 @@ +class Klass + +fun box(): String { + val x = Klass::class + if (x.simpleName != "Klass") return "Fail x: ${x.simpleName}" + + val y = java.util.Date::class + if (y.simpleName != "Date") return "Fail y: ${y.simpleName}" + + val z = kotlin.jvm.internal.KotlinSyntheticClass.Kind::class + if (z.simpleName != "Kind") return "Fail z: ${z.simpleName}" + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java index 97a31e1bd90..11ea5a8306f 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -331,6 +331,7 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxCod @TestMetadata("compiler/testData/codegen/boxAgainstJava/reflection") @TestDataPath("$PROJECT_ROOT") @InnerTestClasses({ + Reflection.ClassLiterals.class, Reflection.Mapping.class, Reflection.Properties.class, }) @@ -340,6 +341,21 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxCod JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxAgainstJava/reflection"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("compiler/testData/codegen/boxAgainstJava/reflection/classLiterals") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ClassLiterals extends AbstractBlackBoxCodegenTest { + public void testAllFilesPresentInClassLiterals() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxAgainstJava/reflection/classLiterals"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("javaClassLiteral.kt") + public void testJavaClassLiteral() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/reflection/classLiterals/javaClassLiteral.kt"); + doTestAgainstJava(fileName); + } + } + @TestMetadata("compiler/testData/codegen/boxAgainstJava/reflection/mapping") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index af214dd48eb..4d8d17fccfe 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -2545,6 +2545,18 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxWithStdlib/reflection/classLiterals"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("builtinClassLiterals.kt") + public void testBuiltinClassLiterals() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/classLiterals/builtinClassLiterals.kt"); + doTestWithStdlib(fileName); + } + + @TestMetadata("classSimpleName.kt") + public void testClassSimpleName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/classLiterals/classSimpleName.kt"); + doTestWithStdlib(fileName); + } + @TestMetadata("simpleClassLiteral.kt") public void testSimpleClassLiteral() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/classLiterals/simpleClassLiteral.kt"); 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 13def843e0d..202e4b3922f 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt @@ -38,6 +38,11 @@ class KClassImpl(override val jClass: Class) : KCallableContainerImpl(), K override val scope: JetScope get() = descriptor.getDefaultType().getMemberScope() + override val simpleName: String? get() { + val name = descriptor.getName() + return if (name.isSpecial()) null else name.asString() + } + override fun getProperties(): Collection> { return scope.getAllDescriptors().stream() .filterIsInstance() diff --git a/core/reflection/src/kotlin/reflect/KClass.kt b/core/reflection/src/kotlin/reflect/KClass.kt index bdc8ef63edc..c4293ef81a7 100644 --- a/core/reflection/src/kotlin/reflect/KClass.kt +++ b/core/reflection/src/kotlin/reflect/KClass.kt @@ -17,6 +17,8 @@ package kotlin.reflect public trait KClass { + public val simpleName: String? + public fun getProperties(): Collection> public fun getExtensionProperties(): Collection>