[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.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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+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.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
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
// WITH_REFLECT
|
// WITH_REFLECT
|
||||||
|
|||||||
Reference in New Issue
Block a user