diff --git a/idea/src/org/jetbrains/kotlin/idea/slicer/InflowSlicer.kt b/idea/src/org/jetbrains/kotlin/idea/slicer/InflowSlicer.kt index 25076b957fb..6ee4059e5c2 100644 --- a/idea/src/org/jetbrains/kotlin/idea/slicer/InflowSlicer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/slicer/InflowSlicer.kt @@ -131,12 +131,20 @@ class InflowSlicer( if (function is KtFunction) { val sliceTransformer = ArgumentExpressionTransformer(parameterDescriptor) - if (function is KtFunctionLiteral) { - processFunctionLiteralCalls(function, sliceTransformer) - } else { - processCalls(function, analysisScope, includeOverriders) { usageInfo -> - usageInfo.element?.let { - sliceTransformer.extractArgumentExpression(it)?.passToProcessorAsValue() + when { + function is KtFunctionLiteral -> { + processFunctionLiteralCalls(function, sliceTransformer) + } + + function is KtNamedFunction && function.name == null -> { + processAnonymousFunctionCalls(function, sliceTransformer) + } + + else -> { + processCalls(function, analysisScope, includeOverriders) { usageInfo -> + usageInfo.element?.let { + sliceTransformer.extractArgumentExpression(it)?.passToProcessorAsValue() + } } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt b/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt index 5d262b0265e..2ea2b986a8f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt @@ -9,7 +9,6 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.intellij.psi.search.SearchScope import com.intellij.slicer.JavaSliceUsage -import com.intellij.slicer.SliceUsage import com.intellij.usageView.UsageInfo import com.intellij.util.containers.addIfNotNull import org.jetbrains.kotlin.cfg.pseudocode.Pseudocode @@ -70,10 +69,18 @@ abstract class Slicer( } protected fun processFunctionLiteralCalls( - callable: KtFunctionLiteral, + functionLiteral: KtFunctionLiteral, sliceTransformer: KotlinSliceUsageTransformer, ) { - (callable.parent as KtLambdaExpression).passToProcessorAsValue(LambdaCallsBehaviour(sliceTransformer, behaviour)) + (functionLiteral.parent as KtLambdaExpression).passToProcessorAsValue(LambdaCallsBehaviour(sliceTransformer, behaviour)) + } + + protected fun processAnonymousFunctionCalls( + function: KtNamedFunction, + sliceTransformer: KotlinSliceUsageTransformer, + ) { + require(function.name == null) + function.passToProcessorAsValue(LambdaCallsBehaviour(sliceTransformer, behaviour)) } protected fun processCalls( diff --git a/idea/testData/slicer/inflow/anonymousFunBodyExpression.leafGroups.txt b/idea/testData/slicer/inflow/anonymousFunBodyExpression.leafGroups.txt index 5cb6b36a859..c38e2483cdc 100644 --- a/idea/testData/slicer/inflow/anonymousFunBodyExpression.leafGroups.txt +++ b/idea/testData/slicer/inflow/anonymousFunBodyExpression.leafGroups.txt @@ -1,4 +1,4 @@ -8 val x = foo(fun(n: Int) = n) +4 return f(1) 8 val x = foo(fun(n: Int) = n) 8 val x = foo(fun(n: Int) = n) 3 fun foo(f: (Int) -> Int): Int { @@ -9,4 +9,7 @@ 8 val x = foo(fun(n: Int) = n) 8 val x = foo(fun(n: Int) = n) 8 val x = foo(fun(n: Int) = n) +8 [LAMBDA CALLS] val x = foo(fun(n: Int) = n) +3 [LAMBDA CALLS] fun foo(f: (Int) -> Int): Int { +4 return f(1) diff --git a/idea/testData/slicer/inflow/anonymousFunBodyExpression.results.txt b/idea/testData/slicer/inflow/anonymousFunBodyExpression.results.txt index 63de5c80af4..d8efe582cae 100644 --- a/idea/testData/slicer/inflow/anonymousFunBodyExpression.results.txt +++ b/idea/testData/slicer/inflow/anonymousFunBodyExpression.results.txt @@ -8,3 +8,6 @@ 8 val x = foo(fun(n: Int) = n) 8 val x = foo(fun(n: Int) = n) 8 val x = foo(fun(n: Int) = n) +8 [LAMBDA CALLS] val x = foo(fun(n: Int) = n) +3 [LAMBDA CALLS] fun foo(f: (Int) -> Int): Int { +4 return f(1) diff --git a/idea/testData/slicer/inflow/anonymousFunReturnExpression.leafGroups.txt b/idea/testData/slicer/inflow/anonymousFunReturnExpression.leafGroups.txt index 3ec330eaae2..672ee34b7f1 100644 --- a/idea/testData/slicer/inflow/anonymousFunReturnExpression.leafGroups.txt +++ b/idea/testData/slicer/inflow/anonymousFunReturnExpression.leafGroups.txt @@ -1,4 +1,4 @@ -8 val x = foo(fun(n: Int): Int { return n }) +4 return f(1) 8 val x = foo(fun(n: Int): Int { return n }) 8 val x = foo(fun(n: Int): Int { return n }) 3 fun foo(f: (Int) -> Int): Int { @@ -9,4 +9,7 @@ 8 val x = foo(fun(n: Int): Int { return n }) 8 val x = foo(fun(n: Int): Int { return n }) 8 val x = foo(fun(n: Int): Int { return n }) +8 [LAMBDA CALLS] val x = foo(fun(n: Int): Int { return n }) +3 [LAMBDA CALLS] fun foo(f: (Int) -> Int): Int { +4 return f(1) diff --git a/idea/testData/slicer/inflow/anonymousFunReturnExpression.results.txt b/idea/testData/slicer/inflow/anonymousFunReturnExpression.results.txt index f0685842c65..f32ddac45d1 100644 --- a/idea/testData/slicer/inflow/anonymousFunReturnExpression.results.txt +++ b/idea/testData/slicer/inflow/anonymousFunReturnExpression.results.txt @@ -8,3 +8,6 @@ 8 val x = foo(fun(n: Int): Int { return n }) 8 val x = foo(fun(n: Int): Int { return n }) 8 val x = foo(fun(n: Int): Int { return n }) +8 [LAMBDA CALLS] val x = foo(fun(n: Int): Int { return n }) +3 [LAMBDA CALLS] fun foo(f: (Int) -> Int): Int { +4 return f(1) diff --git a/idea/testData/slicer/inflow/anonymousFunctionParameter.kt b/idea/testData/slicer/inflow/anonymousFunctionParameter.kt new file mode 100644 index 00000000000..11303b5a073 --- /dev/null +++ b/idea/testData/slicer/inflow/anonymousFunctionParameter.kt @@ -0,0 +1,11 @@ +// FLOW: IN + +fun foo(f: (Int) -> Unit) { + f(1) +} + +fun test() { + foo(fun(value: Int) { + val v = value + }) +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/anonymousFunctionParameter.leafGroups.txt b/idea/testData/slicer/inflow/anonymousFunctionParameter.leafGroups.txt new file mode 100644 index 00000000000..ed09a376a8e --- /dev/null +++ b/idea/testData/slicer/inflow/anonymousFunctionParameter.leafGroups.txt @@ -0,0 +1,8 @@ +4 f(1) +9 val v = value +9 val v = value +8 foo(fun(value: Int) { +8 [LAMBDA CALLS] foo(fun(value: Int) { +3 [LAMBDA CALLS] fun foo(f: (Int) -> Unit) { +4 f(1) + diff --git a/idea/testData/slicer/inflow/anonymousFunctionParameter.nullnessGroups.txt b/idea/testData/slicer/inflow/anonymousFunctionParameter.nullnessGroups.txt new file mode 100644 index 00000000000..7ddd357b897 --- /dev/null +++ b/idea/testData/slicer/inflow/anonymousFunctionParameter.nullnessGroups.txt @@ -0,0 +1,3 @@ +[NotNull Values] +9 val v = value +9 val v = value diff --git a/idea/testData/slicer/inflow/anonymousFunctionParameter.results.txt b/idea/testData/slicer/inflow/anonymousFunctionParameter.results.txt new file mode 100644 index 00000000000..527b2743a3c --- /dev/null +++ b/idea/testData/slicer/inflow/anonymousFunctionParameter.results.txt @@ -0,0 +1,6 @@ +9 val v = value +9 val v = value +8 foo(fun(value: Int) { +8 [LAMBDA CALLS] foo(fun(value: Int) { +3 [LAMBDA CALLS] fun foo(f: (Int) -> Unit) { +4 f(1) diff --git a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerLeafGroupingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerLeafGroupingTestGenerated.java index 9938bcfa440..1a7bb2b0937 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerLeafGroupingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerLeafGroupingTestGenerated.java @@ -38,6 +38,11 @@ public class SlicerLeafGroupingTestGenerated extends AbstractSlicerLeafGroupingT runTest("idea/testData/slicer/inflow/anonymousFunBodyExpression.kt"); } + @TestMetadata("anonymousFunctionParameter.kt") + public void testAnonymousFunctionParameter() throws Exception { + runTest("idea/testData/slicer/inflow/anonymousFunctionParameter.kt"); + } + @TestMetadata("anonymousFunReturnExpression.kt") public void testAnonymousFunReturnExpression() throws Exception { runTest("idea/testData/slicer/inflow/anonymousFunReturnExpression.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerNullnessGroupingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerNullnessGroupingTestGenerated.java index f00f44ae364..ac4028e56d6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerNullnessGroupingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerNullnessGroupingTestGenerated.java @@ -38,6 +38,11 @@ public class SlicerNullnessGroupingTestGenerated extends AbstractSlicerNullnessG runTest("idea/testData/slicer/inflow/anonymousFunBodyExpression.kt"); } + @TestMetadata("anonymousFunctionParameter.kt") + public void testAnonymousFunctionParameter() throws Exception { + runTest("idea/testData/slicer/inflow/anonymousFunctionParameter.kt"); + } + @TestMetadata("anonymousFunReturnExpression.kt") public void testAnonymousFunReturnExpression() throws Exception { runTest("idea/testData/slicer/inflow/anonymousFunReturnExpression.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java index 44afd45066a..c6b3c4fe23c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java @@ -55,6 +55,11 @@ public class SlicerTreeTestGenerated extends AbstractSlicerTreeTest { runTest("idea/testData/slicer/inflow/anonymousFunReturnExpression.kt"); } + @TestMetadata("anonymousFunctionParameter.kt") + public void testAnonymousFunctionParameter() throws Exception { + runTest("idea/testData/slicer/inflow/anonymousFunctionParameter.kt"); + } + @TestMetadata("cast.kt") public void testCast() throws Exception { runTest("idea/testData/slicer/inflow/cast.kt");