diff --git a/idea/src/org/jetbrains/kotlin/idea/slicer/OutflowSlicer.kt b/idea/src/org/jetbrains/kotlin/idea/slicer/OutflowSlicer.kt index 0048d6de6b4..cf853051bfd 100644 --- a/idea/src/org/jetbrains/kotlin/idea/slicer/OutflowSlicer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/slicer/OutflowSlicer.kt @@ -7,7 +7,9 @@ package org.jetbrains.kotlin.idea.slicer import com.intellij.codeInsight.highlighting.ReadWriteAccessDetector.Access import com.intellij.psi.PsiElement +import com.intellij.psi.PsiMethod import com.intellij.psi.impl.light.LightMemberReference +import com.intellij.slicer.JavaSliceUsage import com.intellij.usageView.UsageInfo import org.jetbrains.kotlin.cfg.pseudocode.PseudoValue import org.jetbrains.kotlin.cfg.pseudocode.instructions.Instruction @@ -68,12 +70,21 @@ class OutflowSlicer( val callable = variable.ownerFunction as? KtCallableDeclaration callable?.forEachOverridingElement(scope = analysisScope) { _, overridingMember -> - //TODO: Java overriders - if (overridingMember is KtCallableDeclaration) { - val parameters = overridingMember.valueParameters - check(parameters.size == callable.valueParameters.size) - val overridingParameter = parameters[variable.parameterIndex()] - overridingParameter.passToProcessor() + when (overridingMember) { + is KtCallableDeclaration -> { + val parameters = overridingMember.valueParameters + check(parameters.size == callable.valueParameters.size) + parameters[variable.parameterIndex()].passToProcessor() + } + + is PsiMethod -> { + val parameters = overridingMember.parameterList.parameters + check(parameters.size == callable.valueParameters.size) + parameters[variable.parameterIndex()].passToProcessor() + processor.process(JavaSliceUsage.createRootUsage(parameters[variable.parameterIndex()], parentUsage.params)) + } + + else -> {} // not supported } true } diff --git a/idea/testData/slicer/outflow/abstractMethodParameter2.java b/idea/testData/slicer/outflow/abstractMethodParameter2.java new file mode 100644 index 00000000000..f6e7a03a833 --- /dev/null +++ b/idea/testData/slicer/outflow/abstractMethodParameter2.java @@ -0,0 +1,5 @@ +class JavaClass implements I { + public void foo(Object p) { + System.out.println(p); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/abstractMethodParameter2.kt b/idea/testData/slicer/outflow/abstractMethodParameter2.kt index 3fffa563be6..02fe493c93b 100644 --- a/idea/testData/slicer/outflow/abstractMethodParameter2.kt +++ b/idea/testData/slicer/outflow/abstractMethodParameter2.kt @@ -6,7 +6,7 @@ interface I { class C : I { override fun foo(p: Any) { - println(p) + println(p) // this usage will be shown twice due to bug in Java implementation: https://youtrack.jetbrains.com/issue/IDEA-236958 } } diff --git a/idea/testData/slicer/outflow/abstractMethodParameter2.results.txt b/idea/testData/slicer/outflow/abstractMethodParameter2.results.txt index 49ad20f93c9..b3d12bc7243 100644 --- a/idea/testData/slicer/outflow/abstractMethodParameter2.results.txt +++ b/idea/testData/slicer/outflow/abstractMethodParameter2.results.txt @@ -1,4 +1,7 @@ 14 i.foo(s) 4 fun foo(p: Any) +2 public void foo(Object p) { +3 System.out.println(p); +9 println(p) // this usage will be shown twice due to bug in Java implementation: https://youtrack.jetbrains.com/issue/IDEA-236958 8 override fun foo(p: Any) { -9 println(p) +9 DUPLICATE: println(p) // this usage will be shown twice due to bug in Java implementation: https://youtrack.jetbrains.com/issue/IDEA-236958