From 9f9287fb2e801bc02e50875346f2046d88b63a70 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 5 Sep 2023 19:06:58 +0200 Subject: [PATCH] IR: keep flexible type annotations when building fake overrides #KT-61751 Fixed --- .../CopyIrTreeWithSymbolsForFakeOverrides.kt | 26 ++++++++++++++++++- .../codegen/box/bridges/objectClone.kt | 1 - .../box/classes/inheritSetAndHashSet.kt | 1 - .../inheritFromAbstractMutableListInt.kt | 1 - .../collections/noStubsInJavaSuperClass.kt | 1 - .../removeAtBridgeClashWithJava.kt | 1 - .../inlineArgsInPlace/arrayDequeRemoveAll.kt | 1 - .../allCompatibility/bridgeWithJava.kt | 1 - .../defaults/noDefaultImpls/bridgeWithJava.kt | 1 - .../testData/codegen/box/sam/partialSam.kt | 1 - .../testData/codegen/box/sam/partialSamKT.kt | 1 - .../box/specialBuiltins/complexMapImpl.kt | 1 - .../specialBuiltins/specialBridgeModality.kt | 1 - .../codegen/box/vararg/varargsOverride.kt | 1 - .../codegen/box/vararg/varargsOverride2.kt | 1 - .../codegen/box/vararg/varargsOverride3.kt | 1 - 16 files changed, 25 insertions(+), 16 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/CopyIrTreeWithSymbolsForFakeOverrides.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/CopyIrTreeWithSymbolsForFakeOverrides.kt index 134e14d4400..86f1dc7a466 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/CopyIrTreeWithSymbolsForFakeOverrides.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/CopyIrTreeWithSymbolsForFakeOverrides.kt @@ -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 + // + // `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(), + ) + } } diff --git a/compiler/testData/codegen/box/bridges/objectClone.kt b/compiler/testData/codegen/box/bridges/objectClone.kt index b6c5f2cf4ee..90629967e22 100644 --- a/compiler/testData/codegen/box/bridges/objectClone.kt +++ b/compiler/testData/codegen/box/bridges/objectClone.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751 import java.util.HashSet diff --git a/compiler/testData/codegen/box/classes/inheritSetAndHashSet.kt b/compiler/testData/codegen/box/classes/inheritSetAndHashSet.kt index 2dd7ffbca90..89a350eb482 100644 --- a/compiler/testData/codegen/box/classes/inheritSetAndHashSet.kt +++ b/compiler/testData/codegen/box/classes/inheritSetAndHashSet.kt @@ -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 diff --git a/compiler/testData/codegen/box/collections/inheritFromAbstractMutableListInt.kt b/compiler/testData/codegen/box/collections/inheritFromAbstractMutableListInt.kt index f643ecbb622..8062bd55722 100644 --- a/compiler/testData/codegen/box/collections/inheritFromAbstractMutableListInt.kt +++ b/compiler/testData/codegen/box/collections/inheritFromAbstractMutableListInt.kt @@ -1,5 +1,4 @@ // WITH_STDLIB -// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751 abstract class A : AbstractMutableList() diff --git a/compiler/testData/codegen/box/collections/noStubsInJavaSuperClass.kt b/compiler/testData/codegen/box/collections/noStubsInJavaSuperClass.kt index 17da3cd40ee..77886597d6f 100644 --- a/compiler/testData/codegen/box/collections/noStubsInJavaSuperClass.kt +++ b/compiler/testData/codegen/box/collections/noStubsInJavaSuperClass.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751 // FILE: B.java public abstract class B extends A implements L { diff --git a/compiler/testData/codegen/box/collections/removeAtBridgeClashWithJava.kt b/compiler/testData/codegen/box/collections/removeAtBridgeClashWithJava.kt index 00065f98c92..9015d530954 100644 --- a/compiler/testData/codegen/box/collections/removeAtBridgeClashWithJava.kt +++ b/compiler/testData/codegen/box/collections/removeAtBridgeClashWithJava.kt @@ -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() diff --git a/compiler/testData/codegen/box/inlineArgsInPlace/arrayDequeRemoveAll.kt b/compiler/testData/codegen/box/inlineArgsInPlace/arrayDequeRemoveAll.kt index b28bbec314c..63fe26c446e 100644 --- a/compiler/testData/codegen/box/inlineArgsInPlace/arrayDequeRemoveAll.kt +++ b/compiler/testData/codegen/box/inlineArgsInPlace/arrayDequeRemoveAll.kt @@ -1,5 +1,4 @@ // WITH_STDLIB -// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751 @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") class ArrayDeque : AbstractMutableList { diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithJava.kt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithJava.kt index 0db8bf59f95..202428cd9af 100644 --- a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithJava.kt +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithJava.kt @@ -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 diff --git a/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithJava.kt b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithJava.kt index fc9ab0d8d2e..5770a299109 100644 --- a/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithJava.kt +++ b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithJava.kt @@ -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 diff --git a/compiler/testData/codegen/box/sam/partialSam.kt b/compiler/testData/codegen/box/sam/partialSam.kt index 211e0d6aa02..726302a8179 100644 --- a/compiler/testData/codegen/box/sam/partialSam.kt +++ b/compiler/testData/codegen/box/sam/partialSam.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751 // WITH_STDLIB // FILE: Fn.java public interface Fn { diff --git a/compiler/testData/codegen/box/sam/partialSamKT.kt b/compiler/testData/codegen/box/sam/partialSamKT.kt index a8d615c328f..f8bcacec49a 100644 --- a/compiler/testData/codegen/box/sam/partialSamKT.kt +++ b/compiler/testData/codegen/box/sam/partialSamKT.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751 // WITH_STDLIB // FILE: Fn.java public interface Fn { diff --git a/compiler/testData/codegen/box/specialBuiltins/complexMapImpl.kt b/compiler/testData/codegen/box/specialBuiltins/complexMapImpl.kt index f9ea7963264..0a3efc8c264 100644 --- a/compiler/testData/codegen/box/specialBuiltins/complexMapImpl.kt +++ b/compiler/testData/codegen/box/specialBuiltins/complexMapImpl.kt @@ -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 diff --git a/compiler/testData/codegen/box/specialBuiltins/specialBridgeModality.kt b/compiler/testData/codegen/box/specialBuiltins/specialBridgeModality.kt index 358920f8275..fa05e9afb2a 100644 --- a/compiler/testData/codegen/box/specialBuiltins/specialBridgeModality.kt +++ b/compiler/testData/codegen/box/specialBuiltins/specialBridgeModality.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751 import java.util.AbstractMap diff --git a/compiler/testData/codegen/box/vararg/varargsOverride.kt b/compiler/testData/codegen/box/vararg/varargsOverride.kt index 7e136d26b71..6e47dae1087 100644 --- a/compiler/testData/codegen/box/vararg/varargsOverride.kt +++ b/compiler/testData/codegen/box/vararg/varargsOverride.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751 // MODULE: lib // FILE: A.java diff --git a/compiler/testData/codegen/box/vararg/varargsOverride2.kt b/compiler/testData/codegen/box/vararg/varargsOverride2.kt index 33051b24287..ee050b31278 100644 --- a/compiler/testData/codegen/box/vararg/varargsOverride2.kt +++ b/compiler/testData/codegen/box/vararg/varargsOverride2.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751 // MODULE: lib // FILE: A.java diff --git a/compiler/testData/codegen/box/vararg/varargsOverride3.kt b/compiler/testData/codegen/box/vararg/varargsOverride3.kt index a08a503c2c2..708161cdf9b 100644 --- a/compiler/testData/codegen/box/vararg/varargsOverride3.kt +++ b/compiler/testData/codegen/box/vararg/varargsOverride3.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61751 // MODULE: lib // FILE: A.java