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");