[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:
+4
-7
@@ -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(
|
||||||
|
|||||||
+2
-6
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user