Redundant overriding method: do not report when super method is not called

#KT-34959 Fixed
This commit is contained in:
Toshiaki Kameyama
2019-12-11 00:53:53 +09:00
committed by klunnii
parent 76ed09482f
commit a2bde2ffb2
3 changed files with 29 additions and 0 deletions
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities
@@ -58,8 +59,15 @@ class KotlinRedundantOverrideInspection : AbstractKotlinInspection(), CleanupLoc
val superCallElement = qualifiedExpression.selectorExpression as? KtCallElement ?: return
if (!isSameFunctionName(superCallElement, function)) return
if (!isSameArguments(superCallElement, function)) return
val context = function.analyze()
val functionDescriptor = context[BindingContext.FUNCTION, function]
val functionParams = functionDescriptor?.valueParameters.orEmpty()
val superCallFunctionParams = superCallElement.resolveToCall()?.resultingDescriptor?.valueParameters.orEmpty()
if (functionParams.size == superCallFunctionParams.size
&& functionParams.zip(superCallFunctionParams).any { it.first.type != it.second.type }
) return
if (function.hasDerivedProperty(functionDescriptor, context)) return
val overriddenDescriptors = functionDescriptor?.original?.overriddenDescriptors
if (overriddenDescriptors?.any { it is JavaMethodDescriptor && it.visibility == JavaDescriptorVisibilities.PACKAGE_VISIBILITY } == true) return
@@ -0,0 +1,16 @@
// PROBLEM: none
interface I {
fun foo(parent: String)
}
open class A {
open fun foo(parent: Any) {}
}
class B : A(), I {
override <caret>fun foo(parent: String) {
super.foo(parent)
}
}
@@ -8419,6 +8419,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
runTest("idea/testData/inspectionsLocal/redundantOverride/callDifferentSuperMethod.kt");
}
@TestMetadata("callDifferentSuperMethod2.kt")
public void testCallDifferentSuperMethod2() throws Exception {
runTest("idea/testData/inspectionsLocal/redundantOverride/callDifferentSuperMethod2.kt");
}
@TestMetadata("classAndInterface.kt")
public void testClassAndInterface() throws Exception {
runTest("idea/testData/inspectionsLocal/redundantOverride/classAndInterface.kt");