FIR: Prettify visibility resolution for private constructors

This commit is contained in:
Denis.Zharkov
2021-02-20 13:35:36 +03:00
parent 9d7e40ad99
commit ace66b7179
@@ -137,7 +137,6 @@ class FirStatusResolver(
val visibility = when (status.visibility) { val visibility = when (status.visibility) {
Visibilities.Unknown -> when { Visibilities.Unknown -> when {
isLocal -> Visibilities.Local isLocal -> Visibilities.Local
declaration is FirConstructor && containingClass is FirAnonymousObject -> Visibilities.Private
else -> resolveVisibility(declaration, containingClass, overriddenStatuses) else -> resolveVisibility(declaration, containingClass, overriddenStatuses)
} }
else -> status.visibility else -> status.visibility
@@ -165,18 +164,19 @@ class FirStatusResolver(
containingClass: FirClass<*>?, containingClass: FirClass<*>?,
overriddenStatuses: List<FirResolvedDeclarationStatusImpl> overriddenStatuses: List<FirResolvedDeclarationStatusImpl>
): Visibility { ): Visibility {
if (declaration is FirConstructor && containingClass != null) { if (declaration is FirConstructor && containingClass?.hasPrivateConstructor() == true) return Visibilities.Private
val classKind = containingClass.classKind
if ((classKind == ClassKind.ENUM_CLASS || classKind == ClassKind.ENUM_ENTRY || containingClass.modality == Modality.SEALED)) {
return Visibilities.Private
}
}
return overriddenStatuses.map { it.visibility } return overriddenStatuses.map { it.visibility }
.maxWithOrNull { v1, v2 -> Visibilities.compare(v1, v2) ?: -1 } .maxWithOrNull { v1, v2 -> Visibilities.compare(v1, v2) ?: -1 }
?.normalize() ?.normalize()
?: Visibilities.Public ?: Visibilities.Public
} }
private fun FirClass<*>.hasPrivateConstructor(): Boolean {
val classKind = classKind
return classKind == ClassKind.ENUM_CLASS || classKind == ClassKind.ENUM_ENTRY || modality == Modality.SEALED || this is FirAnonymousObject
}
private fun resolveModality( private fun resolveModality(
declaration: FirDeclaration, declaration: FirDeclaration,
containingClass: FirClass<*>?, containingClass: FirClass<*>?,