From 9ec0210c0456fff661dde42218f0bda579731e33 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Wed, 17 Jan 2024 10:14:44 +0100 Subject: [PATCH] [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 --- ...LFirBlackBoxCodegenBasedTestGenerated.java | 6 ++ ...rsedBlackBoxCodegenBasedTestGenerated.java | 6 ++ ...LightTreeBlackBoxCodegenTestGenerated.java | 6 ++ ...hIrFakeOverrideGeneratorTestGenerated.java | 6 ++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 ++ .../java/enhancement/SignatureEnhancement.kt | 73 ++++++++++++------- .../javaInheritsKotlinIntersectionOverride.kt | 30 ++++++++ .../customClassMutableCollection.fir.kt | 4 +- .../customClassMutableList.fir.kt | 4 +- .../purelyImplementedCollection/sets.fir.kt | 4 +- .../firProblems/ArrayListOverrides.fir.ir.txt | 12 +-- .../ArrayListOverrides.fir.sig.kt.txt | 16 ++-- .../irText/firProblems/MultiList.fir.ir.txt | 2 +- .../ir/irText/stubs/builtinMap.fir.ir.txt | 2 +- .../JvmAbiConsistencyTestBoxGenerated.java | 6 ++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++ ...kBoxCodegenWithIrInlinerTestGenerated.java | 6 ++ .../LightAnalysisModeTestGenerated.java | 5 ++ 19 files changed, 159 insertions(+), 47 deletions(-) create mode 100644 compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java index 0dff6c2b704..6a59a99044b 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java @@ -19298,6 +19298,12 @@ public class LLFirBlackBoxCodegenBasedTestGenerated extends AbstractLLFirBlackBo runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt"); } + @Test + @TestMetadata("javaInheritsKotlinIntersectionOverride.kt") + public void testJavaInheritsKotlinIntersectionOverride() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt"); + } + @Test @TestMetadata("kjkWithPackagePrivate.kt") public void testKjkWithPackagePrivate() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java index beb723692bd..96d27ad410d 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java @@ -19298,6 +19298,12 @@ public class LLFirReversedBlackBoxCodegenBasedTestGenerated extends AbstractLLFi runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt"); } + @Test + @TestMetadata("javaInheritsKotlinIntersectionOverride.kt") + public void testJavaInheritsKotlinIntersectionOverride() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt"); + } + @Test @TestMetadata("kjkWithPackagePrivate.kt") public void testKjkWithPackagePrivate() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index c4f2e9d8144..25adfb94122 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -19287,6 +19287,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt"); } + @Test + @TestMetadata("javaInheritsKotlinIntersectionOverride.kt") + public void testJavaInheritsKotlinIntersectionOverride() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt"); + } + @Test @TestMetadata("kjkWithPackagePrivate.kt") public void testKjkWithPackagePrivate() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java index 24a7aba4f8b..57101ddcecb 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java @@ -19287,6 +19287,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt"); } + @Test + @TestMetadata("javaInheritsKotlinIntersectionOverride.kt") + public void testJavaInheritsKotlinIntersectionOverride() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt"); + } + @Test @TestMetadata("kjkWithPackagePrivate.kt") public void testKjkWithPackagePrivate() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 8d9fd1d7506..feea7086096 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -19287,6 +19287,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt"); } + @Test + @TestMetadata("javaInheritsKotlinIntersectionOverride.kt") + public void testJavaInheritsKotlinIntersectionOverride() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt"); + } + @Test @TestMetadata("kjkWithPackagePrivate.kt") public void testKjkWithPackagePrivate() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index a9583ae346b..152f14b28fd 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -162,26 +162,18 @@ class FirSignatureEnhancement( is FirSyntheticProperty -> { val accessorSymbol = firElement.symbol val getterDelegate = firElement.getter.delegate - val enhancedGetterSymbol = if (getterDelegate.isJava) { - enhancementsCache.enhancedFunctions.getValue(getterDelegate.symbol, this to getterDelegate.name) - } else { - getterDelegate.symbol - } + val enhancedGetterSymbol = getterDelegate.enhanceAccessorOrNull() val setterDelegate = firElement.setter?.delegate - val enhancedSetterSymbol = if (setterDelegate?.isJava == true) { - enhancementsCache.enhancedFunctions.getValue(setterDelegate.symbol, this to setterDelegate.name) - } else { - setterDelegate?.symbol - } - if (!getterDelegate.isJava && setterDelegate?.isJava != true) { + val enhancedSetterSymbol = setterDelegate?.enhanceAccessorOrNull() + if (enhancedGetterSymbol == null && enhancedSetterSymbol == null) { return original } return buildSyntheticProperty { moduleData = this@FirSignatureEnhancement.moduleData this.name = name symbol = FirJavaOverriddenSyntheticPropertySymbol(accessorSymbol.callableId, accessorSymbol.getterId) - delegateGetter = enhancedGetterSymbol.fir as FirSimpleFunction - delegateSetter = enhancedSetterSymbol?.fir as FirSimpleFunction? + delegateGetter = enhancedGetterSymbol?.fir as FirSimpleFunction? ?: getterDelegate + delegateSetter = enhancedSetterSymbol?.fir as FirSimpleFunction? ?: setterDelegate status = firElement.status deprecationsProvider = getDeprecationsProviderFromAccessors(session, delegateGetter, delegateSetter) }.symbol @@ -195,19 +187,43 @@ class FirSignatureEnhancement( } } + private fun FirSimpleFunction.enhanceAccessorOrNull(): FirFunctionSymbol<*>? { + if (!symbol.isEnhanceable()) return null + return enhancedFunction(symbol, name) + } + @PrivateForInline internal fun enhance( original: FirFunctionSymbol<*>, - name: Name? + name: Name?, ): FirFunctionSymbol<*> { - val firMethod = original.fir - - if (!firMethod.isJava) { + if (!original.isEnhanceable()) { return original } + val firMethod = original.fir val enhancedParameters = enhanceTypeParameterBoundsForMethod(firMethod) - return enhanceMethod(firMethod, original.callableId, name, enhancedParameters) + return enhanceMethod(firMethod, original.callableId, name, enhancedParameters, original is FirIntersectionOverrideFunctionSymbol) + } + + private fun FirCallableSymbol<*>.isEnhanceable(): Boolean { + return origin is FirDeclarationOrigin.Java || isEnhanceableIntersection() + } + + /** + * Intersection overrides with Java and Kotlin overridden symbols need to be enhanced so that we get non-flexible types + * in the signature. + * This is required for @PurelyImplements to work properly. + * + * We only enhance intersection overrides if their dispatch receiver is equal to [owner], i.e. we don't enhance inherited + * intersection overrides. + * + * See compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt. + */ + private fun FirCallableSymbol<*>.isEnhanceableIntersection(): Boolean { + return this is FirIntersectionCallableSymbol && + dispatchReceiverClassLookupTagOrNull() == owner.symbol.toLookupTag() && + unwrapFakeOverrides>().origin is FirDeclarationOrigin.Enhancement } /** @@ -219,6 +235,7 @@ class FirSignatureEnhancement( methodId: CallableId, name: Name?, enhancedTypeParameters: List?, + isIntersectionOverride: Boolean, ): FirFunctionSymbol<*> { val predefinedEnhancementInfo = SignatureBuildingComponents.signature( @@ -253,7 +270,7 @@ class FirSignatureEnhancement( if (hasReceiver && index == 0) continue enhancedValueParameterTypes += enhanceValueParameterType( firMethod, overriddenMembers, hasReceiver, - defaultQualifiers, predefinedEnhancementInfo, valueParameter as FirJavaValueParameter, + defaultQualifiers, predefinedEnhancementInfo, valueParameter, if (hasReceiver) index - 1 else index ) } @@ -263,6 +280,8 @@ class FirSignatureEnhancement( val typeParameterSubstitutionMap = mutableMapOf() var typeParameterSubstitutor: ConeSubstitutorByMap? = null + val declarationOrigin = + if (isIntersectionOverride) FirDeclarationOrigin.IntersectionOverride else FirDeclarationOrigin.Enhancement val function = when (firMethod) { is FirConstructor -> { @@ -300,7 +319,7 @@ class FirSignatureEnhancement( source = firMethod.source moduleData = this@FirSignatureEnhancement.moduleData resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES - origin = FirDeclarationOrigin.Enhancement + origin = declarationOrigin // TODO: we should set a new origin / containing declaration to type parameters (KT-60440) this.typeParameters += (enhancedTypeParameters ?: firMethod.typeParameters) } @@ -310,11 +329,15 @@ class FirSignatureEnhancement( FirSimpleFunctionBuilder().apply { source = firMethod.source moduleData = this@FirSignatureEnhancement.moduleData - origin = FirDeclarationOrigin.Enhancement + origin = declarationOrigin this.name = name!! status = firMethod.status - symbol = FirNamedFunctionSymbol(methodId).also { functionSymbol = it } + symbol = if (isIntersectionOverride) { + FirIntersectionOverrideFunctionSymbol(methodId, overriddenMembers.map { it.symbol }) + } else { + FirNamedFunctionSymbol(methodId) + }.also { functionSymbol = it } resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES typeParameters += (enhancedTypeParameters ?: firMethod.typeParameters).map { typeParameter -> // FirJavaMethod contains only FirTypeParameter so [enhancedTypeParameters] must have the same type @@ -324,7 +347,7 @@ class FirSignatureEnhancement( // TODO: we probably shouldn't build a copy second time. See performFirstRoundOfBoundsResolution (KT-60446) val newTypeParameter = buildTypeParameterCopy(typeParameter) { - origin = FirDeclarationOrigin.Enhancement + origin = declarationOrigin symbol = FirTypeParameterSymbol() containingDeclarationSymbol = functionSymbol } @@ -372,7 +395,7 @@ class FirSignatureEnhancement( source = valueParameter.source containingFunctionSymbol = functionSymbol moduleData = this@FirSignatureEnhancement.moduleData - origin = FirDeclarationOrigin.Enhancement + origin = declarationOrigin returnTypeRef = enhancedReturnType.withReplacedConeType( typeParameterSubstitutor?.substituteOrNull(enhancedReturnType.coneType) ) @@ -590,7 +613,7 @@ class FirSignatureEnhancement( hasReceiver: Boolean, defaultQualifiers: JavaTypeQualifiersByElementType?, predefinedEnhancementInfo: PredefinedFunctionEnhancementInfo?, - ownerParameter: FirJavaValueParameter, + ownerParameter: FirValueParameter, index: Int ): FirResolvedTypeRef { return ownerFunction.enhanceValueParameter( diff --git a/compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt b/compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt new file mode 100644 index 00000000000..3cc4fabb3f9 --- /dev/null +++ b/compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt @@ -0,0 +1,30 @@ +// TARGET_BACKEND: JVM + +// MODULE: lib +// FILE: KtWhenExpression.java +public class KtWhenExpression extends KtExpressionImpl {} + +// FILE: KtExpressionImpl.kt +abstract class KtExpressionImpl : PsiElementBase(), PsiElement {} + +// FILE: PsiElementBase.java +public abstract class PsiElementBase implements PsiElement { + @Override + public String getProject() { return ""; } +} + +// FILE: PsiElement.java +public interface PsiElement { + String getProject(); +} + +// MODULE: box(lib) +// FILE: box.kt +private fun test(expression: KtWhenExpression) { + expression.project +} + +fun box(): String { + test(KtWhenExpression()) + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/customClassMutableCollection.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/customClassMutableCollection.fir.kt index 135766e6c25..c618ef42da2 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/customClassMutableCollection.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/customClassMutableCollection.fir.kt @@ -23,8 +23,8 @@ fun bar(): String? = null fun foo() { var x = A() - x.add(null) - x.add(bar()) + x.add(null) + x.add(bar()) x.add("") val b1: Collection = x diff --git a/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/customClassMutableList.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/customClassMutableList.fir.kt index edb7211f022..4eeba726c46 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/customClassMutableList.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/customClassMutableList.fir.kt @@ -23,8 +23,8 @@ fun bar(): String? = null fun foo() { var x = A() - x.add(null) - x.add(bar()) + x.add(null) + x.add(bar()) x.add("") x[0] = null diff --git a/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/sets.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/sets.fir.kt index 4ef593c4b3b..30efd868dc0 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/sets.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/sets.fir.kt @@ -35,8 +35,8 @@ fun fooTreeSet() { fun fooLinkedHashSet() { var x = LinkedHashSet() - x.add(null) - x.add(bar()) + x.add(null) + x.add(bar()) x.add("") val b1: MutableSet = x diff --git a/compiler/testData/ir/irText/firProblems/ArrayListOverrides.fir.ir.txt b/compiler/testData/ir/irText/firProblems/ArrayListOverrides.fir.ir.txt index e6703a9d18c..191b8f626b1 100644 --- a/compiler/testData/ir/irText/firProblems/ArrayListOverrides.fir.ir.txt +++ b/compiler/testData/ir/irText/firProblems/ArrayListOverrides.fir.ir.txt @@ -166,11 +166,11 @@ FILE fqName: fileName:/ArrayListOverrides.kt overridden: public open fun hashCode (): kotlin.Int declared in java.util.ArrayList $this: VALUE_PARAMETER name: 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: 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: fileName:/ArrayListOverrides.kt overridden: public open fun hashCode (): kotlin.Int declared in java.util.ArrayList $this: VALUE_PARAMETER name: 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: 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 diff --git a/compiler/testData/ir/irText/firProblems/ArrayListOverrides.fir.sig.kt.txt b/compiler/testData/ir/irText/firProblems/ArrayListOverrides.fir.sig.kt.txt index 599660d10ec..783355910d9 100644 --- a/compiler/testData/ir/irText/firProblems/ArrayListOverrides.fir.sig.kt.txt +++ b/compiler/testData/ir/irText/firProblems/ArrayListOverrides.fir.sig.kt.txt @@ -51,10 +51,10 @@ class A1 : ArrayList { /* fake */ override operator fun contains(p0: @EnhancedNullability String): Boolean // CHECK JVM_IR: - // Mangled name: A1#containsAll(kotlin.collections.Collection){}kotlin.Boolean - // Public signature: /A1.containsAll|1049727718390523309[0] - // Public signature debug description: containsAll(kotlin.collections.Collection){}kotlin.Boolean - /* fake */ override fun containsAll(p0: Collection): Boolean + // Mangled name: A1#containsAll(kotlin.collections.Collection){}kotlin.Boolean + // Public signature: /A1.containsAll|3856626117350599597[0] + // Public signature debug description: containsAll(kotlin.collections.Collection){}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 { /* fake */ override operator fun contains(p0: @EnhancedNullability String): Boolean // CHECK JVM_IR: - // Mangled name: A2#containsAll(kotlin.collections.Collection){}kotlin.Boolean - // Public signature: /A2.containsAll|1049727718390523309[0] - // Public signature debug description: containsAll(kotlin.collections.Collection){}kotlin.Boolean - /* fake */ override fun containsAll(p0: Collection): Boolean + // Mangled name: A2#containsAll(kotlin.collections.Collection){}kotlin.Boolean + // Public signature: /A2.containsAll|3856626117350599597[0] + // Public signature debug description: containsAll(kotlin.collections.Collection){}kotlin.Boolean + /* fake */ override fun containsAll(p0: Collection<@EnhancedNullability String>): Boolean // CHECK: // Mangled name: A2#ensureCapacity(kotlin.Int){} diff --git a/compiler/testData/ir/irText/firProblems/MultiList.fir.ir.txt b/compiler/testData/ir/irText/firProblems/MultiList.fir.ir.txt index 197ba42897d..d0a589c5f72 100644 --- a/compiler/testData/ir/irText/firProblems/MultiList.fir.ir.txt +++ b/compiler/testData/ir/irText/firProblems/MultiList.fir.ir.txt @@ -205,7 +205,7 @@ FILE fqName: fileName:/MultiList.kt FUN FAKE_OVERRIDE name:containsAll visibility:public modality:OPEN <> ($this:kotlin.collections.List<.Some.SomeList>>, elements:kotlin.collections.Collection<.Some.SomeList>>) returnType:kotlin.Boolean [fake_override] overridden: public abstract fun containsAll (elements: kotlin.collections.Collection<.Some.MyList>>): kotlin.Boolean declared in .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: type:kotlin.collections.List<.Some.SomeList>> VALUE_PARAMETER name:elements index:0 type:kotlin.collections.Collection<.Some.SomeList>> FUN FAKE_OVERRIDE name:get visibility:public modality:OPEN <> ($this:kotlin.collections.List<.Some.SomeList>>, index:kotlin.Int) returnType:.Some.SomeList> [fake_override,operator] diff --git a/compiler/testData/ir/irText/stubs/builtinMap.fir.ir.txt b/compiler/testData/ir/irText/stubs/builtinMap.fir.ir.txt index 56da0611b8a..4a3f956f861 100644 --- a/compiler/testData/ir/irText/stubs/builtinMap.fir.ir.txt +++ b/compiler/testData/ir/irText/stubs/builtinMap.fir.ir.txt @@ -27,7 +27,7 @@ FILE fqName: fileName:/builtinMap.kt $receiver: VALUE_PARAMETER name:$this$apply type:java.util.LinkedHashMap<@[FlexibleNullability] K1 of .plus?, @[FlexibleNullability] V1 of .plus?> BLOCK_BODY TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit - CALL 'public open fun put (p0: @[FlexibleNullability] K of java.util.LinkedHashMap?, p1: @[FlexibleNullability] V of java.util.LinkedHashMap?): V of java.util.LinkedHashMap? declared in java.util.LinkedHashMap' type=V1 of .plus? origin=null + CALL 'public open fun put (p0: @[EnhancedNullability] K of java.util.LinkedHashMap, p1: @[EnhancedNullability] V of java.util.LinkedHashMap): V of java.util.LinkedHashMap? declared in java.util.LinkedHashMap' type=V1 of .plus? origin=null $this: GET_VAR '$this$apply: java.util.LinkedHashMap<@[FlexibleNullability] K1 of .plus?, @[FlexibleNullability] V1 of .plus?> declared in .plus.' type=java.util.LinkedHashMap<@[FlexibleNullability] K1 of .plus?, @[FlexibleNullability] V1 of .plus?> origin=null p0: CALL 'public final fun (): A of kotlin.Pair declared in kotlin.Pair' type=K1 of .plus origin=GET_PROPERTY $this: GET_VAR 'pair: kotlin.Pair.plus, V1 of .plus> declared in .plus' type=kotlin.Pair.plus, V1 of .plus> origin=null diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java index 9cb458356b2..2d4f48a3bb7 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java @@ -19287,6 +19287,12 @@ public class JvmAbiConsistencyTestBoxGenerated extends AbstractJvmAbiConsistency runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt"); } + @Test + @TestMetadata("javaInheritsKotlinIntersectionOverride.kt") + public void testJavaInheritsKotlinIntersectionOverride() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt"); + } + @Test @TestMetadata("kjkWithPackagePrivate.kt") public void testKjkWithPackagePrivate() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index aa364685a5f..3ce6d50701c 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -18453,6 +18453,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt"); } + @Test + @TestMetadata("javaInheritsKotlinIntersectionOverride.kt") + public void testJavaInheritsKotlinIntersectionOverride() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt"); + } + @Test @TestMetadata("kt49371.kt") public void testKt49371() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 39d2cf6ee53..030130175f7 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -19287,6 +19287,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt"); } + @Test + @TestMetadata("javaInheritsKotlinIntersectionOverride.kt") + public void testJavaInheritsKotlinIntersectionOverride() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt"); + } + @Test @TestMetadata("kjkWithPackagePrivate.kt") public void testKjkWithPackagePrivate() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index 9a6362ca440..305d7164f10 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -19287,6 +19287,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt"); } + @Test + @TestMetadata("javaInheritsKotlinIntersectionOverride.kt") + public void testJavaInheritsKotlinIntersectionOverride() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt"); + } + @Test @TestMetadata("kjkWithPackagePrivate.kt") public void testKjkWithPackagePrivate() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 7fa4d440cfa..1d331f1ad03 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -16069,6 +16069,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt"); } + @TestMetadata("javaInheritsKotlinIntersectionOverride.kt") + public void testJavaInheritsKotlinIntersectionOverride() throws Exception { + runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt"); + } + @TestMetadata("kjkWithPackagePrivate.kt") public void testKjkWithPackagePrivate() throws Exception { runTest("compiler/testData/codegen/box/fakeOverride/kjkWithPackagePrivate.kt");