KT-38003 works for Java implementations of extension method

This commit is contained in:
Valentin Kipyatkov
2020-04-08 16:59:18 +03:00
parent 84c9692332
commit 0b2aff4e70
5 changed files with 39 additions and 8 deletions
@@ -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
@@ -0,0 +1,6 @@
class JavaClass implements I {
@Override
public void foo(int receiver, Object p) {
System.out.println(p);
}
}
@@ -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(<caret>s)
}
@@ -0,0 +1,7 @@
14 1.foo(<bold>s</bold>)
4 fun Int.foo(<bold>p: Any</bold>)
3 public void foo(int receiver, Object <bold>p</bold>) {
4 System.out.println(<bold>p</bold>);
9 println(<bold>p</bold>) // this usage will be shown twice due to bug in Java implementation: https://youtrack.jetbrains.com/issue/IDEA-236958
8 override fun Int.foo(<bold>p: Any</bold>) {
9 DUPLICATE: println(<bold>p</bold>) // this usage will be shown twice due to bug in Java implementation: https://youtrack.jetbrains.com/issue/IDEA-236958
@@ -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");