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