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