[FIR] Store containingDeclarationSymbol for type parameters of substitution overrides

This commit is contained in:
Dmitriy Novozhilov
2022-02-22 12:46:20 +03:00
committed by teamcity
parent 1e925b5937
commit 35a2a6bcec
4 changed files with 56 additions and 42 deletions
@@ -118,10 +118,10 @@ class FakeOverrideGenerator(
declarationStorage::getCachedIrFunction,
declarationStorage::createIrFunction,
createFakeOverrideSymbol = { firFunction, callableSymbol ->
val symbol = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(callableSymbol, firClass.symbol.classId)
FirFakeOverrideGenerator.createSubstitutionOverrideFunction(
session, firFunction, callableSymbol,
session, symbol, firFunction,
newDispatchReceiverType = firClass.defaultType(),
derivedClassId = firClass.symbol.classId,
isExpect = (firClass as? FirRegularClass)?.isExpect == true
)
},
@@ -142,10 +142,10 @@ class FakeOverrideGenerator(
declarationStorage::getCachedIrProperty,
declarationStorage::createIrProperty,
createFakeOverrideSymbol = { firProperty, callableSymbol ->
val symbolForOverride = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(callableSymbol, firClass.symbol.classId)
FirFakeOverrideGenerator.createSubstitutionOverrideProperty(
session, firProperty, callableSymbol,
session, symbolForOverride, firProperty,
newDispatchReceiverType = firClass.defaultType(),
derivedClassId = firClass.symbol.classId,
isExpect = (firClass as? FirRegularClass)?.isExpect == true
)
},
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.resolve.substitution.chain
import org.jetbrains.kotlin.fir.scopes.FakeOverrideSubstitution
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.ensureResolved
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
@@ -125,8 +126,10 @@ class FirClassSubstitutionScope(
val member = original.fir
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
val symbolForOverride = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(original, newOwnerClassId)
val (newTypeParameters, newDispatchReceiverType, newReceiverType, newReturnType, newSubstitutor, fakeOverrideSubstitution) = createSubstitutedData(
member
member, symbolForOverride
)
val newParameterTypes = member.valueParameters.map {
it.returnTypeRef.coneType.substitute(newSubstitutor)
@@ -141,10 +144,9 @@ class FirClassSubstitutionScope(
if (original.dispatchReceiverType?.substitute(substitutor) != null) {
return FirFakeOverrideGenerator.createSubstitutionOverrideFunction(
session,
symbolForOverride,
member,
original,
newDispatchReceiverType ?: dispatchReceiverTypeForSubstitutedMembers,
derivedClassId = newOwnerClassId,
isExpect = makeExpect,
)
}
@@ -158,14 +160,13 @@ class FirClassSubstitutionScope(
@Suppress("UNCHECKED_CAST")
return FirFakeOverrideGenerator.createSubstitutionOverrideFunction(
session,
symbolForOverride,
member,
original,
newDispatchReceiverType ?: dispatchReceiverTypeForSubstitutedMembers,
newReceiverType,
newReturnType,
newParameterTypes,
newTypeParameters as List<FirTypeParameter>,
newOwnerClassId,
makeExpect,
fakeOverrideSubstitution
)
@@ -175,7 +176,8 @@ class FirClassSubstitutionScope(
if (substitutor == ConeSubstitutor.Empty) return original
val constructor = original.fir
val (newTypeParameters, _, _, newReturnType, newSubstitutor, fakeOverrideSubstitution) = createSubstitutedData(constructor)
val symbolForOverride = FirConstructorSymbol(original.callableId)
val (newTypeParameters, _, _, newReturnType, newSubstitutor, fakeOverrideSubstitution) = createSubstitutedData(constructor, symbolForOverride)
// If constructor has a dispatch receiver, it should be an inner class' constructor.
// It means that we need to substitute its dispatcher as every other type,
@@ -191,7 +193,7 @@ class FirClassSubstitutionScope(
}
return FirFakeOverrideGenerator.createCopyForFirConstructor(
FirConstructorSymbol(original.callableId),
symbolForOverride,
session,
constructor,
FirDeclarationOrigin.SubstitutionOverride,
@@ -209,8 +211,10 @@ class FirClassSubstitutionScope(
val member = original.fir
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
val symbolForOverride = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(original, newOwnerClassId)
val (newTypeParameters, newDispatchReceiverType, newReceiverType, newReturnType, _, fakeOverrideSubstitution) = createSubstitutedData(
member
member, symbolForOverride
)
if (newReceiverType == null &&
@@ -221,10 +225,9 @@ class FirClassSubstitutionScope(
if (original.dispatchReceiverType?.substitute(substitutor) != null) {
return FirFakeOverrideGenerator.createSubstitutionOverrideProperty(
session,
symbolForOverride,
member,
original,
newDispatchReceiverType ?: dispatchReceiverTypeForSubstitutedMembers,
derivedClassId = newOwnerClassId,
isExpect = makeExpect,
)
}
@@ -234,13 +237,12 @@ class FirClassSubstitutionScope(
@Suppress("UNCHECKED_CAST")
return FirFakeOverrideGenerator.createSubstitutionOverrideProperty(
session,
symbolForOverride,
member,
original,
newDispatchReceiverType ?: dispatchReceiverTypeForSubstitutedMembers,
newReceiverType,
newReturnType,
newTypeParameters as List<FirTypeParameter>,
newOwnerClassId,
makeExpect,
fakeOverrideSubstitution
)
@@ -255,11 +257,12 @@ class FirClassSubstitutionScope(
val fakeOverrideSubstitution: FakeOverrideSubstitution?
)
private fun createSubstitutedData(member: FirCallableDeclaration): SubstitutedData {
private fun createSubstitutedData(member: FirCallableDeclaration, symbolForOverride: FirBasedSymbol<*>): SubstitutedData {
member.ensureResolved(FirResolvePhase.TYPES)
val (newTypeParameters, substitutor) = FirFakeOverrideGenerator.createNewTypeParametersAndSubstitutor(
session,
member as FirTypeParameterRefsOwner,
symbolForOverride,
substitutor,
forceTypeParametersRecreation = dispatchReceiverTypeForSubstitutedMembers.lookupTag != member.dispatchReceiverClassOrNull()
)
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
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.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
@@ -31,27 +32,29 @@ import org.jetbrains.kotlin.utils.addToStdlib.runIf
object FirFakeOverrideGenerator {
fun createSubstitutionOverrideFunction(
session: FirSession,
symbolForSubstitutionOverride: FirNamedFunctionSymbol,
baseFunction: FirSimpleFunction,
baseSymbol: FirNamedFunctionSymbol,
newDispatchReceiverType: ConeSimpleKotlinType?,
newReceiverType: ConeKotlinType? = null,
newReturnType: ConeKotlinType? = null,
newParameterTypes: List<ConeKotlinType?>? = null,
newTypeParameters: List<FirTypeParameter>? = null,
derivedClassId: ClassId? = null,
isExpect: Boolean = baseFunction.isExpect,
fakeOverrideSubstitution: FakeOverrideSubstitution? = null
): FirNamedFunctionSymbol {
val symbol = if (derivedClassId == null) {
FirNamedFunctionSymbol(baseSymbol.callableId)
} else {
FirNamedFunctionSymbol(CallableId(derivedClassId, baseFunction.name))
}
createSubstitutionOverrideFunction(
symbol, session, baseFunction, newDispatchReceiverType, newReceiverType, newReturnType,
symbolForSubstitutionOverride, session, baseFunction, newDispatchReceiverType, newReceiverType, newReturnType,
newParameterTypes, newTypeParameters, isExpect, fakeOverrideSubstitution
)
return symbol
return symbolForSubstitutionOverride
}
fun createSymbolForSubstitutionOverride(baseSymbol: FirNamedFunctionSymbol, derivedClassId: ClassId? = null): FirNamedFunctionSymbol {
return if (derivedClassId == null) {
FirNamedFunctionSymbol(baseSymbol.callableId)
} else {
FirNamedFunctionSymbol(CallableId(derivedClassId, baseSymbol.callableId.callableName))
}
}
private fun createSubstitutionOverrideFunction(
@@ -112,7 +115,8 @@ object FirFakeOverrideGenerator {
dispatchReceiverType = newDispatchReceiverType
attributes = baseFunction.attributes.copy()
typeParameters += configureAnnotationsTypeParametersAndSignature(
session, baseFunction, newParameterTypes, newTypeParameters, newReceiverType, newReturnType, fakeOverrideSubstitution
session, baseFunction, newParameterTypes, newTypeParameters,
newReceiverType, newReturnType, fakeOverrideSubstitution, newSymbol
).filterIsInstance<FirTypeParameter>()
deprecation = baseFunction.deprecation
}
@@ -146,7 +150,8 @@ object FirFakeOverrideGenerator {
newTypeParameters,
newReceiverType = null,
newReturnType,
fakeOverrideSubstitution
fakeOverrideSubstitution,
fakeOverrideSymbol
)
dispatchReceiverType = newDispatchReceiverType
@@ -167,7 +172,8 @@ object FirFakeOverrideGenerator {
newTypeParameters: List<FirTypeParameterRef>?,
newReceiverType: ConeKotlinType?,
newReturnType: ConeKotlinType?,
fakeOverrideSubstitution: FakeOverrideSubstitution?
fakeOverrideSubstitution: FakeOverrideSubstitution?,
symbolForOverride: FirBasedSymbol<*>,
): List<FirTypeParameterRef> {
return when {
baseFunction.typeParameters.isEmpty() -> {
@@ -182,7 +188,7 @@ object FirFakeOverrideGenerator {
}
newTypeParameters == null -> {
val (copiedTypeParameters, substitutor) = createNewTypeParametersAndSubstitutor(
useSiteSession, baseFunction, ConeSubstitutor.Empty
useSiteSession, baseFunction, symbolForOverride, ConeSubstitutor.Empty
)
val copiedParameterTypes = baseFunction.valueParameters.map {
substitutor.substituteOrNull(it.returnTypeRef.coneType)
@@ -254,29 +260,31 @@ object FirFakeOverrideGenerator {
fun createSubstitutionOverrideProperty(
session: FirSession,
symbolForSubstitutionOverride: FirPropertySymbol,
baseProperty: FirProperty,
baseSymbol: FirPropertySymbol,
newDispatchReceiverType: ConeSimpleKotlinType?,
newReceiverType: ConeKotlinType? = null,
newReturnType: ConeKotlinType? = null,
newTypeParameters: List<FirTypeParameter>? = null,
derivedClassId: ClassId? = null,
isExpect: Boolean = baseProperty.isExpect,
fakeOverrideSubstitution: FakeOverrideSubstitution? = null
): FirPropertySymbol {
val symbol = if (derivedClassId == null) {
FirPropertySymbol(baseSymbol.callableId)
} else {
FirPropertySymbol(CallableId(derivedClassId, baseProperty.name))
}
createCopyForFirProperty(
symbol, baseProperty, session, FirDeclarationOrigin.SubstitutionOverride, isExpect,
symbolForSubstitutionOverride, baseProperty, session, FirDeclarationOrigin.SubstitutionOverride, isExpect,
newDispatchReceiverType, newTypeParameters, newReceiverType, newReturnType,
fakeOverrideSubstitution = fakeOverrideSubstitution
).apply {
originalForSubstitutionOverrideAttr = baseProperty
}
return symbol
return symbolForSubstitutionOverride
}
fun createSymbolForSubstitutionOverride(baseSymbol: FirPropertySymbol, derivedClassId: ClassId? = null): FirPropertySymbol {
return if (derivedClassId == null) {
FirPropertySymbol(baseSymbol.callableId)
} else {
FirPropertySymbol(CallableId(derivedClassId, baseSymbol.callableId.callableName))
}
}
fun createCopyForFirProperty(
@@ -333,7 +341,7 @@ object FirFakeOverrideGenerator {
}
newTypeParameters == null -> {
val (copiedTypeParameters, substitutor) = createNewTypeParametersAndSubstitutor(
useSiteSession, baseProperty, ConeSubstitutor.Empty
useSiteSession, baseProperty, symbol, ConeSubstitutor.Empty
)
val (copiedReceiverType, possibleReturnType) = substituteReceiverAndReturnType(
baseProperty, newReceiverType, newReturnType, substitutor
@@ -475,6 +483,7 @@ object FirFakeOverrideGenerator {
fun createNewTypeParametersAndSubstitutor(
useSiteSession: FirSession,
member: FirTypeParameterRefsOwner,
symbolForOverride: FirBasedSymbol<*>,
substitutor: ConeSubstitutor,
forceTypeParametersRecreation: Boolean = true
): Pair<List<FirTypeParameterRef>, ConeSubstitutor> {
@@ -491,6 +500,7 @@ object FirFakeOverrideGenerator {
variance = typeParameter.variance
isReified = typeParameter.isReified
annotations += typeParameter.annotations
containingDeclarationSymbol = symbolForOverride
}
}
@@ -133,12 +133,13 @@ private fun FirTypeAliasSymbol.findSAMConstructorForTypeAlias(
if (newReturnType == null && newParameterTypes.all { it == null }) return samConstructorForClass
val symbolForOverride = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(namedSymbol, expansionRegularClass.classId)
return FirFakeOverrideGenerator.createSubstitutionOverrideFunction(
session, samConstructorForClass, namedSymbol,
session, symbolForOverride, samConstructorForClass,
newDispatchReceiverType = null,
newReceiverType = null,
newReturnType, newParameterTypes, typeParameters,
expansionRegularClass.classId,
).fir
}