[FIR] Copy also synthetic setter during fake override generation

This commit is contained in:
Mikhail Glukhikh
2020-10-30 18:27:28 +03:00
parent 22fb620344
commit fb961f7070
3 changed files with 34 additions and 13 deletions
@@ -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
)
}
@@ -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,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// WITH_REFLECT