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 ca46e0249f1..520c68f775b 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 @@ -30564,6 +30564,12 @@ public class LLFirBlackBoxCodegenBasedTestGenerated extends AbstractLLFirBlackBo runTest("compiler/testData/codegen/box/javaInterop/genericSamSmartcast.kt"); } + @Test + @TestMetadata("inheritanceWithWildcard.kt") + public void testInheritanceWithWildcard() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/inheritanceWithWildcard.kt"); + } + @Test @TestMetadata("javaInterfaceFieldDirectAccess.kt") public void testJavaInterfaceFieldDirectAccess() 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 da2c62db41b..46aba4adca0 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 @@ -30564,6 +30564,12 @@ public class LLFirReversedBlackBoxCodegenBasedTestGenerated extends AbstractLLFi runTest("compiler/testData/codegen/box/javaInterop/genericSamSmartcast.kt"); } + @Test + @TestMetadata("inheritanceWithWildcard.kt") + public void testInheritanceWithWildcard() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/inheritanceWithWildcard.kt"); + } + @Test @TestMetadata("javaInterfaceFieldDirectAccess.kt") public void testJavaInterfaceFieldDirectAccess() 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 68526944980..2cd3216f7c9 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 @@ -30169,6 +30169,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/javaInterop/genericSamSmartcast.kt"); } + @Test + @TestMetadata("inheritanceWithWildcard.kt") + public void testInheritanceWithWildcard() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/inheritanceWithWildcard.kt"); + } + @Test @TestMetadata("javaInterfaceFieldDirectAccess.kt") public void testJavaInterfaceFieldDirectAccess() 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 e6a3b38456a..fa6e52cf759 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 @@ -30169,6 +30169,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated runTest("compiler/testData/codegen/box/javaInterop/genericSamSmartcast.kt"); } + @Test + @TestMetadata("inheritanceWithWildcard.kt") + public void testInheritanceWithWildcard() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/inheritanceWithWildcard.kt"); + } + @Test @TestMetadata("javaInterfaceFieldDirectAccess.kt") public void testJavaInterfaceFieldDirectAccess() 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 860964d1ccc..e963474e9e9 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 @@ -30169,6 +30169,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/javaInterop/genericSamSmartcast.kt"); } + @Test + @TestMetadata("inheritanceWithWildcard.kt") + public void testInheritanceWithWildcard() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/inheritanceWithWildcard.kt"); + } + @Test @TestMetadata("javaInterfaceFieldDirectAccess.kt") public void testJavaInterfaceFieldDirectAccess() throws Exception { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt index 628e9724e65..d38e1408bab 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt @@ -262,7 +262,9 @@ interface IrTypeSystemContext : TypeSystemContext, TypeSystemCommonSuperTypesCon argument.type } else null - IrCapturedType(status, lowerType, argument, typeParameters[index]) + IrCapturedType( + status, lowerType, argument, typeParameters[index], SimpleTypeNullability.DEFINITELY_NOT_NULL, emptyList(), null + ) } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/impl/IrSimpleTypeImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/impl/IrSimpleTypeImpl.kt index 954fe5b5683..fa28847d093 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/impl/IrSimpleTypeImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/impl/IrSimpleTypeImpl.kt @@ -10,8 +10,10 @@ import org.jetbrains.kotlin.ir.symbols.FqNameEqualityChecker import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.* +import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.types.model.CaptureStatus import org.jetbrains.kotlin.utils.compactIfPossible abstract class IrAbstractSimpleType(kotlinType: KotlinType?) : IrSimpleType(kotlinType) { @@ -89,27 +91,60 @@ class IrSimpleTypeBuilder { var arguments: List = emptyList() var annotations: List = emptyList() var abbreviation: IrTypeAbbreviation? = null + + var captureStatus: CaptureStatus? = null + var capturedLowerType: IrType? = null + var capturedTypeConstructor: IrCapturedType.Constructor? = null } -fun IrSimpleType.toBuilder() = +fun IrSimpleType.toBuilder(): IrSimpleTypeBuilder = IrSimpleTypeBuilder().also { b -> b.kotlinType = originalKotlinType - b.classifier = classifier + if (this is IrCapturedType) { + b.captureStatus = captureStatus + b.capturedLowerType = lowerType + b.capturedTypeConstructor = constructor + } else { + b.classifier = classifier + } b.nullability = nullability b.arguments = arguments b.annotations = annotations b.abbreviation = abbreviation } -fun IrSimpleTypeBuilder.buildSimpleType() = - IrSimpleTypeImpl( - kotlinType, - classifier ?: throw AssertionError("Classifier not provided"), - nullability, - arguments.compactIfPossible(), - annotations.compactIfPossible(), - abbreviation - ) +fun IrSimpleTypeBuilder.buildSimpleType(): IrSimpleType = + if (classifier == null) { + check(captureStatus != null && capturedTypeConstructor != null) { + "Neither classifier nor captured type constructor is provided" + } + check(arguments.isEmpty()) { + "Arguments should be empty when creating a captured type: ${capturedTypeConstructor?.argument?.render()}" + } + IrCapturedType( + captureStatus!!, + capturedLowerType, + capturedTypeConstructor!!.argument, + capturedTypeConstructor!!.typeParameter, + nullability, + annotations.compactIfPossible(), + abbreviation, + ).apply { + constructor.initSuperTypes(capturedTypeConstructor!!.superTypes) + } + } else { + check(captureStatus == null && capturedTypeConstructor == null) { + "Both classifier and captured type constructor are provided" + } + IrSimpleTypeImpl( + kotlinType, + classifier ?: throw AssertionError("Classifier not provided"), + nullability, + arguments.compactIfPossible(), + annotations.compactIfPossible(), + abbreviation + ) + } fun IrSimpleTypeBuilder.buildTypeProjection(variance: Variance): IrTypeProjection = if (variance == Variance.INVARIANT) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/impl/IrTypeBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/impl/IrTypeBase.kt index 66c3216b3fb..5a19bea689e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/impl/IrTypeBase.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/impl/IrTypeBase.kt @@ -71,7 +71,10 @@ class IrCapturedType( val captureStatus: CaptureStatus, val lowerType: IrType?, projection: IrTypeArgument, - typeParameter: IrTypeParameter + typeParameter: IrTypeParameter, + override val nullability: SimpleTypeNullability, + override val annotations: List, + override val abbreviation: IrTypeAbbreviation?, ) : IrSimpleType(null), CapturedTypeMarker { class Constructor(val argument: IrTypeArgument, val typeParameter: IrTypeParameter) : CapturedTypeConstructorMarker { var superTypes: List = emptyList() @@ -85,10 +88,8 @@ class IrCapturedType( val constructor: Constructor = Constructor(projection, typeParameter) override val classifier: IrClassifierSymbol get() = error("Captured Type does not have a classifier") + override val arguments: List get() = emptyList() - override val abbreviation: IrTypeAbbreviation? get() = null - override val nullability: SimpleTypeNullability get() = SimpleTypeNullability.DEFINITELY_NOT_NULL - override val annotations: List get() = emptyList() override fun equals(other: Any?): Boolean = this === other diff --git a/compiler/testData/codegen/box/javaInterop/inheritanceWithWildcard.kt b/compiler/testData/codegen/box/javaInterop/inheritanceWithWildcard.kt new file mode 100644 index 00000000000..834b8f0db7f --- /dev/null +++ b/compiler/testData/codegen/box/javaInterop/inheritanceWithWildcard.kt @@ -0,0 +1,28 @@ +// TARGET_BACKEND: JVM +// IGNORE_LIGHT_ANALYSIS +// FILE: A.java + +interface A { + X foo(); + + interface X {} +} + +interface B extends A { + @Override + Y foo(); + + interface Y extends X {} +} + +class BImpl implements B { + @Override + public Y foo() { return null; } +} + +// FILE: 1.kt + +private class D : A, BImpl() + +fun box(): String = + if (D().foo() == null) "OK" else "Fail" 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 e4c2292fde7..e6c9762289b 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 @@ -28471,6 +28471,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/javaInterop/genericSamSmartcast.kt"); } + @Test + @TestMetadata("inheritanceWithWildcard.kt") + public void testInheritanceWithWildcard() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/inheritanceWithWildcard.kt"); + } + @Test @TestMetadata("javaOuterClassDependsOnInner.kt") public void testJavaOuterClassDependsOnInner() 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 d41fc8ef676..cae19489e18 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 @@ -30169,6 +30169,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/javaInterop/genericSamSmartcast.kt"); } + @Test + @TestMetadata("inheritanceWithWildcard.kt") + public void testInheritanceWithWildcard() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/inheritanceWithWildcard.kt"); + } + @Test @TestMetadata("javaInterfaceFieldDirectAccess.kt") public void testJavaInterfaceFieldDirectAccess() 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 d5532e78f87..f210836b159 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 @@ -30169,6 +30169,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/javaInterop/genericSamSmartcast.kt"); } + @Test + @TestMetadata("inheritanceWithWildcard.kt") + public void testInheritanceWithWildcard() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/inheritanceWithWildcard.kt"); + } + @Test @TestMetadata("javaInterfaceFieldDirectAccess.kt") public void testJavaInterfaceFieldDirectAccess() 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 9ee0f9ec9e8..a40bbda2e0e 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -25530,6 +25530,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/javaInterop/genericSamSmartcast.kt"); } + @TestMetadata("inheritanceWithWildcard.kt") + public void testInheritanceWithWildcard() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/inheritanceWithWildcard.kt"); + } + @TestMetadata("javaInterfaceFieldDirectAccess.kt") public void testJavaInterfaceFieldDirectAccess() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/javaInterfaceFieldDirectAccess.kt");