diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/equalsHashCode.kt b/compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/equalsHashCode.kt new file mode 100644 index 00000000000..476b185d961 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/equalsHashCode.kt @@ -0,0 +1,29 @@ +import kotlin.test.* + +val top = 42 +var top2 = -23 + +val Int.intExt: Int get() = this +val Char.charExt: Int get() = this.toInt() + +class A(var mem: String) +class B(var mem: String) + + +fun checkEqual(x: Any, y: Any) { + assertEquals(x, y) + assertEquals(x.hashCode(), y.hashCode(), "Elements are equal but their hash codes are not: ${x.hashCode()} != ${y.hashCode()}") +} + +fun box(): String { + checkEqual(::top, ::top) + checkEqual(::top2, ::top2) + checkEqual(Int::intExt, Int::intExt) + checkEqual(A::mem, A::mem) + + assertFalse(::top == ::top2) + assertFalse(Int::intExt == Char::charExt) + assertFalse(A::mem == B::mem) + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index 51f5815cc53..252025ee4ed 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -1381,7 +1381,7 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode } @TestMetadata("compiler/testData/codegen/boxWithStdlib/reflection") - @InnerTestClasses({Reflection.Enclosing.class, Reflection.GenericSignature.class, Reflection.Mapping.class}) + @InnerTestClasses({Reflection.Enclosing.class, Reflection.GenericSignature.class, Reflection.Mapping.class, Reflection.MethodsFromAny.class}) public static class Reflection extends AbstractBlackBoxCodegenTest { public void testAllFilesPresentInReflection() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/codegen/boxWithStdlib/reflection"), Pattern.compile("^(.+)\\.kt$"), true); @@ -1530,12 +1530,26 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode } + @TestMetadata("compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny") + public static class MethodsFromAny extends AbstractBlackBoxCodegenTest { + public void testAllFilesPresentInMethodsFromAny() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("equalsHashCode.kt") + public void testEqualsHashCode() throws Exception { + doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/equalsHashCode.kt"); + } + + } + public static Test innerSuite() { TestSuite suite = new TestSuite("Reflection"); suite.addTestSuite(Reflection.class); suite.addTest(Enclosing.innerSuite()); suite.addTestSuite(GenericSignature.class); suite.addTestSuite(Mapping.class); + suite.addTestSuite(MethodsFromAny.class); return suite; } } 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 178806178de..49f66afefc7 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt @@ -56,4 +56,10 @@ class KClassImpl(val jClass: Class) : KClass { else { KMutableForeignMemberProperty(name, this) } + + override fun equals(other: Any?): Boolean = + other is KClassImpl<*> && jClass == other.jClass + + override fun hashCode(): Int = + jClass.hashCode() } diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KForeignMemberProperty.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KForeignMemberProperty.kt index 1aa2139d374..c0aab6889b1 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KForeignMemberProperty.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KForeignMemberProperty.kt @@ -30,6 +30,12 @@ open class KForeignMemberProperty( override fun get(receiver: T): R { return field.get(receiver) as R } + + override fun equals(other: Any?): Boolean = + other is KForeignMemberProperty<*, *> && name == other.name && owner == other.owner + + override fun hashCode(): Int = + name.hashCode() * 31 + owner.hashCode() } class KMutableForeignMemberProperty( diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt index 3872a48bf3d..8135c7dfea2 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt @@ -39,6 +39,12 @@ open class KMemberPropertyImpl( override fun get(receiver: T): R { return getter(receiver) as R } + + override fun equals(other: Any?): Boolean = + other is KMemberPropertyImpl<*, *> && name == other.name && owner == other.owner + + override fun hashCode(): Int = + name.hashCode() * 31 + owner.hashCode() } class KMutableMemberPropertyImpl( diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt index 7e16b2479c0..a2bab0d6737 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt @@ -18,4 +18,10 @@ package kotlin.reflect.jvm.internal import kotlin.reflect.KPackage -class KPackageImpl(val jClass: Class<*>) : KPackage +class KPackageImpl(val jClass: Class<*>) : KPackage { + override fun equals(other: Any?): Boolean = + other is KPackageImpl && jClass == other.jClass + + override fun hashCode(): Int = + jClass.hashCode() +} diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelExtensionPropertyImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelExtensionPropertyImpl.kt index 07b4ef66c4f..057a8cb5eba 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelExtensionPropertyImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelExtensionPropertyImpl.kt @@ -32,6 +32,12 @@ open class KTopLevelExtensionPropertyImpl( override fun get(receiver: T): R { return getter(null, receiver) as R } + + override fun equals(other: Any?): Boolean = + other is KTopLevelExtensionPropertyImpl<*, *> && name == other.name && owner == other.owner && receiverClass == other.receiverClass + + override fun hashCode(): Int = + (name.hashCode() * 31 + owner.hashCode()) * 31 + receiverClass.hashCode() } class KMutableTopLevelExtensionPropertyImpl( diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelVariableImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelVariableImpl.kt index ba15cb675f2..72dd86fa406 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelVariableImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelVariableImpl.kt @@ -32,6 +32,12 @@ open class KTopLevelVariableImpl( override fun get(): R { return getter(null) as R } + + override fun equals(other: Any?): Boolean = + other is KTopLevelVariableImpl<*> && name == other.name && owner == other.owner + + override fun hashCode(): Int = + name.hashCode() * 31 + owner.hashCode() } class KMutableTopLevelVariableImpl(