[FIR] Store containingDeclarationSymbol for type parameters of substitution overrides
This commit is contained in:
committed by
teamcity
parent
1e925b5937
commit
35a2a6bcec
+4
-4
@@ -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
|
||||
)
|
||||
},
|
||||
|
||||
+16
-13
@@ -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()
|
||||
)
|
||||
|
||||
+33
-23
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user