[FIR] Fix redundant visibility checker
This commit is contained in:
committed by
Mikhail Glukhikh
parent
9b8128aaa8
commit
d96772444e
Vendored
+20
@@ -50,3 +50,23 @@ fun f() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
<!REDUNDANT_VISIBILITY_MODIFIER!>public<!> var baz = 0
|
<!REDUNDANT_VISIBILITY_MODIFIER!>public<!> var baz = 0
|
||||||
|
|
||||||
|
open class J {
|
||||||
|
protected val baz = 0
|
||||||
|
<!REDUNDANT_VISIBILITY_MODIFIER!>protected<!> get() = field * 2
|
||||||
|
var baf = 0
|
||||||
|
<!REDUNDANT_VISIBILITY_MODIFIER!>public<!> get() = 1
|
||||||
|
<!REDUNDANT_VISIBILITY_MODIFIER!>public<!> set(value) {
|
||||||
|
field = value
|
||||||
|
}
|
||||||
|
|
||||||
|
var buf = 0
|
||||||
|
private get() = 42
|
||||||
|
protected set(value) {
|
||||||
|
field = value
|
||||||
|
}
|
||||||
|
|
||||||
|
var bar = 0
|
||||||
|
get() = 3.1415926535
|
||||||
|
set(value) {}
|
||||||
|
}
|
||||||
|
|||||||
Vendored
+34
@@ -114,3 +114,37 @@ FILE: RedundantVisibilityModifierChecker.kt
|
|||||||
public final var baz: R|kotlin/Int| = Int(0)
|
public final var baz: R|kotlin/Int| = Int(0)
|
||||||
public get(): R|kotlin/Int|
|
public get(): R|kotlin/Int|
|
||||||
public set(value: R|kotlin/Int|): R|kotlin/Unit|
|
public set(value: R|kotlin/Int|): R|kotlin/Unit|
|
||||||
|
public open class J : R|kotlin/Any| {
|
||||||
|
public constructor(): R|J| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final val baz: R|kotlin/Int| = Int(0)
|
||||||
|
protected get(): R|kotlin/Int| {
|
||||||
|
^ this@R|/J|.F|/J.baz|.R|kotlin/Int.times|(Int(2))
|
||||||
|
}
|
||||||
|
|
||||||
|
public final var baf: R|kotlin/Int| = Int(0)
|
||||||
|
public get(): R|kotlin/Int| {
|
||||||
|
^ Int(1)
|
||||||
|
}
|
||||||
|
public set(value: R|kotlin/Int|): R|kotlin/Unit| {
|
||||||
|
this@R|/J|.F|/J.baf| = R|<local>/value|
|
||||||
|
}
|
||||||
|
|
||||||
|
public final var buf: R|kotlin/Int| = Int(0)
|
||||||
|
private get(): R|kotlin/Int| {
|
||||||
|
^ Int(42)
|
||||||
|
}
|
||||||
|
protected set(value: R|kotlin/Int|): R|kotlin/Unit| {
|
||||||
|
this@R|/J|.F|/J.buf| = R|<local>/value|
|
||||||
|
}
|
||||||
|
|
||||||
|
public final var bar: R|kotlin/Int| = Int(0)
|
||||||
|
public get(): R|kotlin/Int| {
|
||||||
|
^ Double(3.1415926535)
|
||||||
|
}
|
||||||
|
public set(value: R|kotlin/Int|): R|kotlin/Unit| {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
+23
-11
@@ -23,27 +23,30 @@ object RedundantVisibilityModifierChecker : FirBasicDeclarationChecker() {
|
|||||||
override val isExtended = true
|
override val isExtended = true
|
||||||
|
|
||||||
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
if (declaration is FirPropertyAccessor && declaration.isGetter) return
|
|
||||||
if (declaration !is FirMemberDeclaration) return
|
|
||||||
if (declaration is FirConstructor && declaration.source is FirFakeSourceElement<*>) return
|
if (declaration is FirConstructor && declaration.source is FirFakeSourceElement<*>) return
|
||||||
|
if (declaration.source is FirFakeSourceElement<*>) return
|
||||||
|
if (
|
||||||
|
declaration !is FirMemberDeclaration
|
||||||
|
&& !(declaration is FirPropertyAccessor
|
||||||
|
&& declaration.visibility == (context.containingDeclarations.last() as FirProperty).visibility)
|
||||||
|
) return
|
||||||
|
|
||||||
val modifierList = (declaration.source.getModifierList() as? FirPsiModifierList)?.modifierList ?: return
|
val modifierList = (declaration.source.getModifierList() as? FirPsiModifierList)?.modifierList ?: return
|
||||||
val visibilityModifier = modifierList.getVisibility()
|
val visibilityModifier = modifierList.getVisibility() ?: return
|
||||||
val implicitVisibility = declaration.implicitVisibility(context)
|
val implicitVisibility = declaration.implicitVisibility(context)
|
||||||
val containingMemberDeclaration = context.containingDeclarations.getOrNull(1) as? FirMemberDeclaration
|
val containingMemberDeclaration = context.findClosest<FirMemberDeclaration>()
|
||||||
|
|
||||||
val redundantVisibility = when {
|
val redundantVisibility = when {
|
||||||
visibilityModifier == implicitVisibility -> implicitVisibility
|
visibilityModifier == implicitVisibility -> implicitVisibility
|
||||||
visibilityModifier == Visibilities.INTERNAL
|
visibilityModifier == Visibilities.INTERNAL
|
||||||
&& containingMemberDeclaration?.visibility == Visibilities.PRIVATE
|
&& containingMemberDeclaration?.visibility == Visibilities.PRIVATE
|
||||||
|| declaration.visibility == Visibilities.INTERNAL -> Visibilities.INTERNAL
|
|| declaration.visibilityForDeclarationAndPropertyAccessor == Visibilities.INTERNAL -> Visibilities.INTERNAL
|
||||||
else -> null
|
else -> null
|
||||||
} ?: return
|
} ?: return
|
||||||
|
|
||||||
if (redundantVisibility == Visibilities.PUBLIC
|
if (redundantVisibility == Visibilities.PUBLIC
|
||||||
&& declaration is FirProperty
|
&& declaration is FirPropertyAccessor
|
||||||
&& declaration.isVar
|
&& declaration.source is FirFakeSourceElement<*>
|
||||||
&& declaration.setter?.visibility.let { it != null && it != Visibilities.PUBLIC }
|
|
||||||
) return
|
) return
|
||||||
|
|
||||||
val source = modifierList.visibilityModifier()?.toFirPsiSourceElement()
|
val source = modifierList.visibilityModifier()?.toFirPsiSourceElement()
|
||||||
@@ -52,8 +55,10 @@ object RedundantVisibilityModifierChecker : FirBasicDeclarationChecker() {
|
|||||||
|
|
||||||
private fun FirDeclaration.implicitVisibility(context: CheckerContext): Visibility {
|
private fun FirDeclaration.implicitVisibility(context: CheckerContext): Visibility {
|
||||||
return when {
|
return when {
|
||||||
this is FirPropertyAccessor && isSetter && status.isOverride -> {
|
this is FirPropertyAccessor && isSetter && status.isOverride -> this.visibility
|
||||||
this.visibility
|
|
||||||
|
this is FirPropertyAccessor -> {
|
||||||
|
context.findClosest<FirProperty>()?.visibility ?: Visibilities.DEFAULT_VISIBILITY
|
||||||
}
|
}
|
||||||
|
|
||||||
this is FirConstructor -> {
|
this is FirConstructor -> {
|
||||||
@@ -69,7 +74,7 @@ object RedundantVisibilityModifierChecker : FirBasicDeclarationChecker() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this is FirSimpleFunction
|
this is FirSimpleFunction
|
||||||
&& context.containingDeclarations.getOrNull(1) is FirClass<*>
|
&& context.containingDeclarations.last() is FirClass<*>
|
||||||
&& this.isOverride -> findFunctionVisibility(this, context)
|
&& this.isOverride -> findFunctionVisibility(this, context)
|
||||||
|
|
||||||
else -> Visibilities.DEFAULT_VISIBILITY
|
else -> Visibilities.DEFAULT_VISIBILITY
|
||||||
@@ -102,4 +107,11 @@ object RedundantVisibilityModifierChecker : FirBasicDeclarationChecker() {
|
|||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val FirDeclaration.visibilityForDeclarationAndPropertyAccessor
|
||||||
|
get() = when (this) {
|
||||||
|
is FirMemberDeclaration -> status.visibility
|
||||||
|
is FirPropertyAccessor -> status.visibility
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user