FIR: support private-in-file effective visibility

This commit is contained in:
Mikhail Glukhikh
2021-04-07 14:43:14 +03:00
parent 6ee169c01e
commit 9af1de272e
9 changed files with 31 additions and 26 deletions
@@ -13,18 +13,21 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
fun Visibility.toEffectiveVisibility(
ownerSymbol: FirClassLikeSymbol<*>?,
forClass: Boolean = false,
checkPublishedApi: Boolean = false
): EffectiveVisibility {
return toEffectiveVisibility(ownerSymbol?.toLookupTag(), checkPublishedApi)
return toEffectiveVisibility(ownerSymbol?.toLookupTag(), forClass, checkPublishedApi)
}
fun Visibility.toEffectiveVisibility(
owner: ConeClassLikeLookupTag?,
forClass: Boolean = false,
checkPublishedApi: Boolean = false
): EffectiveVisibility {
customEffectiveVisibility()?.let { return it }
return when (this.normalize()) {
Visibilities.Private, Visibilities.PrivateToThis, Visibilities.InvisibleFake -> EffectiveVisibility.PrivateInClass
Visibilities.PrivateToThis, Visibilities.InvisibleFake -> EffectiveVisibility.PrivateInClass
Visibilities.Private -> if (owner == null && forClass) EffectiveVisibility.PrivateInFile else EffectiveVisibility.PrivateInClass
Visibilities.Protected -> EffectiveVisibility.Protected(owner)
Visibilities.Internal -> when (!checkPublishedApi /*|| !owner.isPublishedApi()*/) { // TODO
true -> EffectiveVisibility.Internal
@@ -168,7 +168,9 @@ class FirStatusResolver(
containingClass is FirAnonymousObject -> EffectiveVisibility.Local
else -> EffectiveVisibility.Public
}
val selfEffectiveVisibility = visibility.toEffectiveVisibility(containingClass?.symbol?.toLookupTag())
val selfEffectiveVisibility = visibility.toEffectiveVisibility(
containingClass?.symbol?.toLookupTag(), forClass = declaration is FirClass<*>
)
val effectiveVisibility = parentEffectiveVisibility.lowerBound(selfEffectiveVisibility, session.typeContext)
return status.resolved(visibility, modality, effectiveVisibility)
}