From 1bca314f04dd012a1af5bb315ed600f6cc8639eb Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Wed, 29 Jun 2022 13:42:13 +0900 Subject: [PATCH] [kotlin] Fix false positive "Receiver parameter is never used" with reified type parameter ^KTIJ-10490 Fixed closes https://github.com/JetBrains/intellij-community/pull/2070 GitOrigin-RevId: bc7a3937ced466edeba8331e8fbb10743a68c48d --- .../inspections/UnusedReceiverParameterInspection.kt | 9 +++++++++ .../idea/inspections/LocalInspectionTestGenerated.java | 10 ++++++++++ .../unusedReceiverParameter/reified.kt | 5 +++++ .../unusedReceiverParameter/reified.kt.after | 5 +++++ .../unusedReceiverParameter/reifiedWithClassLiteral.kt | 7 +++++++ 5 files changed, 36 insertions(+) create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedReceiverParameter/reified.kt create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedReceiverParameter/reified.kt.after create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedReceiverParameter/reifiedWithClassLiteral.kt diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt index 65442ada3a89..83b6fbd60f09 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.idea.refactoring.changeSignature.modify import org.jetbrains.kotlin.idea.refactoring.changeSignature.runChangeSignature import org.jetbrains.kotlin.idea.refactoring.explicateAsTextForReceiver import org.jetbrains.kotlin.idea.refactoring.getThisLabelName +import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.getThisReceiverOwner import org.jetbrains.kotlin.lexer.KtTokens @@ -40,6 +41,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode +import org.jetbrains.kotlin.utils.addToStdlib.safeAs class UnusedReceiverParameterInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { @@ -183,6 +185,13 @@ fun isUsageOfDescriptor(descriptor: DeclarationDescriptor, element: KtElement, c } if (element !is KtExpression) return false + + if (element is KtClassLiteralExpression) { + val typeParameter = element.receiverExpression?.mainReference?.resolve() as? KtTypeParameter + val typeParameterDescriptor = context[BindingContext.TYPE_PARAMETER, typeParameter] + if (descriptor.safeAs()?.typeParameters?.any { it == typeParameterDescriptor } == true) return true + } + return when (element) { is KtDestructuringDeclarationEntry -> { listOf { context[BindingContext.COMPONENT_RESOLVED_CALL, element] } diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 7f4973a3fd32..1f43f811eaf4 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -15954,6 +15954,16 @@ public abstract class LocalInspectionTestGenerated extends AbstractLocalInspecti public void testPropertyWithTypeParameterInClass2() throws Exception { runTest("testData/inspectionsLocal/unusedReceiverParameter/propertyWithTypeParameterInClass2.kt"); } + + @TestMetadata("reified.kt") + public void testReified() throws Exception { + runTest("testData/inspectionsLocal/unusedReceiverParameter/reified.kt"); + } + + @TestMetadata("reifiedWithClassLiteral.kt") + public void testReifiedWithClassLiteral() throws Exception { + runTest("testData/inspectionsLocal/unusedReceiverParameter/reifiedWithClassLiteral.kt"); + } } @RunWith(JUnit3RunnerWithInners.class) diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedReceiverParameter/reified.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedReceiverParameter/reified.kt new file mode 100644 index 000000000000..b4af40d283ff --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedReceiverParameter/reified.kt @@ -0,0 +1,5 @@ +inline fun T.testFun(t: T): String = t.toString() + +fun main() { + 5.testFun(5) +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedReceiverParameter/reified.kt.after b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedReceiverParameter/reified.kt.after new file mode 100644 index 000000000000..65bc1fa11a60 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedReceiverParameter/reified.kt.after @@ -0,0 +1,5 @@ +inline fun testFun(t: T): String = t.toString() + +fun main() { + testFun(5) +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedReceiverParameter/reifiedWithClassLiteral.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedReceiverParameter/reifiedWithClassLiteral.kt new file mode 100644 index 000000000000..59af9a796ef9 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedReceiverParameter/reifiedWithClassLiteral.kt @@ -0,0 +1,7 @@ +// PROBLEM: none +// WITH_STDLIB +inline fun T.testFun(): String = (T::class.java).name + +fun main() { + 5.testFun() +} \ No newline at end of file