[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
This commit is contained in:
Ilya Kirillov
2022-12-01 16:59:04 +01:00
parent c899f6dae3
commit 82fe86c003
2 changed files with 6 additions and 13 deletions
@@ -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.resolve.transformers.body.resolve.LocalClassesNavigationInfo
import org.jetbrains.kotlin.fir.scopes.FirCompositeScope import org.jetbrains.kotlin.fir.scopes.FirCompositeScope
import org.jetbrains.kotlin.fir.scopes.FirScope 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.FirAnonymousObjectSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol 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.FirTypeRef
import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.types.toSymbol import org.jetbrains.kotlin.fir.types.toSymbol
@@ -414,14 +414,11 @@ abstract class AbstractFirStatusResolveTransformer(
): FirStatement = whileAnalysing(property) { ): FirStatement = whileAnalysing(property) {
val overridden = statusResolver.getOverriddenProperties(property, containingClass) val overridden = statusResolver.getOverriddenProperties(property, containingClass)
val overriddenProperties = overridden.map { val overriddenProperties = overridden.map { it.status as FirResolvedDeclarationStatus }
it.lazyResolveToPhase(FirResolvePhase.STATUS)
it.status as FirResolvedDeclarationStatus
}
val overriddenSetters = overridden.mapNotNull { val overriddenSetters = overridden.mapNotNull {
it.setter?.lazyResolveToPhase(FirResolvePhase.STATUS) val setter = it.setter ?: return@mapNotNull null
it.setter?.status as? FirResolvedDeclarationStatus setter.status as FirResolvedDeclarationStatus
} }
property.transformStatus( property.transformStatus(
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
@@ -109,11 +108,8 @@ class FirStatusResolver(
isLocal: Boolean, isLocal: Boolean,
overriddenStatuses: List<FirResolvedDeclarationStatus>? = null, overriddenStatuses: List<FirResolvedDeclarationStatus>? = null,
): FirResolvedDeclarationStatus { ): FirResolvedDeclarationStatus {
val statuses = overriddenStatuses ?: getOverriddenProperties(property, containingClass) val statuses = overriddenStatuses
.map { ?: getOverriddenProperties(property, containingClass).map { it.status as FirResolvedDeclarationStatus }
it.lazyResolveToPhase(FirResolvePhase.STATUS)
it.status as FirResolvedDeclarationStatus
}
val status = property.applyExtensionTransformers { transformStatus(it, property, containingClass, isLocal) } val status = property.applyExtensionTransformers { transformStatus(it, property, containingClass, isLocal) }
return resolveStatus(property, status, containingClass, null, isLocal, statuses) return resolveStatus(property, status, containingClass, null, isLocal, statuses)