diff --git a/idea/src/org/jetbrains/kotlin/idea/slicer/OutflowSlicer.kt b/idea/src/org/jetbrains/kotlin/idea/slicer/OutflowSlicer.kt index cf853051bfd..4ef558817c2 100644 --- a/idea/src/org/jetbrains/kotlin/idea/slicer/OutflowSlicer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/slicer/OutflowSlicer.kt @@ -19,10 +19,7 @@ import org.jetbrains.kotlin.idea.findUsages.handlers.SliceUsageProcessor import org.jetbrains.kotlin.idea.search.declarationsSearch.forEachOverridingElement import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReadWriteAccessDetector import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType -import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch -import org.jetbrains.kotlin.psi.psiUtil.isAncestor -import org.jetbrains.kotlin.psi.psiUtil.parameterIndex +import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.source.getPsi class OutflowSlicer( @@ -69,19 +66,20 @@ class OutflowSlicer( //TODO: expect/actual val callable = variable.ownerFunction as? KtCallableDeclaration + val parameterIndex = variable.parameterIndex() callable?.forEachOverridingElement(scope = analysisScope) { _, overridingMember -> when (overridingMember) { is KtCallableDeclaration -> { val parameters = overridingMember.valueParameters check(parameters.size == callable.valueParameters.size) - parameters[variable.parameterIndex()].passToProcessor() + parameters[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)) + val shift = if (callable.receiverTypeReference != null) 1 else 0 + check(parameters.size == callable.valueParameters.size + shift) + processor.process(JavaSliceUsage.createRootUsage(parameters[parameterIndex + shift], parentUsage.params)) } else -> {} // not supported diff --git a/idea/testData/slicer/outflow/abstractExtensionMethodParameter.java b/idea/testData/slicer/outflow/abstractExtensionMethodParameter.java new file mode 100644 index 00000000000..2a69eee7fdb --- /dev/null +++ b/idea/testData/slicer/outflow/abstractExtensionMethodParameter.java @@ -0,0 +1,6 @@ +class JavaClass implements I { + @Override + public void foo(int receiver, Object p) { + System.out.println(p); + } +} diff --git a/idea/testData/slicer/outflow/abstractExtensionMethodParameter.kt b/idea/testData/slicer/outflow/abstractExtensionMethodParameter.kt new file mode 100644 index 00000000000..56ac652ce39 --- /dev/null +++ b/idea/testData/slicer/outflow/abstractExtensionMethodParameter.kt @@ -0,0 +1,15 @@ +// FLOW: OUT + +interface I { + fun Int.foo(p: Any) +} + +class C1 : I { + override fun Int.foo(p: Any) { + println(p) // this usage will be shown twice due to bug in Java implementation: https://youtrack.jetbrains.com/issue/IDEA-236958 + } +} + +fun I.bar(s: String) { + 1.foo(s) +} diff --git a/idea/testData/slicer/outflow/abstractExtensionMethodParameter.results.txt b/idea/testData/slicer/outflow/abstractExtensionMethodParameter.results.txt new file mode 100644 index 00000000000..2975c1b0f4c --- /dev/null +++ b/idea/testData/slicer/outflow/abstractExtensionMethodParameter.results.txt @@ -0,0 +1,7 @@ +14 1.foo(s) +4 fun Int.foo(p: Any) +3 public void foo(int receiver, Object p) { +4 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 Int.foo(p: Any) { +9 DUPLICATE: 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/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java index d3a05b0ef88..6ec1820db63 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java @@ -348,6 +348,11 @@ public class SlicerTreeTestGenerated extends AbstractSlicerTreeTest { runTest("idea/testData/slicer/inflow/whenExpression.kt"); } + @TestMetadata("outflow/abstractExtensionMethodParameter.kt") + public void testOutflow_AbstractExtensionMethodParameter() throws Exception { + runTest("idea/testData/slicer/outflow/abstractExtensionMethodParameter.kt"); + } + @TestMetadata("outflow/abstractMethodParameter1.kt") public void testOutflow_AbstractMethodParameter1() throws Exception { runTest("idea/testData/slicer/outflow/abstractMethodParameter1.kt");