From 1ad037f62179d5b295c270c1f3aa947a8112e483 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 25 Jun 2014 04:02:03 +0400 Subject: [PATCH] Fix KClassOrigin for non-Kotlin classes Check against presence of KotlinClass annotation --- .../org/jetbrains/jet/compiler/android/SpecialFiles.java | 1 + compiler/testData/codegen/boxWithJava/.empty | 0 .../referenceToJavaFieldOfKotlinSubclass/J.java | 3 +++ .../boxWithJava/referenceToJavaFieldOfKotlinSubclass/K.kt | 7 +++++++ .../generated/BlackBoxWithJavaCodegenTestGenerated.java | 5 +++++ .../src/kotlin/reflect/jvm/internal/KClassImpl.kt | 4 +++- 6 files changed, 19 insertions(+), 1 deletion(-) delete mode 100644 compiler/testData/codegen/boxWithJava/.empty create mode 100644 compiler/testData/codegen/boxWithJava/referenceToJavaFieldOfKotlinSubclass/J.java create mode 100644 compiler/testData/codegen/boxWithJava/referenceToJavaFieldOfKotlinSubclass/K.kt diff --git a/compiler/android-tests/tests/org/jetbrains/jet/compiler/android/SpecialFiles.java b/compiler/android-tests/tests/org/jetbrains/jet/compiler/android/SpecialFiles.java index 4056960242a..d162776ed5a 100644 --- a/compiler/android-tests/tests/org/jetbrains/jet/compiler/android/SpecialFiles.java +++ b/compiler/android-tests/tests/org/jetbrains/jet/compiler/android/SpecialFiles.java @@ -57,6 +57,7 @@ public class SpecialFiles { private static void fillExcludedFiles() { excludedFiles.add("boxAgainstJava"); // Must compile Java files before + excludedFiles.add("boxWithJava"); // Must compile Java files before excludedFiles.add("boxMultiFile"); // MultiFileTest not supported yet excludedFiles.add("boxInline"); // MultiFileTest not supported yet diff --git a/compiler/testData/codegen/boxWithJava/.empty b/compiler/testData/codegen/boxWithJava/.empty deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/compiler/testData/codegen/boxWithJava/referenceToJavaFieldOfKotlinSubclass/J.java b/compiler/testData/codegen/boxWithJava/referenceToJavaFieldOfKotlinSubclass/J.java new file mode 100644 index 00000000000..9e92f8601ef --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/referenceToJavaFieldOfKotlinSubclass/J.java @@ -0,0 +1,3 @@ +public class J extends K { + public final int value = 42; +} diff --git a/compiler/testData/codegen/boxWithJava/referenceToJavaFieldOfKotlinSubclass/K.kt b/compiler/testData/codegen/boxWithJava/referenceToJavaFieldOfKotlinSubclass/K.kt new file mode 100644 index 00000000000..79a425eb69b --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/referenceToJavaFieldOfKotlinSubclass/K.kt @@ -0,0 +1,7 @@ +open class K + +fun box(): String { + val f = J::value + val a = J() + return if (f.get(a) == 42) "OK" else "Fail: ${f[a]}" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java index 612db880d58..525144c9800 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java @@ -36,4 +36,9 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/codegen/boxWithJava"), Pattern.compile("^([^\\.]+)$"), false); } + @TestMetadata("referenceToJavaFieldOfKotlinSubclass") + public void testReferenceToJavaFieldOfKotlinSubclass() throws Exception { + doTestWithJava("compiler/testData/codegen/boxWithJava/referenceToJavaFieldOfKotlinSubclass/"); + } + } diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt index e191d9878b6..cb8d2f337b4 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt @@ -16,6 +16,8 @@ package kotlin.reflect.jvm.internal +import kotlin.reflect.jvm.KOTLIN_CLASS_ANNOTATION_CLASS + enum class KClassOrigin { BUILT_IN KOTLIN @@ -26,7 +28,7 @@ class KClassImpl( val jClass: Class ) : KClass { val origin: KClassOrigin = - if (K_OBJECT_CLASS.isAssignableFrom(jClass)) { + if (K_OBJECT_CLASS.isAssignableFrom(jClass) && jClass.isAnnotationPresent(KOTLIN_CLASS_ANNOTATION_CLASS)) { KClassOrigin.KOTLIN } else {