[FIR] Fix missing REDUNDANT_VISIBILITY_MODIFIER

This commit is contained in:
Nikolay Lunyak
2021-09-24 16:48:51 +00:00
committed by Space
parent 7666377565
commit 9790b81f38
3 changed files with 26 additions and 5 deletions
@@ -171,3 +171,12 @@ FILE: RedundantVisibilityModifierChecker.kt
}
}
private final class Foo : R|kotlin/Any| {
public constructor(): R|Foo| {
super<R|kotlin/Any|>()
}
internal final fun barBarian(): R|kotlin/Unit| {
}
}
@@ -84,3 +84,7 @@ open class J {
get() = 3.1415926535
set(value) {}
}
private class Foo {
<!REDUNDANT_VISIBILITY_MODIFIER!>internal<!> fun barBarian() {}
}
@@ -20,10 +20,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.syntax.FirDeclarationSyntaxChe
import org.jetbrains.kotlin.fir.analysis.checkers.toVisibilityOrNull
import org.jetbrains.kotlin.fir.analysis.diagnostics.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass
import org.jetbrains.kotlin.fir.declarations.utils.isOverride
import org.jetbrains.kotlin.fir.declarations.utils.isSealed
import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.psi.KtDeclaration
@@ -51,7 +48,7 @@ object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<Fi
val redundantVisibility = when {
explicitVisibility == implicitVisibility -> implicitVisibility
explicitVisibility == Visibilities.Internal && containingMemberDeclaration?.isLocalMember == true -> Visibilities.Internal
explicitVisibility.isEffectivelyHiddenBy(containingMemberDeclaration) -> explicitVisibility
else -> return
}
@@ -66,6 +63,17 @@ object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<Fi
reporter.reportOn(source, FirErrors.REDUNDANT_VISIBILITY_MODIFIER, context)
}
private fun Visibility?.isEffectivelyHiddenBy(declaration: FirMemberDeclaration?): Boolean {
val containerVisibility = declaration?.effectiveVisibility?.toVisibility() ?: return false
if (containerVisibility == Visibilities.Local && this == Visibilities.Internal) {
return true
}
val difference = this?.compareTo(containerVisibility) ?: return false
return difference > 0
}
private fun FirDeclaration.implicitVisibility(context: CheckerContext): Visibility {
return when {
this is FirPropertyAccessor && isSetter && status.isOverride -> this.visibility