IR: keep flexible type annotations when building fake overrides
#KT-61751 Fixed
This commit is contained in:
committed by
Space Team
parent
2b8bcfda94
commit
9f9287fb2e
+25
-1
@@ -17,6 +17,8 @@ import org.jetbrains.kotlin.ir.types.impl.buildSimpleType
|
||||
import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
import org.jetbrains.kotlin.name.StandardClassIds.Annotations.FlexibleNullability
|
||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
import org.jetbrains.kotlin.utils.memoryOptimizedMap
|
||||
|
||||
// This is basically modelled after the inliner copier.
|
||||
@@ -57,12 +59,27 @@ class CopyIrTreeWithSymbolsForFakeOverrides(
|
||||
?: argument
|
||||
}
|
||||
|
||||
private fun IrType.mergeTypeAnnotations(other: IrType): IrType {
|
||||
// Flexible types are represented as a type annotation in IR, so we need to keep it when substituting type during override.
|
||||
// Note that it's incorrect to merge _all_ type annotations though, because for a Collection subclass:
|
||||
//
|
||||
// abstract class Z : Collection<Int>
|
||||
//
|
||||
// `Z.contains` should have the signature `(Int) -> Boolean`, NOT `(@UnsafeVariance Int) -> Boolean` which would occur if we
|
||||
// copied all type annotations.
|
||||
return addAnnotations(buildList {
|
||||
for (fqName in TYPE_ANNOTATIONS_TO_MERGE) {
|
||||
addIfNotNull(other.annotations.findAnnotation(fqName))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
override fun remapType(type: IrType): IrType {
|
||||
if (type !is IrSimpleType) return type
|
||||
|
||||
return when (val substitutedType = typeArguments[type.classifier]) {
|
||||
is IrDynamicType -> substitutedType
|
||||
is IrSimpleType -> substitutedType.mergeNullability(type)
|
||||
is IrSimpleType -> substitutedType.mergeNullability(type).mergeTypeAnnotations(type)
|
||||
else -> type.buildSimpleType {
|
||||
kotlinType = null
|
||||
classifier = symbolRemapper.getReferencedClassifier(type.classifier)
|
||||
@@ -110,4 +127,11 @@ class CopyIrTreeWithSymbolsForFakeOverrides(
|
||||
parent,
|
||||
unimplementedOverridesStrategy
|
||||
)
|
||||
|
||||
private companion object {
|
||||
// TODO: RawTypeAnnotation, FlexibleMutability, EnhancedNullability?
|
||||
val TYPE_ANNOTATIONS_TO_MERGE = listOf(
|
||||
FlexibleNullability.asSingleFqName(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
|
||||
import java.util.HashSet
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// IGNORE_BACKEND: WASM
|
||||
// WASM_MUTE_REASON: STDLIB_COLLECTION_INHERITANCE
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
// DONT_TARGET_EXACT_BACKEND: NATIVE
|
||||
|
||||
interface A : Set<String>
|
||||
|
||||
-1
@@ -1,5 +1,4 @@
|
||||
// WITH_STDLIB
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
|
||||
abstract class A : AbstractMutableList<Int>()
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
|
||||
// FILE: B.java
|
||||
public abstract class B<E> extends A<E> implements L<E> {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_STDLIB
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
// FILE: removeAtBridgeClashWithJava.kt
|
||||
|
||||
abstract class AJALI : JavaAbstractList<Int>()
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// WITH_STDLIB
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
|
||||
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
|
||||
class ArrayDeque<E> : AbstractMutableList<E> {
|
||||
|
||||
-1
@@ -1,6 +1,5 @@
|
||||
// !JVM_DEFAULT_MODE: all-compatibility
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
// JVM_TARGET: 1.8
|
||||
// WITH_STDLIB
|
||||
// FULL_JDK
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// !JVM_DEFAULT_MODE: all
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
// JVM_TARGET: 1.8
|
||||
// WITH_STDLIB
|
||||
// FULL_JDK
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
// WITH_STDLIB
|
||||
// FILE: Fn.java
|
||||
public interface Fn<T, R> {
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
// WITH_STDLIB
|
||||
// FILE: Fn.java
|
||||
public interface Fn<T, R> {
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
// WITH_STDLIB
|
||||
|
||||
// binary representation of fractional part of phi = (sqrt(5) - 1) / 2
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
|
||||
import java.util.AbstractMap
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
// MODULE: lib
|
||||
// FILE: A.java
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
// MODULE: lib
|
||||
// FILE: A.java
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
||||
|
||||
// MODULE: lib
|
||||
// FILE: A.java
|
||||
|
||||
Reference in New Issue
Block a user