diff --git a/runtime/src/main/kotlin/konan/internal/KPropertyImpl.kt b/runtime/src/main/kotlin/konan/internal/KPropertyImpl.kt index f43a8f2cff9..0b899b0f1d6 100644 --- a/runtime/src/main/kotlin/konan/internal/KPropertyImpl.kt +++ b/runtime/src/main/kotlin/konan/internal/KPropertyImpl.kt @@ -17,6 +17,19 @@ open class KProperty0Impl(override val name: String, val getter: () -> R) return getter() } + override fun equals(other: Any?): Boolean { + val otherKProperty = other as? KProperty0Impl + if (otherKProperty == null) return false + return name == otherKProperty.name && getter == otherKProperty.getter + } + + override fun hashCode(): Int { + return name.hashCode() * 31 + getter.hashCode() + } + + override fun toString(): String { + return "property $name (Kotlin reflection is not available)" + } } @FixmeReflection @@ -27,6 +40,20 @@ open class KProperty1Impl(override val name: String, val getter: (T) - override fun invoke(receiver: T): R { return getter(receiver) } + + override fun equals(other: Any?): Boolean { + val otherKProperty = other as? KProperty1Impl + if (otherKProperty == null) return false + return name == otherKProperty.name && getter == otherKProperty.getter + } + + override fun hashCode(): Int { + return name.hashCode() * 31 + getter.hashCode() + } + + override fun toString(): String { + return "property $name (Kotlin reflection is not available)" + } } @FixmeReflection @@ -37,6 +64,20 @@ open class KProperty2Impl(override val name: String, val getter: override fun invoke(receiver1: T1, receiver2: T2): R { return getter(receiver1, receiver2) } + + override fun equals(other: Any?): Boolean { + val otherKProperty = other as? KProperty2Impl + if (otherKProperty == null) return false + return name == otherKProperty.name && getter == otherKProperty.getter + } + + override fun hashCode(): Int { + return name.hashCode() * 31 + getter.hashCode() + } + + override fun toString(): String { + return "property $name (Kotlin reflection is not available)" + } } @FixmeReflection @@ -45,6 +86,20 @@ class KMutableProperty0Impl(name: String, getter: () -> R, val setter: (R) -> override fun set(value: R): Unit { setter(value) } + + override fun equals(other: Any?): Boolean { + val otherKProperty = other as? KMutableProperty0Impl + if (otherKProperty == null) return false + return name == otherKProperty.name && getter == otherKProperty.getter && setter == otherKProperty.setter + } + + override fun hashCode(): Int { + return (name.hashCode() * 31 + getter.hashCode()) * 31 + setter.hashCode() + } + + override fun toString(): String { + return "property $name (Kotlin reflection is not available)" + } } @FixmeReflection @@ -53,6 +108,20 @@ class KMutableProperty1Impl(name: String, getter: (T) -> R, val setter: (T override fun set(receiver: T, value: R): Unit { setter(receiver, value) } + + override fun equals(other: Any?): Boolean { + val otherKProperty = other as? KMutableProperty1Impl + if (otherKProperty == null) return false + return name == otherKProperty.name && getter == otherKProperty.getter && setter == otherKProperty.setter + } + + override fun hashCode(): Int { + return (name.hashCode() * 31 + getter.hashCode()) * 31 + setter.hashCode() + } + + override fun toString(): String { + return "property $name (Kotlin reflection is not available)" + } } @FixmeReflection @@ -61,6 +130,20 @@ class KMutableProperty2Impl(name: String, getter: (T1, T2) -> R, val override fun set(receiver1: T1, receiver2: T2, value: R): Unit { setter(receiver1, receiver2, value) } + + override fun equals(other: Any?): Boolean { + val otherKProperty = other as? KMutableProperty2Impl + if (otherKProperty == null) return false + return name == otherKProperty.name && getter == otherKProperty.getter && setter == otherKProperty.setter + } + + override fun hashCode(): Int { + return (name.hashCode() * 31 + getter.hashCode()) * 31 + setter.hashCode() + } + + override fun toString(): String { + return "property $name (Kotlin reflection is not available)" + } } open class KLocalDelegatedPropertyImpl(override val name: String): KProperty0 { @@ -70,10 +153,18 @@ open class KLocalDelegatedPropertyImpl(override val name: String): KPrope override fun invoke(): R { throw UnsupportedOperationException("Not supported for local property reference.") } + + override fun toString(): String { + return "property $name (Kotlin reflection is not available)" + } } class KLocalDelegatedMutablePropertyImpl(name: String): KLocalDelegatedPropertyImpl(name), KMutableProperty0 { override fun set(value: R): Unit { throw UnsupportedOperationException("Not supported for local property reference.") } + + override fun toString(): String { + return "property $name (Kotlin reflection is not available)" + } } \ No newline at end of file