From 82fe86c003f0675790a6552500bf63de093743b6 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 1 Dec 2022 16:59:04 +0100 Subject: [PATCH] [FIR] fix lazy resolution contract violation in status resolve transformer Previously, there was issue with resolving statuses of properties' super declarations for anonymous/local classes. And this problem was hidden by calling lazyResolveToPhase(STATUS) which is a violation of lazy resolution contract as lazy resolution to status cannot be called from the status phase itself ^KT-54890 --- .../transformers/FirStatusResolveTransformer.kt | 11 ++++------- .../fir/resolve/transformers/FirStatusResolver.kt | 8 ++------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt index d9dfbdf810f..44ca71b6a06 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt @@ -16,11 +16,11 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.LocalClassesNavigationInfo import org.jetbrains.kotlin.fir.scopes.FirCompositeScope import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.toSymbol @@ -414,14 +414,11 @@ abstract class AbstractFirStatusResolveTransformer( ): FirStatement = whileAnalysing(property) { val overridden = statusResolver.getOverriddenProperties(property, containingClass) - val overriddenProperties = overridden.map { - it.lazyResolveToPhase(FirResolvePhase.STATUS) - it.status as FirResolvedDeclarationStatus - } + val overriddenProperties = overridden.map { it.status as FirResolvedDeclarationStatus } val overriddenSetters = overridden.mapNotNull { - it.setter?.lazyResolveToPhase(FirResolvePhase.STATUS) - it.setter?.status as? FirResolvedDeclarationStatus + val setter = it.setter ?: return@mapNotNull null + setter.status as FirResolvedDeclarationStatus } property.transformStatus( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt index 83b7ead2bbd..7ff6b2eddd1 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope -import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.types.Variance @@ -109,11 +108,8 @@ class FirStatusResolver( isLocal: Boolean, overriddenStatuses: List? = null, ): FirResolvedDeclarationStatus { - val statuses = overriddenStatuses ?: getOverriddenProperties(property, containingClass) - .map { - it.lazyResolveToPhase(FirResolvePhase.STATUS) - it.status as FirResolvedDeclarationStatus - } + val statuses = overriddenStatuses + ?: getOverriddenProperties(property, containingClass).map { it.status as FirResolvedDeclarationStatus } val status = property.applyExtensionTransformers { transformStatus(it, property, containingClass, isLocal) } return resolveStatus(property, status, containingClass, null, isLocal, statuses)