diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index 7d83c511c76..ff4f9621d69 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -96,11 +96,11 @@ class Fir2IrClassifierStorage( internal fun preCacheTypeParameters(owner: FirTypeParameterRefsOwner, irOwnerSymbol: IrSymbol) { for ((index, typeParameter) in owner.typeParameters.withIndex()) { val original = typeParameter.symbol.fir - getCachedIrTypeParameter(original, index) + getCachedIrTypeParameter(original) ?: createIrTypeParameterWithoutBounds(original, index, irOwnerSymbol) if (owner is FirProperty && owner.isVar) { val context = ConversionTypeContext.DEFAULT.inSetter() - getCachedIrTypeParameter(original, index, context) + getCachedIrTypeParameter(original, context) ?: createIrTypeParameterWithoutBounds(original, index, irOwnerSymbol, context) } } @@ -429,27 +429,12 @@ class Fir2IrClassifierStorage( internal fun getCachedIrTypeParameter( typeParameter: FirTypeParameter, - index: Int = UNDEFINED_PARAMETER_INDEX, typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT ): IrTypeParameter? { - // Here transformation is a bit difficult because one FIR property type parameter - // can be transformed to two different type parameters: one for getter and another one for setter - val simpleCachedParameter = typeParameterCache[typeParameter] - if (simpleCachedParameter != null) { - if (typeContext.origin != ConversionTypeOrigin.SETTER) { - return simpleCachedParameter - } - if (index < 0) { - val parent = simpleCachedParameter.parent - if (parent !is IrSimpleFunction || parent.returnType == irBuiltIns.unitType) { - return simpleCachedParameter - } - } - } - if (typeContext.origin == ConversionTypeOrigin.SETTER) { - typeParameterCacheForSetter[typeParameter]?.let { return it } - } - return null + return if (typeContext.origin == ConversionTypeOrigin.SETTER) + typeParameterCacheForSetter[typeParameter] + else + typeParameterCache[typeParameter] } internal fun getIrTypeParameter( @@ -458,7 +443,7 @@ class Fir2IrClassifierStorage( ownerSymbol: IrSymbol, typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT ): IrTypeParameter { - getCachedIrTypeParameter(typeParameter, index, typeContext)?.let { return it } + getCachedIrTypeParameter(typeParameter, typeContext)?.let { return it } return typeParameter.run { val irTypeParameter = createIrTypeParameterWithoutBounds(typeParameter, index, ownerSymbol, typeContext) irTypeParameter.superTypes = bounds.map { it.toIrType() } @@ -592,7 +577,7 @@ class Fir2IrClassifierStorage( typeContext: ConversionTypeContext ): IrTypeParameterSymbol { val firTypeParameter = firTypeParameterSymbol.fir - return getCachedIrTypeParameter(firTypeParameter, typeContext = typeContext)?.symbol + return getCachedIrTypeParameter(firTypeParameter, typeContext)?.symbol // We can try to use default cache because setter can use parent type parameters ?: typeParameterCache[firTypeParameter]?.symbol ?: error("Cannot find cached type parameter by FIR symbol: ${firTypeParameterSymbol.name}") diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 74a3c021cd0..56dfa2e8fc8 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -7181,6 +7181,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt"); } + @Test + @TestMetadata("genericSetter.kt") + public void testGenericSetter() throws Exception { + runTest("compiler/testData/codegen/box/compileKotlinAgainstKotlin/genericSetter.kt"); + } + @Test @TestMetadata("importCompanion.kt") public void testImportCompanion() throws Exception { diff --git a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/genericSetter.kt b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/genericSetter.kt new file mode 100644 index 00000000000..e950798b5ec --- /dev/null +++ b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/genericSetter.kt @@ -0,0 +1,13 @@ +// MODULE: lib +// FILE: 1.kt +var T.prop: Int + get() = 33 + set(value) {} + +// MODULE: main(lib) +// FILE: 2.kt +fun setProp(t: T, v: Int) { + t.prop = v +} + +fun box() = "OK" \ No newline at end of file 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 0fd53fc7009..7756305fd70 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 @@ -7067,6 +7067,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt"); } + @Test + @TestMetadata("genericSetter.kt") + public void testGenericSetter() throws Exception { + runTest("compiler/testData/codegen/box/compileKotlinAgainstKotlin/genericSetter.kt"); + } + @Test @TestMetadata("importCompanion.kt") public void testImportCompanion() 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 e10fe278b87..427d04aba2c 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 @@ -7181,6 +7181,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt"); } + @Test + @TestMetadata("genericSetter.kt") + public void testGenericSetter() throws Exception { + runTest("compiler/testData/codegen/box/compileKotlinAgainstKotlin/genericSetter.kt"); + } + @Test @TestMetadata("importCompanion.kt") public void testImportCompanion() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmIrAgainstOldBoxTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmIrAgainstOldBoxTestGenerated.java index 9bc59dac3e3..3ac7275c4fa 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmIrAgainstOldBoxTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmIrAgainstOldBoxTestGenerated.java @@ -163,6 +163,12 @@ public class JvmIrAgainstOldBoxTestGenerated extends AbstractJvmIrAgainstOldBoxT runTest("compiler/testData/codegen/box/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt"); } + @Test + @TestMetadata("genericSetter.kt") + public void testGenericSetter() throws Exception { + runTest("compiler/testData/codegen/box/compileKotlinAgainstKotlin/genericSetter.kt"); + } + @Test @TestMetadata("importCompanion.kt") public void testImportCompanion() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmOldAgainstIrBoxTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmOldAgainstIrBoxTestGenerated.java index 26e2570ca13..4ddfad88c42 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmOldAgainstIrBoxTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/JvmOldAgainstIrBoxTestGenerated.java @@ -163,6 +163,12 @@ public class JvmOldAgainstIrBoxTestGenerated extends AbstractJvmOldAgainstIrBoxT runTest("compiler/testData/codegen/box/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt"); } + @Test + @TestMetadata("genericSetter.kt") + public void testGenericSetter() throws Exception { + runTest("compiler/testData/codegen/box/compileKotlinAgainstKotlin/genericSetter.kt"); + } + @Test @TestMetadata("importCompanion.kt") public void testImportCompanion() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index 4a1af212771..23eb534de27 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -5515,6 +5515,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest runTest("compiler/testData/codegen/box/compileKotlinAgainstKotlin/expectClassActualTypeAlias.kt"); } + @Test + @TestMetadata("genericSetter.kt") + public void testGenericSetter() throws Exception { + runTest("compiler/testData/codegen/box/compileKotlinAgainstKotlin/genericSetter.kt"); + } + @Test @TestMetadata("innerClassConstructor.kt") public void testInnerClassConstructor() throws Exception {