Correctly implement specialized MutableEntrySet.contains KT-41278
This is a workaround for the problem KT-43321. Introduce an intermediate abstract set specialized for Map.Entry elements and implement 'contains(Map.Entry)' method there. Then inherit that intermediate set in entrysets of JS HashMap, JS LinkedHashMap, JVM MapBuilder, that are specialized for MutableMap.MutableEntry elements, so that no override of 'contains' is required anymore. This allows to avoid incorrect special 'contains' bridge being generated that otherwise rejects all arguments except ones of MutableEntry type.
This commit is contained in:
@@ -595,13 +595,19 @@ internal class MapBuilderValues<V> internal constructor(
|
||||
}
|
||||
}
|
||||
|
||||
// intermediate abstract class to workaround KT-43321
|
||||
internal abstract class AbstractMapBuilderEntrySet<E : Map.Entry<K, V>, K, V> : AbstractMutableSet<E>() {
|
||||
final override fun contains(element: E): Boolean = containsEntry(element)
|
||||
abstract fun containsEntry(element: Map.Entry<K, V>): Boolean
|
||||
}
|
||||
|
||||
internal class MapBuilderEntries<K, V> internal constructor(
|
||||
val backing: MapBuilder<K, V>
|
||||
) : MutableSet<MutableMap.MutableEntry<K, V>>, AbstractMutableSet<MutableMap.MutableEntry<K, V>>() {
|
||||
) : AbstractMapBuilderEntrySet<MutableMap.MutableEntry<K, V>, K, V>() {
|
||||
|
||||
override val size: Int get() = backing.size
|
||||
override fun isEmpty(): Boolean = backing.isEmpty()
|
||||
override fun contains(element: MutableMap.MutableEntry<K, V>): Boolean = backing.containsEntry(element)
|
||||
override fun containsEntry(element: Map.Entry<K, V>): Boolean = backing.containsEntry(element)
|
||||
override fun clear() = backing.clear()
|
||||
override fun add(element: MutableMap.MutableEntry<K, V>): Boolean = throw UnsupportedOperationException()
|
||||
override fun addAll(elements: Collection<MutableMap.MutableEntry<K, V>>): Boolean = throw UnsupportedOperationException()
|
||||
|
||||
Reference in New Issue
Block a user