From 863e4afc7b748497134e3225820281ba45217e1a Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 31 Aug 2016 13:26:37 +0300 Subject: [PATCH] Convert lambda to reference: no more allowed for extension KFunction parameters #KT-13527 Fixed (cherry picked from commit 84c4ff7) --- .../intentions/ConvertLambdaToReferenceIntention.kt | 3 +++ .../convertLambdaToReference/argumentWithReceiver.kt | 11 +++++++++++ .../idea/intentions/IntentionTestGenerated.java | 6 ++++++ 3 files changed, 20 insertions(+) create mode 100644 idea/testData/intentions/convertLambdaToReference/argumentWithReceiver.kt 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");