[FIR] Copy also synthetic setter during fake override generation
This commit is contained in:
+11
-5
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
+23
-7
@@ -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<ConeKotlinType?>?,
|
||||
newGetterParameterTypes: List<ConeKotlinType?>?,
|
||||
newSetterParameterTypes: List<ConeKotlinType?>?,
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// TARGET_BACKEND: JVM
|
||||
|
||||
// WITH_REFLECT
|
||||
|
||||
Reference in New Issue
Block a user