diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt index 3b657372380..217481a0bfb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.resolve.BindingContext.FUNCTION import org.jetbrains.kotlin.resolve.BindingContext.REFERENCE_TARGET import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue +import org.jetbrains.kotlin.resolve.calls.model.VarargValueArgument import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy @@ -128,8 +129,9 @@ open class ConvertLambdaToReferenceIntention(text: String) : if (lambdaValueParameterDescriptors.size < explicitReceiverShift + callableExpression.valueArguments.size) return false val resolvedCall = callableExpression.getResolvedCall(context) ?: return false resolvedCall.valueArguments.entries.forEach { (valueParameter, resolvedArgument) -> - val argumentExpression = - resolvedArgument.arguments.singleOrNull()?.getArgumentExpression() as? KtNameReferenceExpression ?: return false + val argument = resolvedArgument.arguments.singleOrNull() ?: return false + if (resolvedArgument is VarargValueArgument && argument.getSpreadElement() == null) return false + val argumentExpression = argument.getArgumentExpression() as? KtNameReferenceExpression ?: return false val argumentTarget = context[REFERENCE_TARGET, argumentExpression] as? ValueParameterDescriptor ?: return false if (argumentTarget != lambdaValueParameterDescriptors[valueParameter.index + explicitReceiverShift]) return false } diff --git a/idea/testData/intentions/convertLambdaToReference/varargFunction.kt b/idea/testData/intentions/convertLambdaToReference/varargFunction.kt new file mode 100644 index 00000000000..adb97996699 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/varargFunction.kt @@ -0,0 +1,5 @@ +// IS_APPLICABLE: false +// WITH_RUNTIME +fun test(i: Int?): IntArray? { + return i?.let { intArrayOf(it) } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/varargFunction2.kt b/idea/testData/intentions/convertLambdaToReference/varargFunction2.kt new file mode 100644 index 00000000000..92bbc44a452 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/varargFunction2.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME +fun test(vararg i: Int): IntArray { + return i.let { double(*it) } +} + +fun double(vararg elements: Int): IntArray = elements.map { it * 2 }.toIntArray() \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/varargFunction2.kt.after b/idea/testData/intentions/convertLambdaToReference/varargFunction2.kt.after new file mode 100644 index 00000000000..58a192dd7c1 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/varargFunction2.kt.after @@ -0,0 +1,6 @@ +// WITH_RUNTIME +fun test(vararg i: Int): IntArray { + return i.let(::double) +} + +fun double(vararg elements: Int): IntArray = elements.map { it * 2 }.toIntArray() \ 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 e9f11d4a2a5..6528eb35547 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -5400,6 +5400,16 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/convertLambdaToReference/unwrap.kt"); } + @TestMetadata("varargFunction.kt") + public void testVarargFunction() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/varargFunction.kt"); + } + + @TestMetadata("varargFunction2.kt") + public void testVarargFunction2() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/varargFunction2.kt"); + } + @TestMetadata("wrongNamedOrder.kt") public void testWrongNamedOrder() throws Exception { runTest("idea/testData/intentions/convertLambdaToReference/wrongNamedOrder.kt");