diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt index 40e19dfc43e..5977a43edbe 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt @@ -258,12 +258,18 @@ class FirClassSubstitutionScope( } companion object { - private fun FirFunctionBuilder.configureAnnotationsAndParameters( + private fun FirFunctionBuilder.configureAnnotationsAndSignature( session: FirSession, baseFunction: FirFunction<*>, - newParameterTypes: List? + newParameterTypes: List?, + newReceiverType: ConeKotlinType? = null, + newReturnType: ConeKotlinType? = null ) { annotations += baseFunction.annotations + returnTypeRef = baseFunction.returnTypeRef.withReplacedConeType(newReturnType) + if (this is FirSimpleFunctionBuilder) { + receiverTypeRef = baseFunction.receiverTypeRef?.withReplacedConeType(newReceiverType) + } valueParameters += baseFunction.valueParameters.zip( newParameterTypes ?: List(baseFunction.valueParameters.size) { null } ) { valueParameter, newType -> @@ -283,15 +289,17 @@ class FirClassSubstitutionScope( } } - private fun FirFunctionBuilder.configureAnnotationsAndAllParameters( + private fun FirFunctionBuilder.configureAnnotationsTypeParametersAndSignature( session: FirSession, baseFunction: FirFunction<*>, newParameterTypes: List?, - newTypeParameters: List? + newTypeParameters: List?, + newReceiverType: ConeKotlinType? = null, + newReturnType: ConeKotlinType? = null ): List { return when { baseFunction.typeParameters.isEmpty() -> { - configureAnnotationsAndParameters(session, baseFunction, newParameterTypes) + configureAnnotationsAndSignature(session, baseFunction, newParameterTypes, newReceiverType, newReturnType) emptyList() } newTypeParameters == null -> { @@ -301,11 +309,21 @@ class FirClassSubstitutionScope( val copiedParameterTypes = baseFunction.valueParameters.map { substitutor.substituteOrNull(it.returnTypeRef.coneType) } - configureAnnotationsAndParameters(session, baseFunction, copiedParameterTypes) + val copiedReceiverType = newReceiverType?.let { + substitutor.substituteOrNull(it) + } ?: baseFunction.receiverTypeRef?.let { + substitutor.substituteOrNull(it.coneType) + } + val copiedReturnType = newReturnType?.let { + substitutor.substituteOrNull(it) + } ?: baseFunction.returnTypeRef.let { + substitutor.substituteOrNull(it.coneType) + } + configureAnnotationsAndSignature(session, baseFunction, copiedParameterTypes, copiedReceiverType, copiedReturnType) copiedTypeParameters } else -> { - configureAnnotationsAndParameters(session, baseFunction, newParameterTypes) + configureAnnotationsAndSignature(session, baseFunction, newParameterTypes, newReceiverType, newReturnType) newTypeParameters } } @@ -337,15 +355,13 @@ class FirClassSubstitutionScope( source = baseFunction.source this.session = session origin = FirDeclarationOrigin.FakeOverride - returnTypeRef = baseFunction.returnTypeRef.withReplacedReturnType(newReturnType) - receiverTypeRef = baseFunction.receiverTypeRef?.withReplacedConeType(newReceiverType) name = baseFunction.name status = baseFunction.status.withExpect(isExpect) symbol = fakeOverrideSymbol resolvePhase = baseFunction.resolvePhase - typeParameters += configureAnnotationsAndAllParameters( - session, baseFunction, newParameterTypes, newTypeParameters + typeParameters += configureAnnotationsTypeParametersAndSignature( + session, baseFunction, newParameterTypes, newTypeParameters, newReceiverType, newReturnType ).filterIsInstance() } } @@ -465,13 +481,14 @@ class FirClassSubstitutionScope( source = baseConstructor.source this.session = session origin = FirDeclarationOrigin.FakeOverride - returnTypeRef = baseConstructor.returnTypeRef.withReplacedReturnType(newReturnType) receiverTypeRef = baseConstructor.receiverTypeRef?.withReplacedConeType(null) status = baseConstructor.status.withExpect(isExpect) symbol = fakeOverrideSymbol resolvePhase = baseConstructor.resolvePhase - typeParameters += configureAnnotationsAndAllParameters(session, baseConstructor, newParameterTypes, newTypeParameters) + typeParameters += configureAnnotationsTypeParametersAndSignature( + session, baseConstructor, newParameterTypes, newTypeParameters, null, newReturnType + ) } } diff --git a/compiler/testData/ir/irText/firProblems/FirBuilder.fir.txt b/compiler/testData/ir/irText/firProblems/FirBuilder.fir.txt index 599b48151ce..05baacaf712 100644 --- a/compiler/testData/ir/irText/firProblems/FirBuilder.fir.txt +++ b/compiler/testData/ir/irText/firProblems/FirBuilder.fir.txt @@ -31,7 +31,7 @@ FILE fqName: fileName:/FirBuilder.kt BLOCK_BODY DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in .BaseConverter' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:DeclarationsConverter modality:FINAL visibility:public superTypes:[.BaseConverter]' - FUN FAKE_OVERRIDE name:withCapturedTypeParameters visibility:public modality:FINAL ($this:.BaseConverter, block:kotlin.Function0.DeclarationsConverter.withCapturedTypeParameters>) returnType:T of .BaseConverter.withCapturedTypeParameters [inline,fake_override] + FUN FAKE_OVERRIDE name:withCapturedTypeParameters visibility:public modality:FINAL ($this:.BaseConverter, block:kotlin.Function0.DeclarationsConverter.withCapturedTypeParameters>) returnType:T of .DeclarationsConverter.withCapturedTypeParameters [inline,fake_override] overridden: public final fun withCapturedTypeParameters (block: kotlin.Function0.BaseFirBuilder.withCapturedTypeParameters>): T of .BaseFirBuilder.withCapturedTypeParameters [inline] declared in .BaseFirBuilder TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?]