From d5047bfa905563a7f9e8c6d9c6dfd817e98e6715 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 20 Sep 2023 14:09:41 +0200 Subject: [PATCH] [LL FIR] LLFirContractsLazyResolver: process synthetic properties correctly FirContractResolveTransformer under the hood calls ``` if (property is FirSyntheticProperty) { transformSimpleFunction(property.getter.delegate, data) } ```, so this leads to unsafe transformation of the original function ^KT-55750 --- .../transformers/LLFirContractsLazyResolver.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirContractsLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirContractsLazyResolver.kt index 04d2f656a5b..d7ab450e1c4 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirContractsLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirContractsLazyResolver.kt @@ -17,9 +17,11 @@ import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector import org.jetbrains.kotlin.fir.resolve.transformers.contracts.FirContractResolveTransformer +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef internal object LLFirContractsLazyResolver : LLFirLazyResolver(FirResolvePhase.CONTRACTS) { @@ -53,6 +55,20 @@ private class LLFirContractsTargetResolver( ) { override val transformer = FirContractResolveTransformer(session, scopeSession) + override fun doResolveWithoutLock(target: FirElementWithResolveState): Boolean { + if (target is FirSyntheticProperty) { + target.getter.delegate.lazyResolveToPhase(resolverPhase) + + performCustomResolveUnderLock(target) { + // just update phase + } + + return true + } + + return super.doResolveWithoutLock(target) + } + override fun doLazyResolveUnderLock(target: FirElementWithResolveState) { when (target) { is FirSimpleFunction -> {