diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt index 3b07156d13a..808ddf6985e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.scopes.impl import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.declarations.builder.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.chain @@ -241,21 +240,28 @@ class FirClassSubstitutionScope( val fakeOverrideSubstitution = runIf(returnType == null) { FakeOverrideSubstitution(substitutor, original) } val newReturnType = returnType?.substitute() - val newParameterTypes = member.getter.valueParameters.map { + val newGetterParameterTypes = member.getter.valueParameters.map { it.returnTypeRef.coneType.substitute() } + val newSetterParameterTypes = member.setter?.valueParameters?.map { + it.returnTypeRef.coneType.substitute() + }.orEmpty() - if (newReturnType == null && newParameterTypes.all { it == null }) { + if (newReturnType == null && + newGetterParameterTypes.all { it == null } && + newSetterParameterTypes.all { it == null } + ) { return original } - return FirFakeOverrideGenerator.createFakeOverrideAccessor( + return FirFakeOverrideGenerator.createSubstitutionOverrideAccessor( session, member, original, dispatchReceiverTypeForSubstitutedMembers, newReturnType, - newParameterTypes, + newGetterParameterTypes, + newSetterParameterTypes, fakeOverrideSubstitution ) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt index bafb30a7d92..27b8d8f85f2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.scopes.FakeOverrideSubstitution import org.jetbrains.kotlin.fir.scopes.fakeOverrideSubstitution import org.jetbrains.kotlin.fir.symbols.CallableId +import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef @@ -408,24 +409,38 @@ object FirFakeOverrideGenerator { return symbol } - fun createFakeOverrideAccessor( + fun createSubstitutionOverrideAccessor( session: FirSession, baseProperty: FirSyntheticProperty, baseSymbol: FirAccessorSymbol, newDispatchReceiverType: ConeKotlinType?, newReturnType: ConeKotlinType?, - newParameterTypes: List?, + newGetterParameterTypes: List?, + newSetterParameterTypes: List?, fakeOverrideSubstitution: FakeOverrideSubstitution? ): FirAccessorSymbol { - val functionSymbol = FirNamedFunctionSymbol(baseSymbol.accessorId) - val function = createSubstitutionOverrideFunction( - functionSymbol, + val getterSymbol = FirNamedFunctionSymbol(baseSymbol.accessorId) + val getter = createSubstitutionOverrideFunction( + getterSymbol, session, baseProperty.getter.delegate, newDispatchReceiverType, newReceiverType = null, newReturnType, - newParameterTypes, + newGetterParameterTypes, + newTypeParameters = null, + fakeOverrideSubstitution = fakeOverrideSubstitution + ) + val setterSymbol = FirNamedFunctionSymbol(baseSymbol.accessorId) + val baseSetter = baseProperty.setter + val setter = if (baseSetter == null) null else createSubstitutionOverrideFunction( + setterSymbol, + session, + baseSetter.delegate, + newDispatchReceiverType, + newReceiverType = null, + StandardClassIds.Unit.constructClassLikeType(emptyArray(), isNullable = false), + newSetterParameterTypes, newTypeParameters = null, fakeOverrideSubstitution = fakeOverrideSubstitution ) @@ -433,7 +448,8 @@ object FirFakeOverrideGenerator { this.session = session name = baseProperty.name symbol = FirAccessorSymbol(baseSymbol.callableId, baseSymbol.accessorId) - delegateGetter = function + delegateGetter = getter + delegateSetter = setter }.symbol } diff --git a/compiler/testData/codegen/box/reflection/properties/overrideKotlinPropertyByJavaMethod.kt b/compiler/testData/codegen/box/reflection/properties/overrideKotlinPropertyByJavaMethod.kt index 90729d2180f..f413cb7f806 100644 --- a/compiler/testData/codegen/box/reflection/properties/overrideKotlinPropertyByJavaMethod.kt +++ b/compiler/testData/codegen/box/reflection/properties/overrideKotlinPropertyByJavaMethod.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT