diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt index 768002d0733..5a749696453 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor import com.intellij.openapi.util.TextRange import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType +import org.jetbrains.kotlin.builtins.isExtensionFunctionType import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.analyze @@ -65,6 +66,8 @@ class ConvertLambdaToReferenceIntention : SelfTargetingOffsetIndependentIntentio val outerCalleeDescriptor = lambdaParent.outerCalleeDescriptor() ?: return false val lambdaParameterType = outerCalleeDescriptor.valueParameters.lastOrNull()?.type if (lambdaParameterType != null && lambdaParameterType.isFunctionType) { + // For lambda parameter with receiver, conversion is not allowed + if (lambdaParameterType.isExtensionFunctionType) return false // Special Unit case (non-Unit returning lambda is accepted here, but non-Unit returning reference is not) lambdaMustReturnUnit = getReturnTypeFromFunctionType(lambdaParameterType).isUnit() } diff --git a/idea/testData/intentions/convertLambdaToReference/argumentWithReceiver.kt b/idea/testData/intentions/convertLambdaToReference/argumentWithReceiver.kt new file mode 100644 index 00000000000..c8a64768e9e --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/argumentWithReceiver.kt @@ -0,0 +1,11 @@ +// IS_APPLICABLE: false + +fun callMe(s: String) { +} + +fun body(receiver: String.(String) -> Unit) { +} + +fun usage() { + body { callMe(it) } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index e97af3face1..9c04782c906 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -3883,6 +3883,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/convertLambdaToReference"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); } + @TestMetadata("argumentWithReceiver.kt") + public void testArgumentWithReceiver() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertLambdaToReference/argumentWithReceiver.kt"); + doTest(fileName); + } + @TestMetadata("constructor.kt") public void testConstructor() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertLambdaToReference/constructor.kt");