Override "hashCode" and "equals" for Getter and Setter to fix KT-13490
This commit is contained in:
committed by
Alexander Udalov
parent
46d5e974df
commit
c959b271a4
+42
-15
@@ -8,30 +8,57 @@
|
|||||||
// WITH_REFLECT
|
// WITH_REFLECT
|
||||||
|
|
||||||
import kotlin.reflect.KMutableProperty1
|
import kotlin.reflect.KMutableProperty1
|
||||||
|
import kotlin.reflect.KMutableProperty2
|
||||||
import kotlin.reflect.full.*
|
import kotlin.reflect.full.*
|
||||||
|
|
||||||
class C {
|
class C {
|
||||||
var prop = 42
|
var prop = 42
|
||||||
|
var String.prop: Int
|
||||||
|
get() = 42
|
||||||
|
set(value) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
val C_propReflect = C::class.memberProperties.find { it.name == "prop" } as? KMutableProperty1 ?: throw AssertionError()
|
|
||||||
val C_prop = C::prop
|
|
||||||
val cProp = C()::prop
|
val cProp = C()::prop
|
||||||
|
val C_prop = C::prop
|
||||||
|
val C_propReflect = C::class.memberProperties.find { it.name == "prop" } as? KMutableProperty1 ?: throw AssertionError()
|
||||||
|
val C_extPropReflect = C::class.memberExtensionProperties.find { it.name == "prop" } as? KMutableProperty2 ?: throw AssertionError()
|
||||||
|
|
||||||
fun box() =
|
fun box() =
|
||||||
when {
|
when {
|
||||||
C_prop.getter != C_prop.getter -> "C_prop.getter != C_prop.getter"
|
C_prop.getter != C_propReflect.getter -> "C_prop.getter != C_propReflect.getter"
|
||||||
C_propReflect.getter != C_propReflect.getter -> "C_propReflect.getter != C_propReflect.getter"
|
C_prop.setter != C_propReflect.setter -> "C_prop.setter != C_propReflect.setter"
|
||||||
cProp.getter != cProp.getter -> "cProp.getter != cProp.getter"
|
C_propReflect.getter != C_prop.getter -> "C_propReflect.getter != C_prop.getter"
|
||||||
|
C_propReflect.setter != C_prop.setter -> "C_propReflect.setter != C_prop.setter"
|
||||||
|
|
||||||
cProp.getter == C_prop.getter -> "cProp.getter == C_prop.getter"
|
// reflexive test of acessors of KProperty0, KProperty1, KProperty2
|
||||||
C_prop.getter == cProp.getter -> "C_prop.getter == cProp.getter"
|
cProp.getter != cProp.getter -> "cProp.getter != cProp.getter"
|
||||||
cProp.getter == C_propReflect.getter -> "cProp.getter == C_propReflect.getter"
|
cProp.setter != cProp.setter -> "cProp.setter != cProp.setter"
|
||||||
C_propReflect.getter == cProp.getter -> "C_propReflect.getter == cProp.getter"
|
C_prop.getter != C_prop.getter -> "C_prop.getter != C_prop.getter"
|
||||||
|
C_prop.setter != C_prop.setter -> "C_prop.setter != C_prop.setter"
|
||||||
|
C_propReflect.getter != C_propReflect.getter -> "C_propReflect.getter != C_propReflect.getter"
|
||||||
|
C_propReflect.setter != C_propReflect.setter -> "C_propReflect.setter != C_propReflect.setter"
|
||||||
|
C_extPropReflect.getter != C_extPropReflect.getter -> "C_extPropReflect.getter != C_extPropReflect.getter"
|
||||||
|
C_extPropReflect.setter != C_extPropReflect.setter -> "C_extPropReflect.setter != C_extPropReflect.setter"
|
||||||
|
|
||||||
// TODO https://youtrack.jetbrains.com/issue/KT-13490
|
// acessors of KProperty0, Kproperty1 and Kproperty2 are not equal to each other
|
||||||
// cProp.getter != C()::prop.getter -> "cProp.getter != C()::prop.getter"
|
cProp.getter == C_prop.getter -> "cProp.getter == C_prop.getter"
|
||||||
// cProp.setter != C()::prop.setter -> "cProp.setter != C()::prop.setter"
|
cProp.setter == C_prop.setter -> "cProp.setter == C_prop.setter"
|
||||||
|
C_prop.getter == cProp.getter -> "C_prop.getter == cProp.getter"
|
||||||
|
C_prop.setter == cProp.setter -> "C_prop.setter == cProp.setter"
|
||||||
|
cProp.getter == C_propReflect.getter -> "cProp.getter == C_propReflect.getter"
|
||||||
|
cProp.setter == C_propReflect.setter -> "cProp.setter == C_propReflect.setter"
|
||||||
|
C_propReflect.getter == cProp.getter -> "C_propReflect.getter == cProp.getter"
|
||||||
|
C_propReflect.setter == cProp.setter -> "C_propReflect.setter == cProp.setter"
|
||||||
|
|
||||||
else -> "OK"
|
cProp.getter == C_extPropReflect.getter -> "cProp.getter == C_extPropReflect.getter"
|
||||||
}
|
cProp.setter == C_extPropReflect.setter -> "cProp.setter == C_extPropReflect.setter"
|
||||||
|
C_extPropReflect.getter == cProp.getter -> "C_extPropReflect.getter == cProp.getter"
|
||||||
|
C_extPropReflect.setter == cProp.setter -> "C_extPropReflect.setter == cProp.setter"
|
||||||
|
|
||||||
|
C_prop.getter == C_extPropReflect.getter -> "C_prop.getter == C_extPropReflect.getter"
|
||||||
|
C_prop.setter == C_extPropReflect.setter -> "C_prop.setter == C_extPropReflect.setter"
|
||||||
|
C_extPropReflect.getter == C_prop.getter -> "C_extPropReflect.getter == C_prop.getter"
|
||||||
|
C_extPropReflect.setter == C_prop.setter -> "C_extPropReflect.setter == C_prop.setter"
|
||||||
|
|
||||||
|
else -> "OK"
|
||||||
|
}
|
||||||
|
|||||||
@@ -157,6 +157,12 @@ internal abstract class KPropertyImpl<out V> private constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun toString(): String = "getter of $property"
|
override fun toString(): String = "getter of $property"
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean =
|
||||||
|
other is Getter<*> && property == other.property
|
||||||
|
|
||||||
|
override fun hashCode(): Int =
|
||||||
|
property.hashCode()
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class Setter<V> : Accessor<V, Unit>(), KMutableProperty.Setter<V> {
|
abstract class Setter<V> : Accessor<V, Unit>(), KMutableProperty.Setter<V> {
|
||||||
@@ -172,6 +178,12 @@ internal abstract class KPropertyImpl<out V> private constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun toString(): String = "setter of $property"
|
override fun toString(): String = "setter of $property"
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean =
|
||||||
|
other is Setter<*> && property == other.property
|
||||||
|
|
||||||
|
override fun hashCode(): Int =
|
||||||
|
property.hashCode()
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
Reference in New Issue
Block a user