[FIR] Properly infer published effective visibility for member declarations
This commit is contained in:
committed by
TeamCityServer
parent
f1bf3c0d5a
commit
3a34a2ca62
+18
-8
@@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user