[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
This commit is contained in:
Toshiaki Kameyama
2022-06-29 18:06:13 +00:00
committed by intellij-monorepo-bot
parent cde816b277
commit 1bca314f04
5 changed files with 36 additions and 0 deletions
@@ -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<CallableDescriptor>()?.typeParameters?.any { it == typeParameterDescriptor } == true) return true
}
return when (element) {
is KtDestructuringDeclarationEntry -> {
listOf { context[BindingContext.COMPONENT_RESOLVED_CALL, element] }
@@ -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)
@@ -0,0 +1,5 @@
inline fun <reified T> <caret>T.testFun(t: T): String = t.toString()
fun main() {
5.testFun(5)
}
@@ -0,0 +1,5 @@
inline fun <reified T> testFun(t: T): String = t.toString()
fun main() {
testFun(5)
}
@@ -0,0 +1,7 @@
// PROBLEM: none
// WITH_STDLIB
inline fun <reified T> <caret>T.testFun(): String = (T::class.java).name
fun main() {
5.testFun()
}