KT-38003 works for Java implementations of extension method
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user