From 2239b9a98a510ed87b46fb6e615b86105d916250 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Wed, 5 Oct 2022 10:04:24 +0900 Subject: [PATCH] UnusedPrivateMember: fix false negative with named arguments --- .../detekt/rules/style/UnusedPrivateMember.kt | 5 ++- .../rules/style/UnusedPrivateMemberSpec.kt | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateMember.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateMember.kt index eaf21701784e..ee5effeed4f8 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateMember.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateMember.kt @@ -39,6 +39,7 @@ import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtPropertyDelegate import org.jetbrains.kotlin.psi.KtReferenceExpression import org.jetbrains.kotlin.psi.KtSecondaryConstructor +import org.jetbrains.kotlin.psi.KtValueArgumentName import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.isPrivate @@ -258,7 +259,9 @@ private class UnusedParameterVisitor(allowedNames: Regex) : UnusedMemberVisitor( } override fun visitReferenceExpression(expression: KtReferenceExpression) { - parameters.remove(expression.text.removeSurrounding("`")) + if (expression.parent !is KtValueArgumentName) { + parameters.remove(expression.text.removeSurrounding("`")) + } super.visitReferenceExpression(expression) } }) diff --git a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateMemberSpec.kt b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateMemberSpec.kt index 62812d702259..d28b1a150e5f 100644 --- a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateMemberSpec.kt +++ b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateMemberSpec.kt @@ -1648,4 +1648,36 @@ class UnusedPrivateMemberSpec(val env: KotlinCoreEnvironment) { assertThat(subject.lint(code)).hasSize(1).hasStartSourceLocation(6, 9) } } + + @Nested + inner class `parameter with the same name as a named argument #5373` { + @Test + fun `unused parameter`() { + val code = """ + fun foo(modifier: Int) { + bar(modifier = 1) + } + + fun bar(modifier: Int) { + println(modifier) + } + """.trimIndent() + assertThat(subject.compileAndLintWithContext(env, code)) + .hasSize(1).hasStartSourceLocation(1, 9) + } + + @Test + fun `used parameter`() { + val code = """ + fun foo(modifier: Int) { + bar(modifier = modifier) + } + + fun bar(modifier: Int) { + println(modifier) + } + """.trimIndent() + assertThat(subject.compileAndLintWithContext(env, code)).isEmpty() + } + } }