[FIR] Support enhancing intersection overrides

When a type annotated with @PurelyImplements (explicitly or implicitly)
inherited some methods from a java supertype and the purely implemented
Kotlin supertype, it was inconsistent which of the signatures the
intersection override would have (with or without flexible types).
This commit adds support for the enhancement of intersection overrides.
If one of the overridden methods has non-flexible types, the enhanced
method will have non-flexible types.
This fixes some false negative nullability type mismatches.

#KT-59921 Fixed
This commit is contained in:
Kirill Rakhman
2024-01-17 10:14:44 +01:00
committed by Space Team
parent 3b841dcb98
commit 9ec0210c04
19 changed files with 159 additions and 47 deletions
@@ -166,11 +166,11 @@ FILE fqName:<root> fileName:/ArrayListOverrides.kt
overridden:
public open fun hashCode (): kotlin.Int declared in java.util.ArrayList
$this: VALUE_PARAMETER name:<this> type:java.util.AbstractList<@[FlexibleNullability] kotlin.String?>
FUN FAKE_OVERRIDE name:containsAll visibility:public modality:OPEN <> ($this:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>, p0:kotlin.collections.Collection<@[FlexibleNullability] kotlin.String?>) returnType:kotlin.Boolean [fake_override]
FUN FAKE_OVERRIDE name:containsAll visibility:public modality:OPEN <> ($this:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>, p0:kotlin.collections.Collection<@[EnhancedNullability] kotlin.String>) returnType:kotlin.Boolean [fake_override]
overridden:
public open fun containsAll (p0: kotlin.collections.Collection<@[FlexibleNullability] E of java.util.ArrayList?>): kotlin.Boolean declared in java.util.ArrayList
public open fun containsAll (p0: kotlin.collections.Collection<@[EnhancedNullability] E of java.util.ArrayList>): kotlin.Boolean declared in java.util.ArrayList
$this: VALUE_PARAMETER name:<this> type:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>
VALUE_PARAMETER name:p0 index:0 type:kotlin.collections.Collection<@[FlexibleNullability] kotlin.String?>
VALUE_PARAMETER name:p0 index:0 type:kotlin.collections.Collection<@[EnhancedNullability] kotlin.String>
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>) returnType:@[EnhancedNullability] kotlin.String [fake_override]
overridden:
public open fun toString (): @[EnhancedNullability] kotlin.String declared in java.util.ArrayList
@@ -358,11 +358,11 @@ FILE fqName:<root> fileName:/ArrayListOverrides.kt
overridden:
public open fun hashCode (): kotlin.Int declared in java.util.ArrayList
$this: VALUE_PARAMETER name:<this> type:java.util.AbstractList<@[FlexibleNullability] kotlin.String?>
FUN FAKE_OVERRIDE name:containsAll visibility:public modality:OPEN <> ($this:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>, p0:kotlin.collections.Collection<@[FlexibleNullability] kotlin.String?>) returnType:kotlin.Boolean [fake_override]
FUN FAKE_OVERRIDE name:containsAll visibility:public modality:OPEN <> ($this:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>, p0:kotlin.collections.Collection<@[EnhancedNullability] kotlin.String>) returnType:kotlin.Boolean [fake_override]
overridden:
public open fun containsAll (p0: kotlin.collections.Collection<@[FlexibleNullability] E of java.util.ArrayList?>): kotlin.Boolean declared in java.util.ArrayList
public open fun containsAll (p0: kotlin.collections.Collection<@[EnhancedNullability] E of java.util.ArrayList>): kotlin.Boolean declared in java.util.ArrayList
$this: VALUE_PARAMETER name:<this> type:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>
VALUE_PARAMETER name:p0 index:0 type:kotlin.collections.Collection<@[FlexibleNullability] kotlin.String?>
VALUE_PARAMETER name:p0 index:0 type:kotlin.collections.Collection<@[EnhancedNullability] kotlin.String>
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>) returnType:@[EnhancedNullability] kotlin.String [fake_override]
overridden:
public open fun toString (): @[EnhancedNullability] kotlin.String declared in java.util.ArrayList
@@ -51,10 +51,10 @@ class A1 : ArrayList<String> {
/* fake */ override operator fun contains(p0: @EnhancedNullability String): Boolean
// CHECK JVM_IR:
// Mangled name: A1#containsAll(kotlin.collections.Collection<kotlin.String?>){}kotlin.Boolean
// Public signature: /A1.containsAll|1049727718390523309[0]
// Public signature debug description: containsAll(kotlin.collections.Collection<kotlin.String?>){}kotlin.Boolean
/* fake */ override fun containsAll(p0: Collection<String?>): Boolean
// Mangled name: A1#containsAll(kotlin.collections.Collection<kotlin.String{EnhancedNullability}>){}kotlin.Boolean
// Public signature: /A1.containsAll|3856626117350599597[0]
// Public signature debug description: containsAll(kotlin.collections.Collection<kotlin.String{EnhancedNullability}>){}kotlin.Boolean
/* fake */ override fun containsAll(p0: Collection<@EnhancedNullability String>): Boolean
// CHECK:
// Mangled name: A1#ensureCapacity(kotlin.Int){}
@@ -290,10 +290,10 @@ class A2 : ArrayList<String> {
/* fake */ override operator fun contains(p0: @EnhancedNullability String): Boolean
// CHECK JVM_IR:
// Mangled name: A2#containsAll(kotlin.collections.Collection<kotlin.String?>){}kotlin.Boolean
// Public signature: /A2.containsAll|1049727718390523309[0]
// Public signature debug description: containsAll(kotlin.collections.Collection<kotlin.String?>){}kotlin.Boolean
/* fake */ override fun containsAll(p0: Collection<String?>): Boolean
// Mangled name: A2#containsAll(kotlin.collections.Collection<kotlin.String{EnhancedNullability}>){}kotlin.Boolean
// Public signature: /A2.containsAll|3856626117350599597[0]
// Public signature debug description: containsAll(kotlin.collections.Collection<kotlin.String{EnhancedNullability}>){}kotlin.Boolean
/* fake */ override fun containsAll(p0: Collection<@EnhancedNullability String>): Boolean
// CHECK:
// Mangled name: A2#ensureCapacity(kotlin.Int){}
@@ -205,7 +205,7 @@ FILE fqName:<root> fileName:/MultiList.kt
FUN FAKE_OVERRIDE name:containsAll visibility:public modality:OPEN <> ($this:kotlin.collections.List<<root>.Some<T of <root>.SomeList>>, elements:kotlin.collections.Collection<<root>.Some<T of <root>.SomeList>>) returnType:kotlin.Boolean [fake_override]
overridden:
public abstract fun containsAll (elements: kotlin.collections.Collection<<root>.Some<T of <root>.MyList>>): kotlin.Boolean declared in <root>.MyList
public open fun containsAll (p0: kotlin.collections.Collection<@[FlexibleNullability] E of java.util.ArrayList?>): kotlin.Boolean declared in java.util.ArrayList
public open fun containsAll (p0: kotlin.collections.Collection<@[EnhancedNullability] E of java.util.ArrayList>): kotlin.Boolean declared in java.util.ArrayList
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.List<<root>.Some<T of <root>.SomeList>>
VALUE_PARAMETER name:elements index:0 type:kotlin.collections.Collection<<root>.Some<T of <root>.SomeList>>
FUN FAKE_OVERRIDE name:get visibility:public modality:OPEN <> ($this:kotlin.collections.List<<root>.Some<T of <root>.SomeList>>, index:kotlin.Int) returnType:<root>.Some<T of <root>.SomeList> [fake_override,operator]