diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt index d9114285a6e..2d508f21d19 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt @@ -20,7 +20,10 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus import org.jetbrains.kotlin.fir.declarations.utils.* +import org.jetbrains.kotlin.fir.extensions.extensionService +import org.jetbrains.kotlin.fir.extensions.statusTransformerExtensions import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name @@ -39,7 +42,7 @@ internal class KtFirNamedClassOrObjectSymbol( override val modality: Modality get() = withValidityAssertion { - firSymbol.modality + firSymbol.optionallyResolvedStatus.modality ?: when (classKind) { // default modality KtClassKind.INTERFACE -> Modality.ABSTRACT else -> Modality.FINAL @@ -88,4 +91,21 @@ internal class KtFirNamedClassOrObjectSymbol( } override val symbolKind: KtSymbolKind get() = withValidityAssertion { getSymbolKind() } + + /** + * We can use [FirRegularClassSymbol.rawStatus] to avoid unnecessary resolve unless there are status transformers present. + * If they are present, we have to resort to [FirRegularClassSymbol.resolvedStatus] instead - otherwise we can observe incorrect status + * properties. + * + * TODO This optimization should become obsolete after KT-56551 is fixed. + */ + private val FirRegularClassSymbol.optionallyResolvedStatus: FirDeclarationStatus + get() = if (statusTransformersPresent) { + resolvedStatus + } else { + rawStatus + } + + private val statusTransformersPresent: Boolean + get() = analysisSession.useSiteSession.extensionService.statusTransformerExtensions.isNotEmpty() }