diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt index b39723cf36f..669b9d25adf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.editor.Editor import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType import org.jetbrains.kotlin.builtins.isExtensionFunctionType import org.jetbrains.kotlin.builtins.isFunctionType +import org.jetbrains.kotlin.builtins.isSuspendFunctionType import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.analyze @@ -137,7 +138,8 @@ open class ConvertLambdaToReferenceIntention(text: String) : if (lambdaParent is KtLambdaArgument) { val outerCalleeDescriptor = lambdaParent.outerCalleeDescriptor() ?: return false val lambdaParameterType = outerCalleeDescriptor.valueParameters.lastOrNull()?.type - if (lambdaParameterType != null && lambdaParameterType.isFunctionType) { + if (lambdaParameterType?.isSuspendFunctionType == true) return false + if (lambdaParameterType?.isFunctionType == true) { // 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) diff --git a/idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter.kt b/idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter.kt new file mode 100644 index 00000000000..2595bbaa853 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter.kt @@ -0,0 +1,15 @@ +// IS_APPLICABLE: false + +fun coroutine(block: suspend () -> Unit) {} + +suspend fun testAction(obj: Any, action: suspend (Any) -> Unit) { + action(action) +} + +fun println(message: Any?) {} + +fun main() = coroutine { + testAction("OK") { + println(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 2e9e5db275c..fd695cf0434 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -4974,6 +4974,11 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/convertLambdaToReference/suspendFun.kt"); } + @TestMetadata("suspendFunctionParameter.kt") + public void testSuspendFunctionParameter() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter.kt"); + } + @TestMetadata("syntheticProperty.kt") public void testSyntheticProperty() throws Exception { runTest("idea/testData/intentions/convertLambdaToReference/syntheticProperty.kt");