From 60486478125a800d3dba567d34a9a6bc886e73d0 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 9 Aug 2018 12:53:09 +0300 Subject: [PATCH] For each parameter unused: support correctly it() case Related to KT-22068 --- .../ForEachParameterNotUsedInspection.kt | 11 +++++++---- .../forEachParameterNotUsed/.inspection | 1 + .../forEachParameterNotUsed/invoke.kt | 10 ++++++++++ .../LocalInspectionTestGenerated.java | 18 ++++++++++++++++++ 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 idea/testData/inspectionsLocal/forEachParameterNotUsed/.inspection create mode 100644 idea/testData/inspectionsLocal/forEachParameterNotUsed/invoke.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ForEachParameterNotUsedInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ForEachParameterNotUsedInspection.kt index 9da17def1ea..3235928fd98 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ForEachParameterNotUsedInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ForEachParameterNotUsedInspection.kt @@ -11,12 +11,13 @@ import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl.WithDestructuringDeclaration import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall import org.jetbrains.kotlin.idea.intentions.getCallableDescriptor import org.jetbrains.kotlin.idea.refactoring.getThisLabelName import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall +import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull class ForEachParameterNotUsedInspection : AbstractKotlinInspection() { @@ -59,10 +60,12 @@ class ForEachParameterNotUsedInspection : AbstractKotlinInspection() { if (element.children.isNotEmpty()) { element.acceptChildren(this) } else { - val bindingContext = element.analyze() - val resolvedCall = element.getResolvedCall(bindingContext) ?: return + val resolvedCall = element.resolveToCall() ?: return - used = resolvedCall.candidateDescriptor == descriptor + used = descriptor == when (resolvedCall) { + is VariableAsFunctionResolvedCall -> resolvedCall.variableCall.candidateDescriptor + else -> resolvedCall.candidateDescriptor + } } } } diff --git a/idea/testData/inspectionsLocal/forEachParameterNotUsed/.inspection b/idea/testData/inspectionsLocal/forEachParameterNotUsed/.inspection new file mode 100644 index 00000000000..5f7573cece0 --- /dev/null +++ b/idea/testData/inspectionsLocal/forEachParameterNotUsed/.inspection @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.inspections.ForEachParameterNotUsedInspection diff --git a/idea/testData/inspectionsLocal/forEachParameterNotUsed/invoke.kt b/idea/testData/inspectionsLocal/forEachParameterNotUsed/invoke.kt new file mode 100644 index 00000000000..d5e9f3613c0 --- /dev/null +++ b/idea/testData/inspectionsLocal/forEachParameterNotUsed/invoke.kt @@ -0,0 +1,10 @@ +// PROBLEM: none +// WITH_RUNTIME + +class My { + operator fun invoke() {} +} + +fun bar(my: List) { + my.forEach { it() } +} \ 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 9fa756f615c..0a5d8a0457d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -2161,6 +2161,24 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { } } + @TestMetadata("idea/testData/inspectionsLocal/forEachParameterNotUsed") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ForEachParameterNotUsed extends AbstractLocalInspectionTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInForEachParameterNotUsed() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/inspectionsLocal/forEachParameterNotUsed"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), TargetBackend.ANY, true); + } + + @TestMetadata("invoke.kt") + public void testInvoke() throws Exception { + runTest("idea/testData/inspectionsLocal/forEachParameterNotUsed/invoke.kt"); + } + } + @TestMetadata("idea/testData/inspectionsLocal/ImplicitNullableNothingType") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)