From 54962d5ec3199a05058ba761b45cde30a698305c Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Tue, 11 Jul 2023 14:52:49 +0200 Subject: [PATCH] K2: Simplify FirDeclarationsResolveTransformer.transformAccessor WithExpectedType mode was only needed to replace return type for the getter, so I made it explicit there After that, `resolutionMode` in `transformFunctionWithGivenSignature` became effectively constant --- .../FirDeclarationsResolveTransformer.kt | 34 +++++++------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 0a14bb01e8c..54bae84a512 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -482,22 +482,17 @@ open class FirDeclarationsResolveTransformer( ): Unit = whileAnalysing(session, accessor) { context.withPropertyAccessor(owner, accessor, components) { val propertyTypeRef = owner.returnTypeRef - if (accessor is FirDefaultPropertyAccessor || accessor.body == null) { - transformFunction(accessor, withExpectedType(propertyTypeRef)) - } else { - val returnTypeRef = accessor.returnTypeRef - val expectedReturnTypeRef = if (propertyTypeRef is FirResolvedTypeRef && returnTypeRef !is FirResolvedTypeRef) { - propertyTypeRef - } else { - returnTypeRef - } - val resolutionMode = if (owner.delegate == null || expectedReturnTypeRef.coneTypeSafe()?.isUnit == true) { - ResolutionMode.ContextIndependent - } else { - withExpectedType(expectedReturnTypeRef) - } - transformFunctionWithGivenSignature(accessor, resolutionMode) + // Currently, this condition might only be true for delegates, because if type is set explicitly for the property, + // it's been propagated to receivers in the RawFirBuilder + if (accessor.returnTypeRef is FirImplicitTypeRef && propertyTypeRef !is FirImplicitTypeRef) { + accessor.replaceReturnTypeRef(propertyTypeRef) + } + + if (accessor is FirDefaultPropertyAccessor || accessor.body == null) { + transformFunction(accessor, ResolutionMode.ContextIndependent) + } else { + transformFunctionWithGivenSignature(accessor) } } } @@ -630,18 +625,15 @@ open class FirDeclarationsResolveTransformer( } context.forFunctionBody(simpleFunction, components) { withFullBodyResolve { - transformFunctionWithGivenSignature(simpleFunction, ResolutionMode.ContextIndependent) + transformFunctionWithGivenSignature(simpleFunction) } } } } - private fun transformFunctionWithGivenSignature( - function: F, - resolutionMode: ResolutionMode, - ): F { + private fun transformFunctionWithGivenSignature(function: F): F { @Suppress("UNCHECKED_CAST") - val result = transformFunction(function, resolutionMode) as F + val result = transformFunction(function, ResolutionMode.ContextIndependent) as F val body = result.body if (result.returnTypeRef is FirImplicitTypeRef) {