From 3a34a2ca6244b86a2202aafcdefedf343135bb62 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 30 Jun 2021 14:31:22 +0300 Subject: [PATCH] [FIR] Properly infer published effective visibility for member declarations --- .../resolve/transformers/FirStatusResolver.kt | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) 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 d165f4ac833..07c87fbaa70 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 @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.typeContext import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.coneTypeSafe import org.jetbrains.kotlin.name.StandardClassIds +import org.jetbrains.kotlin.utils.addToStdlib.runIf class FirStatusResolver( val session: FirSession, @@ -179,17 +180,26 @@ class FirStatusResolver( ) val effectiveVisibility = parentEffectiveVisibility.lowerBound(selfEffectiveVisibility, session.typeContext) val annotations = ((containingProperty ?: declaration) as? FirAnnotatedDeclaration)?.annotations ?: emptyList() - if (annotations.any { it.typeRef.coneTypeSafe()?.lookupTag?.classId == StandardClassIds.PublishedApi }) { - val publishedApiSelfEffectiveVisibility = visibility.toEffectiveVisibility( + + val hasPublishedApiAnnotation = annotations.any { + it.typeRef.coneTypeSafe()?.lookupTag?.classId == StandardClassIds.PublishedApi + } + + var selfPublishedEffectiveVisibility = runIf(hasPublishedApiAnnotation) { + visibility.toEffectiveVisibility( containingClass?.symbol?.toLookupTag(), forClass = declaration is FirClass, ownerIsPublishedApi = true ) - val parentPublishedEffectiveVisibility = when { - containingProperty != null -> containingProperty.publishedApiEffectiveVisibility - containingClass is FirRegularClass -> containingClass.publishedApiEffectiveVisibility - else -> null - } ?: parentEffectiveVisibility + } + var parentPublishedEffectiveVisibility = when { + containingProperty != null -> containingProperty.publishedApiEffectiveVisibility + containingClass is FirRegularClass -> containingClass.publishedApiEffectiveVisibility + else -> null + } + if (selfPublishedEffectiveVisibility != null || parentPublishedEffectiveVisibility != null) { + selfPublishedEffectiveVisibility = selfPublishedEffectiveVisibility ?: selfEffectiveVisibility + parentPublishedEffectiveVisibility = parentPublishedEffectiveVisibility ?: parentEffectiveVisibility declaration.publishedApiEffectiveVisibility = parentPublishedEffectiveVisibility.lowerBound( - publishedApiSelfEffectiveVisibility, + selfPublishedEffectiveVisibility, session.typeContext ) }