diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedEqualsInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedEqualsInspection.kt index 70c34346de9..0cee8460b2f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedEqualsInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedEqualsInspection.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.intentions.conventionNameCalls.isAnyEquals import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression import org.jetbrains.kotlin.util.OperatorNameConventions @@ -48,15 +49,14 @@ class UnusedEqualsInspection : AbstractKotlinInspection() { } } - override fun visitDotQualifiedExpression(expression: KtDotQualifiedExpression) { - super.visitDotQualifiedExpression(expression) + override fun visitCallExpression(expression: KtCallExpression) { + super.visitCallExpression(expression) - val callExpression = expression.selectorExpression as? KtCallExpression ?: return - val calleeExpression = callExpression.calleeExpression as? KtSimpleNameExpression ?: return + val calleeExpression = expression.calleeExpression as? KtSimpleNameExpression ?: return if (calleeExpression.getReferencedNameAsName() != OperatorNameConventions.EQUALS) return if (!expression.isAnyEquals()) return - reportIfNotUsedAsExpression(expression, calleeExpression) + reportIfNotUsedAsExpression(expression.getQualifiedExpressionForSelectorOrThis(), calleeExpression) } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ConventionUtils.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ConventionUtils.kt index 88d756967a3..8d257c75202 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ConventionUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ConventionUtils.kt @@ -16,14 +16,21 @@ package org.jetbrains.kotlin.idea.intentions.conventionNameCalls -import org.jetbrains.kotlin.idea.intentions.toResolvedCall -import org.jetbrains.kotlin.psi.KtDotQualifiedExpression +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -fun KtDotQualifiedExpression.isAnyEquals(): Boolean { - val resolvedCall = toResolvedCall(BodyResolveMode.PARTIAL) ?: return false - val overriddenDescriptors = resolvedCall.resultingDescriptor.findOriginalTopMostOverriddenDescriptors() +fun KtExpression.isAnyEquals(): Boolean { + val context = analyze(BodyResolveMode.PARTIAL) + val resolvedCall = getResolvedCall(context) ?: return false + return (resolvedCall.resultingDescriptor as? FunctionDescriptor)?.isAnyEquals() == true +} + +fun FunctionDescriptor.isAnyEquals(): Boolean { + val overriddenDescriptors = findOriginalTopMostOverriddenDescriptors() return overriddenDescriptors.any { it.fqNameUnsafe.asString() == "kotlin.Any.equals" } } \ No newline at end of file diff --git a/idea/testData/inspections/unusedEquals/inspectionData/expected.xml b/idea/testData/inspections/unusedEquals/inspectionData/expected.xml index 48fdc0cdea1..ec35ebfef25 100644 --- a/idea/testData/inspections/unusedEquals/inspectionData/expected.xml +++ b/idea/testData/inspections/unusedEquals/inspectionData/expected.xml @@ -97,4 +97,13 @@ Unused equals expression Unused equals expression + + + test.kt + 81 + light_idea_test_case + + Unused equals expression + Unused equals expression + diff --git a/idea/testData/inspections/unusedEquals/test.kt b/idea/testData/inspections/unusedEquals/test.kt index abbbe67fc01..558aed92fdf 100644 --- a/idea/testData/inspections/unusedEquals/test.kt +++ b/idea/testData/inspections/unusedEquals/test.kt @@ -75,6 +75,12 @@ fun foo9b() { consumer.ConsumerVoid { it.equals(null) } // not used } +fun myWith(it: Any?, f: Any?.() -> Unit) = it.f() + +fun foo9c() { + consumer.ConsumerVoid { myWith (it) { equals(null) }} // not used +} + class Test(val successCondition: (Int) -> Boolean) { fun pass(num: Int): Boolean = successCondition(num) }