[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.descriptors.Visibilities
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.* 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.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.chain import org.jetbrains.kotlin.fir.resolve.substitution.chain
@@ -241,21 +240,28 @@ class FirClassSubstitutionScope(
val fakeOverrideSubstitution = runIf(returnType == null) { FakeOverrideSubstitution(substitutor, original) } val fakeOverrideSubstitution = runIf(returnType == null) { FakeOverrideSubstitution(substitutor, original) }
val newReturnType = returnType?.substitute() val newReturnType = returnType?.substitute()
val newParameterTypes = member.getter.valueParameters.map { val newGetterParameterTypes = member.getter.valueParameters.map {
it.returnTypeRef.coneType.substitute() 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 original
} }
return FirFakeOverrideGenerator.createFakeOverrideAccessor( return FirFakeOverrideGenerator.createSubstitutionOverrideAccessor(
session, session,
member, member,
original, original,
dispatchReceiverTypeForSubstitutedMembers, dispatchReceiverTypeForSubstitutedMembers,
newReturnType, newReturnType,
newParameterTypes, newGetterParameterTypes,
newSetterParameterTypes,
fakeOverrideSubstitution 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.scopes.fakeOverrideSubstitution import org.jetbrains.kotlin.fir.scopes.fakeOverrideSubstitution
import org.jetbrains.kotlin.fir.symbols.CallableId 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.symbols.impl.*
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
@@ -408,24 +409,38 @@ object FirFakeOverrideGenerator {
return symbol return symbol
} }
fun createFakeOverrideAccessor( fun createSubstitutionOverrideAccessor(
session: FirSession, session: FirSession,
baseProperty: FirSyntheticProperty, baseProperty: FirSyntheticProperty,
baseSymbol: FirAccessorSymbol, baseSymbol: FirAccessorSymbol,
newDispatchReceiverType: ConeKotlinType?, newDispatchReceiverType: ConeKotlinType?,
newReturnType: ConeKotlinType?, newReturnType: ConeKotlinType?,
newParameterTypes: List<ConeKotlinType?>?, newGetterParameterTypes: List<ConeKotlinType?>?,
newSetterParameterTypes: List<ConeKotlinType?>?,
fakeOverrideSubstitution: FakeOverrideSubstitution? fakeOverrideSubstitution: FakeOverrideSubstitution?
): FirAccessorSymbol { ): FirAccessorSymbol {
val functionSymbol = FirNamedFunctionSymbol(baseSymbol.accessorId) val getterSymbol = FirNamedFunctionSymbol(baseSymbol.accessorId)
val function = createSubstitutionOverrideFunction( val getter = createSubstitutionOverrideFunction(
functionSymbol, getterSymbol,
session, session,
baseProperty.getter.delegate, baseProperty.getter.delegate,
newDispatchReceiverType, newDispatchReceiverType,
newReceiverType = null, newReceiverType = null,
newReturnType, 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, newTypeParameters = null,
fakeOverrideSubstitution = fakeOverrideSubstitution fakeOverrideSubstitution = fakeOverrideSubstitution
) )
@@ -433,7 +448,8 @@ object FirFakeOverrideGenerator {
this.session = session this.session = session
name = baseProperty.name name = baseProperty.name
symbol = FirAccessorSymbol(baseSymbol.callableId, baseSymbol.accessorId) symbol = FirAccessorSymbol(baseSymbol.callableId, baseSymbol.accessorId)
delegateGetter = function delegateGetter = getter
delegateSetter = setter
}.symbol }.symbol
} }
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// WITH_REFLECT // WITH_REFLECT