From f7a69d4aa7e3a4a47f4e6280dd2afed3cfbd4949 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Mon, 2 Mar 2020 10:22:27 +0900 Subject: [PATCH] Convert lambda to reference: suggest on lambda argument for suspend function parameter #KT-34378 Fixed --- .../idea/intentions/ConvertLambdaToReferenceIntention.kt | 7 ++++--- .../convertLambdaToReference/suspendFunctionParameter2.kt | 7 +++++++ .../suspendFunctionParameter2.kt.after | 7 +++++++ .../kotlin/idea/intentions/IntentionTestGenerated.java | 5 +++++ 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter2.kt create mode 100644 idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter2.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt index ee5bfa99000..2a63d9f94d6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt @@ -72,19 +72,20 @@ open class ConvertLambdaToReferenceIntention(textGetter: () -> String) : SelfTar val calleeDescriptor = context[REFERENCE_TARGET, calleeReferenceExpression] as? CallableMemberDescriptor ?: return false val lambdaParameterType = lambdaExpression.lambdaParameterType(context) - if (lambdaParameterType?.isSuspendFunctionType == true) return false if (lambdaParameterType?.isExtensionFunctionType == true) { if (explicitReceiver != null && explicitReceiver !is KtThisExpression) return false val receiver = calleeDescriptor.dispatchReceiverParameter ?: calleeDescriptor.extensionReceiverParameter if (lambdaParameterType.getReceiverTypeFromFunctionType() != receiver?.type) return false } + val lambdaParameterIsSuspend = lambdaParameterType?.isSuspendFunctionType == true + val calleeFunctionIsSuspend = (calleeDescriptor as? FunctionDescriptor)?.isSuspend == true + if (lambdaParameterIsSuspend && !calleeFunctionIsSuspend || !lambdaParameterIsSuspend && calleeFunctionIsSuspend) return false + // No references with type parameters if (calleeDescriptor.typeParameters.isNotEmpty()) return false // No references to Java synthetic properties if (calleeDescriptor is SyntheticJavaPropertyDescriptor) return false - // No suspend functions - if ((calleeDescriptor as? FunctionDescriptor)?.isSuspend == true) return false val descriptorHasReceiver = with(calleeDescriptor) { // No references to both member / extension diff --git a/idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter2.kt b/idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter2.kt new file mode 100644 index 00000000000..112f1f4df4a --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter2.kt @@ -0,0 +1,7 @@ +fun foo(a: suspend () -> Unit) {} + +suspend fun action() {} + +fun usage() { + foo { action() } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter2.kt.after b/idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter2.kt.after new file mode 100644 index 00000000000..3c2d3a61329 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter2.kt.after @@ -0,0 +1,7 @@ +fun foo(a: suspend () -> Unit) {} + +suspend fun action() {} + +fun usage() { + foo(::action) +} \ 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 2ca44193d51..550ff0610a6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -5165,6 +5165,11 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter.kt"); } + @TestMetadata("suspendFunctionParameter2.kt") + public void testSuspendFunctionParameter2() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/suspendFunctionParameter2.kt"); + } + @TestMetadata("syntheticProperty.kt") public void testSyntheticProperty() throws Exception { runTest("idea/testData/intentions/convertLambdaToReference/syntheticProperty.kt");