[FIR] Properly infer published effective visibility for member declarations

This commit is contained in:
Dmitriy Novozhilov
2021-06-30 14:31:22 +03:00
committed by TeamCityServer
parent f1bf3c0d5a
commit 3a34a2ca62
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.coneTypeSafe import org.jetbrains.kotlin.fir.types.coneTypeSafe
import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.utils.addToStdlib.runIf
class FirStatusResolver( class FirStatusResolver(
val session: FirSession, val session: FirSession,
@@ -179,17 +180,26 @@ class FirStatusResolver(
) )
val effectiveVisibility = parentEffectiveVisibility.lowerBound(selfEffectiveVisibility, session.typeContext) val effectiveVisibility = parentEffectiveVisibility.lowerBound(selfEffectiveVisibility, session.typeContext)
val annotations = ((containingProperty ?: declaration) as? FirAnnotatedDeclaration)?.annotations ?: emptyList() val annotations = ((containingProperty ?: declaration) as? FirAnnotatedDeclaration)?.annotations ?: emptyList()
if (annotations.any { it.typeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag?.classId == StandardClassIds.PublishedApi }) {
val publishedApiSelfEffectiveVisibility = visibility.toEffectiveVisibility( val hasPublishedApiAnnotation = annotations.any {
it.typeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag?.classId == StandardClassIds.PublishedApi
}
var selfPublishedEffectiveVisibility = runIf(hasPublishedApiAnnotation) {
visibility.toEffectiveVisibility(
containingClass?.symbol?.toLookupTag(), forClass = declaration is FirClass, ownerIsPublishedApi = true containingClass?.symbol?.toLookupTag(), forClass = declaration is FirClass, ownerIsPublishedApi = true
) )
val parentPublishedEffectiveVisibility = when { }
containingProperty != null -> containingProperty.publishedApiEffectiveVisibility var parentPublishedEffectiveVisibility = when {
containingClass is FirRegularClass -> containingClass.publishedApiEffectiveVisibility containingProperty != null -> containingProperty.publishedApiEffectiveVisibility
else -> null containingClass is FirRegularClass -> containingClass.publishedApiEffectiveVisibility
} ?: parentEffectiveVisibility else -> null
}
if (selfPublishedEffectiveVisibility != null || parentPublishedEffectiveVisibility != null) {
selfPublishedEffectiveVisibility = selfPublishedEffectiveVisibility ?: selfEffectiveVisibility
parentPublishedEffectiveVisibility = parentPublishedEffectiveVisibility ?: parentEffectiveVisibility
declaration.publishedApiEffectiveVisibility = parentPublishedEffectiveVisibility.lowerBound( declaration.publishedApiEffectiveVisibility = parentPublishedEffectiveVisibility.lowerBound(
publishedApiSelfEffectiveVisibility, selfPublishedEffectiveVisibility,
session.typeContext session.typeContext
) )
} }