diff --git a/idea/src/org/jetbrains/kotlin/idea/slicer/InflowSlicer.kt b/idea/src/org/jetbrains/kotlin/idea/slicer/InflowSlicer.kt index df86958eb40..de31abd6f91 100644 --- a/idea/src/org/jetbrains/kotlin/idea/slicer/InflowSlicer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/slicer/InflowSlicer.kt @@ -179,10 +179,17 @@ class InflowSlicer( } is ReceiverParameterDescriptor -> { + //TODO: handle non-extension receivers? val callable = accessedDescriptor.containingDeclaration as? CallableDescriptor ?: return - val callableDeclaration = callable.originalSource.getPsi() as? KtCallableDeclaration ?: return - //TODO: what about non-extensions? - callableDeclaration.receiverTypeReference?.passToProcessor() + when (val declaration = callable.originalSource.getPsi()) { + is KtFunctionLiteral -> { + declaration.passToProcessorAsValue(LambdaCallsBehaviour(ReceiverSliceProducer, behaviour)) + } + + is KtCallableDeclaration -> { + declaration.receiverTypeReference?.passToProcessor() + } + } } is ValueParameterDescriptor -> { diff --git a/idea/src/org/jetbrains/kotlin/idea/slicer/OutflowSlicer.kt b/idea/src/org/jetbrains/kotlin/idea/slicer/OutflowSlicer.kt index b54f4fdf919..7a14b9fa64e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/slicer/OutflowSlicer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/slicer/OutflowSlicer.kt @@ -150,17 +150,12 @@ class OutflowSlicer( } private fun processFunction(function: KtFunction) { + //TODO: CallSliceProducer in all cases if (function is KtConstructor<*> || function is KtNamedFunction && function.name != null) { processCalls(function, includeOverriders = false, sliceProducer = CallSliceProducer) - return + } else { + processCalls(function, false, SliceProducer.Trivial) } - - val funExpression = when (function) { - is KtFunctionLiteral -> function.parent as? KtLambdaExpression - is KtNamedFunction -> function - else -> null - } ?: return - funExpression.passToProcessor(LambdaCallsBehaviour(SliceProducer.Trivial, behaviour), forcedExpressionMode = true) } private fun processExtensionReceiver(declaration: KtCallableDeclaration, declarationWithBody: KtDeclarationWithBody) { @@ -178,7 +173,11 @@ class OutflowSlicer( } private fun processExpression(expression: KtExpression) { - expression.processPseudocodeUsages { pseudoValue, instruction -> + val expressionWithValue = when (expression) { + is KtFunctionLiteral -> expression.parent as KtLambdaExpression + else -> expression + } + expressionWithValue.processPseudocodeUsages { pseudoValue, instruction -> when (instruction) { is WriteValueInstruction -> { if (!processIfReceiverValue(instruction, pseudoValue)) { diff --git a/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt b/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt index 08dc6e9a144..a1c7b7e638b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt @@ -73,12 +73,7 @@ abstract class Slicer( includeOverriders: Boolean, sliceProducer: SliceProducer ) { - if (callable is KtFunctionLiteral) { - (callable.parent as KtLambdaExpression).passToProcessorAsValue(LambdaCallsBehaviour(sliceProducer, behaviour)) - return - } - - if (callable is KtFunction && callable.name == null) { + if (callable is KtFunctionLiteral || callable is KtFunction && callable.name == null) { callable.passToProcessorAsValue(LambdaCallsBehaviour(sliceProducer, behaviour)) return } diff --git a/idea/testData/slicer/inflow/extensionLambdaReceiver.kt b/idea/testData/slicer/inflow/extensionLambdaReceiver.kt new file mode 100644 index 00000000000..f7bfbf625bd --- /dev/null +++ b/idea/testData/slicer/inflow/extensionLambdaReceiver.kt @@ -0,0 +1,11 @@ +// FLOW: IN + +fun foo() { + with("A") { + val v = this + } +} + +inline fun with(receiver: T, block: T.() -> R): R { + return receiver.block() +} diff --git a/idea/testData/slicer/inflow/extensionLambdaReceiver.leafGroups.txt b/idea/testData/slicer/inflow/extensionLambdaReceiver.leafGroups.txt new file mode 100644 index 00000000000..75aca85c673 --- /dev/null +++ b/idea/testData/slicer/inflow/extensionLambdaReceiver.leafGroups.txt @@ -0,0 +1,8 @@ +4 with("A") { +5 val v = this +5 val v = this +4 [LAMBDA OUT] with("A") { +9 [LAMBDA OUT] inline fun with(receiver: T, block: T.() -> R): R { +10 return receiver.block() +9 inline fun with(receiver: T, block: T.() -> R): R { +4 with("A") { diff --git a/idea/testData/slicer/inflow/extensionLambdaReceiver.nullnessGroups.txt b/idea/testData/slicer/inflow/extensionLambdaReceiver.nullnessGroups.txt new file mode 100644 index 00000000000..dd20223c288 --- /dev/null +++ b/idea/testData/slicer/inflow/extensionLambdaReceiver.nullnessGroups.txt @@ -0,0 +1,3 @@ +[NotNull Values] +5 val v = this +5 val v = this diff --git a/idea/testData/slicer/inflow/extensionLambdaReceiver.results.txt b/idea/testData/slicer/inflow/extensionLambdaReceiver.results.txt new file mode 100644 index 00000000000..f3336d584b3 --- /dev/null +++ b/idea/testData/slicer/inflow/extensionLambdaReceiver.results.txt @@ -0,0 +1,7 @@ +5 val v = this +5 val v = this +4 [LAMBDA OUT] with("A") { +9 [LAMBDA OUT] inline fun with(receiver: T, block: T.() -> R): R { +10 return receiver.block() +9 inline fun with(receiver: T, block: T.() -> R): R { +4 with("A") { diff --git a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerLeafGroupingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerLeafGroupingTestGenerated.java index 1a7bb2b0937..97a697a15ff 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerLeafGroupingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerLeafGroupingTestGenerated.java @@ -118,6 +118,11 @@ public class SlicerLeafGroupingTestGenerated extends AbstractSlicerLeafGroupingT runTest("idea/testData/slicer/inflow/extensionLambdaParameter.kt"); } + @TestMetadata("extensionLambdaReceiver.kt") + public void testExtensionLambdaReceiver() throws Exception { + runTest("idea/testData/slicer/inflow/extensionLambdaReceiver.kt"); + } + @TestMetadata("funParamerer.kt") public void testFunParamerer() throws Exception { runTest("idea/testData/slicer/inflow/funParamerer.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerNullnessGroupingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerNullnessGroupingTestGenerated.java index ac4028e56d6..fab0949c929 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerNullnessGroupingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerNullnessGroupingTestGenerated.java @@ -118,6 +118,11 @@ public class SlicerNullnessGroupingTestGenerated extends AbstractSlicerNullnessG runTest("idea/testData/slicer/inflow/extensionLambdaParameter.kt"); } + @TestMetadata("extensionLambdaReceiver.kt") + public void testExtensionLambdaReceiver() throws Exception { + runTest("idea/testData/slicer/inflow/extensionLambdaReceiver.kt"); + } + @TestMetadata("funParamerer.kt") public void testFunParamerer() throws Exception { runTest("idea/testData/slicer/inflow/funParamerer.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java index c6b3c4fe23c..bde4ff07e78 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java @@ -130,6 +130,11 @@ public class SlicerTreeTestGenerated extends AbstractSlicerTreeTest { runTest("idea/testData/slicer/inflow/extensionLambdaParameter.kt"); } + @TestMetadata("extensionLambdaReceiver.kt") + public void testExtensionLambdaReceiver() throws Exception { + runTest("idea/testData/slicer/inflow/extensionLambdaReceiver.kt"); + } + @TestMetadata("funParamerer.kt") public void testFunParamerer() throws Exception { runTest("idea/testData/slicer/inflow/funParamerer.kt");