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.types.impl.makeTypeProjection
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
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
|
import org.jetbrains.kotlin.utils.memoryOptimizedMap
|
||||||
|
|
||||||
// This is basically modelled after the inliner copier.
|
// This is basically modelled after the inliner copier.
|
||||||
@@ -57,12 +59,27 @@ class CopyIrTreeWithSymbolsForFakeOverrides(
|
|||||||
?: argument
|
?: 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 {
|
override fun remapType(type: IrType): IrType {
|
||||||
if (type !is IrSimpleType) return type
|
if (type !is IrSimpleType) return type
|
||||||
|
|
||||||
return when (val substitutedType = typeArguments[type.classifier]) {
|
return when (val substitutedType = typeArguments[type.classifier]) {
|
||||||
is IrDynamicType -> substitutedType
|
is IrDynamicType -> substitutedType
|
||||||
is IrSimpleType -> substitutedType.mergeNullability(type)
|
is IrSimpleType -> substitutedType.mergeNullability(type).mergeTypeAnnotations(type)
|
||||||
else -> type.buildSimpleType {
|
else -> type.buildSimpleType {
|
||||||
kotlinType = null
|
kotlinType = null
|
||||||
classifier = symbolRemapper.getReferencedClassifier(type.classifier)
|
classifier = symbolRemapper.getReferencedClassifier(type.classifier)
|
||||||
@@ -110,4 +127,11 @@ class CopyIrTreeWithSymbolsForFakeOverrides(
|
|||||||
parent,
|
parent,
|
||||||
unimplementedOverridesStrategy
|
unimplementedOverridesStrategy
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private companion object {
|
||||||
|
// TODO: RawTypeAnnotation, FlexibleMutability, EnhancedNullability?
|
||||||
|
val TYPE_ANNOTATIONS_TO_MERGE = listOf(
|
||||||
|
FlexibleNullability.asSingleFqName(),
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
|
|
||||||
import java.util.HashSet
|
import java.util.HashSet
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
// IGNORE_BACKEND: WASM
|
// IGNORE_BACKEND: WASM
|
||||||
// WASM_MUTE_REASON: STDLIB_COLLECTION_INHERITANCE
|
// WASM_MUTE_REASON: STDLIB_COLLECTION_INHERITANCE
|
||||||
// KJS_WITH_FULL_RUNTIME
|
// KJS_WITH_FULL_RUNTIME
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
// DONT_TARGET_EXACT_BACKEND: NATIVE
|
// DONT_TARGET_EXACT_BACKEND: NATIVE
|
||||||
|
|
||||||
interface A : Set<String>
|
interface A : Set<String>
|
||||||
|
|||||||
-1
@@ -1,5 +1,4 @@
|
|||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
|
|
||||||
abstract class A : AbstractMutableList<Int>()
|
abstract class A : AbstractMutableList<Int>()
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
|
|
||||||
// FILE: B.java
|
// FILE: B.java
|
||||||
public abstract class B<E> extends A<E> implements L<E> {
|
public abstract class B<E> extends A<E> implements L<E> {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
// FILE: removeAtBridgeClashWithJava.kt
|
// FILE: removeAtBridgeClashWithJava.kt
|
||||||
|
|
||||||
abstract class AJALI : JavaAbstractList<Int>()
|
abstract class AJALI : JavaAbstractList<Int>()
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
|
|
||||||
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
|
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
|
||||||
class ArrayDeque<E> : AbstractMutableList<E> {
|
class ArrayDeque<E> : AbstractMutableList<E> {
|
||||||
|
|||||||
-1
@@ -1,6 +1,5 @@
|
|||||||
// !JVM_DEFAULT_MODE: all-compatibility
|
// !JVM_DEFAULT_MODE: all-compatibility
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
// JVM_TARGET: 1.8
|
// JVM_TARGET: 1.8
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// FULL_JDK
|
// FULL_JDK
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
// !JVM_DEFAULT_MODE: all
|
// !JVM_DEFAULT_MODE: all
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
// JVM_TARGET: 1.8
|
// JVM_TARGET: 1.8
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// FULL_JDK
|
// FULL_JDK
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// FILE: Fn.java
|
// FILE: Fn.java
|
||||||
public interface Fn<T, R> {
|
public interface Fn<T, R> {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// FILE: Fn.java
|
// FILE: Fn.java
|
||||||
public interface Fn<T, R> {
|
public interface Fn<T, R> {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
|
|
||||||
// binary representation of fractional part of phi = (sqrt(5) - 1) / 2
|
// binary representation of fractional part of phi = (sqrt(5) - 1) / 2
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
|
|
||||||
import java.util.AbstractMap
|
import java.util.AbstractMap
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
// MODULE: lib
|
// MODULE: lib
|
||||||
// FILE: A.java
|
// FILE: A.java
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
// MODULE: lib
|
// MODULE: lib
|
||||||
// FILE: A.java
|
// FILE: A.java
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751
|
|
||||||
|
|
||||||
// MODULE: lib
|
// MODULE: lib
|
||||||
// FILE: A.java
|
// FILE: A.java
|
||||||
|
|||||||
Reference in New Issue
Block a user