Skip to content

Commit

Permalink
Fix false positive with UnusedPrivateMember on parameter of a protect…
Browse files Browse the repository at this point in the history
…ed function
  • Loading branch information
cortinico committed Aug 6, 2021
1 parent 23ffe7c commit 1f9011a
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 1 deletion.
1 change: 1 addition & 0 deletions detekt-psi-utils/api/detekt-psi-utils.api
Expand Up @@ -105,6 +105,7 @@ public final class io/gitlab/arturbosch/detekt/rules/KtModifierListKt {
public static final fun isOpen (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;)Z
public static final fun isOperator (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;)Z
public static final fun isOverride (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;)Z
public static final fun isProtected (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;)Z
public static final fun isPublicNotOverridden (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;)Z
}

Expand Down
Expand Up @@ -30,3 +30,5 @@ fun KtModifierListOwner.isInline() = hasModifier(KtTokens.INLINE_KEYWORD)
fun KtModifierListOwner.isExpect() = hasModifier(KtTokens.EXPECT_KEYWORD)

fun KtModifierListOwner.isActual() = hasModifier(KtTokens.ACTUAL_KEYWORD)

fun KtModifierListOwner.isProtected() = hasModifier(KtTokens.PROTECTED_KEYWORD)
Expand Up @@ -42,6 +42,7 @@ import org.jetbrains.kotlin.psi.KtSecondaryConstructor
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.isPrivate
import org.jetbrains.kotlin.psi.psiUtil.isProtected
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.types.expressions.OperatorConventions
Expand Down Expand Up @@ -256,7 +257,7 @@ private class UnusedParameterVisitor(allowedNames: Regex) : UnusedMemberVisitor(

private fun KtNamedFunction.isAllowedToHaveUnusedParameters() =
isAbstract() || isOpen() || isOverride() || isOperator() || isMainFunction() || isExternal() ||
isExpect() || isActual()
isExpect() || isActual() || isProtected()
}

private class UnusedPropertyVisitor(allowedNames: Regex) : UnusedMemberVisitor(allowedNames) {
Expand Down
Expand Up @@ -128,6 +128,18 @@ class UnusedPrivateMemberSpec : Spek({
}
}

describe("protected functions") {

it("should not report parameters in protected functions") {
val code = """
open class Foo {
protected fun fee(bar: String) {}
}
""".trimIndent()
assertThat(subject.lint(code)).isEmpty()
}
}

describe("overridden functions") {

it("should not report parameters in not private functions") {
Expand Down

0 comments on commit 1f9011a

Please sign in to comment.