9807c67ae4
If some java class has multiple supertypes then we need to collect overriddens from all those types directly, even if superTypeScope (which is FirTypeIntersectionScope in this case) returns only one symbol from one of this types (not intersection one) This is needed to proper enhancement in cases when some type occurs multiple times in supertypes graph with different nullability of arguments: class ConcurrentHashMap<K, V> : AbstractMap<K!, V!>, MutableMap<K, V> If we try to find method `get(key: K): V` supertype scope returns `AbstractMap.get(key: K!): V!` (because it actually overrides `MutableMap(key: K): V?`), but we need to get both symbols to properly enhance types for `ConcurrentHashMap.remove`
58 lines
1.5 KiB
Kotlin
Vendored
58 lines
1.5 KiB
Kotlin
Vendored
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
|
// FULL_JDK
|
|
|
|
import java.util.*
|
|
|
|
fun bar(): String? = null
|
|
val nullableInt: Int? = null
|
|
|
|
fun hashMapTest() {
|
|
var x: HashMap<String?, Int> = HashMap<String?, Int>()
|
|
x.put(null, <!NULL_FOR_NONNULL_TYPE!>null<!>)
|
|
x.put("", <!NULL_FOR_NONNULL_TYPE!>null<!>)
|
|
x.put(bar(), 1)
|
|
x.put("", 1)
|
|
|
|
x[null] = 1
|
|
x[bar()] = 1
|
|
x[""] = <!TYPE_MISMATCH!>nullableInt<!>
|
|
x[""] = 1
|
|
x[""] = <!NULL_FOR_NONNULL_TYPE!>null<!>
|
|
|
|
val b1: MutableMap<String?, Int?> = <!TYPE_MISMATCH!>x<!>
|
|
val b2: MutableMap<String?, Int> = x
|
|
val b3: Map<String?, Int> = x
|
|
val b4: Map<String?, Int?> = x
|
|
val b5: Map<String, Int?> = <!TYPE_MISMATCH!>x<!>
|
|
|
|
val b6: Int = <!TYPE_MISMATCH!>x[""]<!>
|
|
val b7: Int = <!TYPE_MISMATCH!>x[null]<!>
|
|
val b8: Int = <!TYPE_MISMATCH!>x.get("")<!>
|
|
|
|
val b9: Int? = x.get("")
|
|
}
|
|
|
|
fun treeMapTest() {
|
|
var x: TreeMap<String?, Int> = TreeMap<String?, Int>()
|
|
x.put(null, <!NULL_FOR_NONNULL_TYPE!>null<!>)
|
|
x.put("", <!NULL_FOR_NONNULL_TYPE!>null<!>)
|
|
x.put(bar(), 1)
|
|
x.put("", 1)
|
|
|
|
x[null] = 1
|
|
x[bar()] = 1
|
|
x[""] = <!TYPE_MISMATCH!>nullableInt<!>
|
|
x[""] = 1
|
|
|
|
val b1: MutableMap<String?, Int?> = <!TYPE_MISMATCH!>x<!>
|
|
val b2: MutableMap<String?, Int> = x
|
|
val b3: Map<String?, Int> = x
|
|
val b4: Map<String?, Int?> = x
|
|
val b5: Map<String, Int?> = <!TYPE_MISMATCH!>x<!>
|
|
|
|
val b6: Int = <!TYPE_MISMATCH!>x[""]<!>
|
|
val b7: Int = <!TYPE_MISMATCH!>x.get("")<!>
|
|
|
|
val b8: Int? = x.get("")
|
|
}
|