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.declarationsSearch.forEachOverridingElement
|
||||||
import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReadWriteAccessDetector
|
import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReadWriteAccessDetector
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||||
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.resolve.source.getPsi
|
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||||
|
|
||||||
class OutflowSlicer(
|
class OutflowSlicer(
|
||||||
@@ -69,19 +66,20 @@ class OutflowSlicer(
|
|||||||
//TODO: expect/actual
|
//TODO: expect/actual
|
||||||
|
|
||||||
val callable = variable.ownerFunction as? KtCallableDeclaration
|
val callable = variable.ownerFunction as? KtCallableDeclaration
|
||||||
|
val parameterIndex = variable.parameterIndex()
|
||||||
callable?.forEachOverridingElement(scope = analysisScope) { _, overridingMember ->
|
callable?.forEachOverridingElement(scope = analysisScope) { _, overridingMember ->
|
||||||
when (overridingMember) {
|
when (overridingMember) {
|
||||||
is KtCallableDeclaration -> {
|
is KtCallableDeclaration -> {
|
||||||
val parameters = overridingMember.valueParameters
|
val parameters = overridingMember.valueParameters
|
||||||
check(parameters.size == callable.valueParameters.size)
|
check(parameters.size == callable.valueParameters.size)
|
||||||
parameters[variable.parameterIndex()].passToProcessor()
|
parameters[parameterIndex].passToProcessor()
|
||||||
}
|
}
|
||||||
|
|
||||||
is PsiMethod -> {
|
is PsiMethod -> {
|
||||||
val parameters = overridingMember.parameterList.parameters
|
val parameters = overridingMember.parameterList.parameters
|
||||||
check(parameters.size == callable.valueParameters.size)
|
val shift = if (callable.receiverTypeReference != null) 1 else 0
|
||||||
parameters[variable.parameterIndex()].passToProcessor()
|
check(parameters.size == callable.valueParameters.size + shift)
|
||||||
processor.process(JavaSliceUsage.createRootUsage(parameters[variable.parameterIndex()], parentUsage.params))
|
processor.process(JavaSliceUsage.createRootUsage(parameters[parameterIndex + shift], parentUsage.params))
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {} // not supported
|
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");
|
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")
|
@TestMetadata("outflow/abstractMethodParameter1.kt")
|
||||||
public void testOutflow_AbstractMethodParameter1() throws Exception {
|
public void testOutflow_AbstractMethodParameter1() throws Exception {
|
||||||
runTest("idea/testData/slicer/outflow/abstractMethodParameter1.kt");
|
runTest("idea/testData/slicer/outflow/abstractMethodParameter1.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user