[FIR] Explicit API mode: No REDUNDANT_VISIBILITY_MODIFIER for public

- In explicit API mode, the `public` visibility modifier is not
  redundant unless a declaration is hidden by a container. The
  `REDUNDANT_VISIBILITY_MODIFIER` diagnostic is now not reported in such
  cases.

^KTIJ-24485 fixed
This commit is contained in:
Marco Pennekamp
2023-02-08 16:14:56 +01:00
committed by Space Team
parent 5909b191a5
commit e86c877733
7 changed files with 345 additions and 2 deletions
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.fir.analysis.checkers.extended
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.config.AnalysisFlags
import org.jetbrains.kotlin.config.ExplicitApiMode
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
@@ -121,11 +123,23 @@ object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<Fi
val explicitVisibility = element.source?.explicitVisibility
val isHidden = explicitVisibility.isEffectivelyHiddenBy(containingMemberDeclaration)
if (explicitVisibility != implicitVisibility && !isHidden) {
if (isHidden) {
reportElement(element, context, reporter)
return
}
// In explicit API mode, `public` is explicitly required.
val explicitApiMode = context.languageVersionSettings.getFlag(AnalysisFlags.explicitApiMode)
if (explicitApiMode != ExplicitApiMode.DISABLED && explicitVisibility == Visibilities.Public) {
return
}
if (explicitVisibility == implicitVisibility) {
reportElement(element, context, reporter)
}
}
private fun reportElement(element: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
reporter.reportOn(element.source, FirErrors.REDUNDANT_VISIBILITY_MODIFIER, context)
}