diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt index e25432e2597..30351f741f0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.idea.inspections import com.intellij.codeInsight.FileModificationService -import com.intellij.codeInsight.daemon.impl.HighlightInfoType import com.intellij.codeInspection.* import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement @@ -18,6 +17,7 @@ import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithContent import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.core.isOverridable +import org.jetbrains.kotlin.idea.intentions.callExpression import org.jetbrains.kotlin.idea.isMainFunction import org.jetbrains.kotlin.idea.quickfix.RemoveUnusedFunctionParameterFix import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinChangeSignatureConfiguration @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier import org.jetbrains.kotlin.psi.typeRefHelpers.setReceiverTypeReference import org.jetbrains.kotlin.resolve.BindingContext @@ -49,7 +50,13 @@ class UnusedReceiverParameterInspection : AbstractKotlinInspection() { if (receiverTypeReference == null || receiverTypeReference.textRange.isEmpty) return if (callableDeclaration is KtProperty && callableDeclaration.accessors.isEmpty()) return - if (callableDeclaration is KtNamedFunction && !callableDeclaration.hasBody()) return + if (callableDeclaration is KtNamedFunction) { + if (!callableDeclaration.hasBody()) return + if (callableDeclaration.name == null) { + val parentQualified = callableDeclaration.getStrictParentOfType() + if (KtPsiUtil.deparenthesize(parentQualified?.callExpression?.calleeExpression) == callableDeclaration) return + } + } if (callableDeclaration.hasModifier(KtTokens.OVERRIDE_KEYWORD) || callableDeclaration.hasModifier(KtTokens.OPERATOR_KEYWORD) || diff --git a/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunction.kt b/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunction.kt new file mode 100644 index 00000000000..a40ba010450 --- /dev/null +++ b/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunction.kt @@ -0,0 +1,6 @@ +class A { + fun a() { + val f = fun A.() { + } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunction.kt.after b/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunction.kt.after new file mode 100644 index 00000000000..27ec3724fb5 --- /dev/null +++ b/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunction.kt.after @@ -0,0 +1,6 @@ +class A { + fun a() { + val f = fun() { + } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCall.kt b/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCall.kt new file mode 100644 index 00000000000..cb6c85187fc --- /dev/null +++ b/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCall.kt @@ -0,0 +1,6 @@ +class A { + fun a() { + (fun A.() { + })() + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCall.kt.after b/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCall.kt.after new file mode 100644 index 00000000000..cd9dd68d2e8 --- /dev/null +++ b/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCall.kt.after @@ -0,0 +1,6 @@ +class A { + fun a() { + (fun() { + })() + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCallWithReceiver.kt b/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCallWithReceiver.kt new file mode 100644 index 00000000000..86644a586e4 --- /dev/null +++ b/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCallWithReceiver.kt @@ -0,0 +1,7 @@ +// PROBLEM: none +class A { + fun a() { + this.(fun A.() { + })() + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCallWithReceiver2.kt b/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCallWithReceiver2.kt new file mode 100644 index 00000000000..379c3b2ec0d --- /dev/null +++ b/idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCallWithReceiver2.kt @@ -0,0 +1,7 @@ +// PROBLEM: none +class A + +fun test(a: A) { + a.(fun A.() { + })() +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index cd28e4eac7b..5fe9e53264c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -14250,6 +14250,26 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/inspectionsLocal/unusedReceiverParameter"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), null, true); } + @TestMetadata("anonymousFunction.kt") + public void testAnonymousFunction() throws Exception { + runTest("idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunction.kt"); + } + + @TestMetadata("anonymousFunctionCall.kt") + public void testAnonymousFunctionCall() throws Exception { + runTest("idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCall.kt"); + } + + @TestMetadata("anonymousFunctionCallWithReceiver.kt") + public void testAnonymousFunctionCallWithReceiver() throws Exception { + runTest("idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCallWithReceiver.kt"); + } + + @TestMetadata("anonymousFunctionCallWithReceiver2.kt") + public void testAnonymousFunctionCallWithReceiver2() throws Exception { + runTest("idea/testData/inspectionsLocal/unusedReceiverParameter/anonymousFunctionCallWithReceiver2.kt"); + } + @TestMetadata("companion.kt") public void testCompanion() throws Exception { runTest("idea/testData/inspectionsLocal/unusedReceiverParameter/companion.kt");