diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt index 2fa08066943..4c3318ae963 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt @@ -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 ) }, diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt index 2d9b2c62a8c..7f75fd128df 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt @@ -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, - 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, - 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() ) diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt index 1c21a9ed3b8..4cb81a78e86 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt @@ -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? = null, newTypeParameters: List? = 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() 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?, newReceiverType: ConeKotlinType?, newReturnType: ConeKotlinType?, - fakeOverrideSubstitution: FakeOverrideSubstitution? + fakeOverrideSubstitution: FakeOverrideSubstitution?, + symbolForOverride: FirBasedSymbol<*>, ): List { 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? = 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, ConeSubstitutor> { @@ -491,6 +500,7 @@ object FirFakeOverrideGenerator { variance = typeParameter.variance isReified = typeParameter.isReified annotations += typeParameter.annotations + containingDeclarationSymbol = symbolForOverride } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConstructorProcessing.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConstructorProcessing.kt index 7e9af153a52..9e618c62a1c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConstructorProcessing.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConstructorProcessing.kt @@ -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 }