diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceSingleLineLetIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceSingleLineLetIntention.kt index 69180ddaec7..aa2af8ecdd7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceSingleLineLetIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceSingleLineLetIntention.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.bindingContextUtil.getReferenceTargets import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode @@ -202,7 +203,12 @@ class ReplaceSingleLineLetIntention : SelfTargetingOffsetIndependentIntention + + val callee = (callExpression.calleeExpression as? KtNameReferenceExpression)?.let { + val descriptor = variableDescriptorByName[it.getReferencedNameAsName()] + if (descriptor != null && it.getReferenceTargets(context).singleOrNull() == descriptor) listOf(it) else null + } ?: emptyList() + return callee + callExpression.valueArguments.flatMap { arg -> arg.collectDescendantsOfType().filter { val descriptor = variableDescriptorByName[it.getReferencedNameAsName()] descriptor != null && it.getResolvedCall(context)?.resultingDescriptor == descriptor diff --git a/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall.kt b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall.kt new file mode 100644 index 00000000000..c9d93942f60 --- /dev/null +++ b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall.kt @@ -0,0 +1,8 @@ +// WITH_RUNTIME +class A { + operator fun invoke() {} +} + +fun foo(a: A) { + a.let { it() } +} \ No newline at end of file diff --git a/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall.kt.after b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall.kt.after new file mode 100644 index 00000000000..f8e70f0c2e7 --- /dev/null +++ b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall.kt.after @@ -0,0 +1,8 @@ +// WITH_RUNTIME +class A { + operator fun invoke() {} +} + +fun foo(a: A) { + a() +} \ No newline at end of file diff --git a/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall2.kt b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall2.kt new file mode 100644 index 00000000000..3d77aeb7eba --- /dev/null +++ b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall2.kt @@ -0,0 +1,8 @@ +// WITH_RUNTIME +class A { + operator fun invoke() {} +} + +fun foo(a: A) { + a.let { b -> b() } +} \ No newline at end of file diff --git a/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall2.kt.after b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall2.kt.after new file mode 100644 index 00000000000..f8e70f0c2e7 --- /dev/null +++ b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall2.kt.after @@ -0,0 +1,8 @@ +// WITH_RUNTIME +class A { + operator fun invoke() {} +} + +fun foo(a: A) { + a() +} \ No newline at end of file diff --git a/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall3.kt b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall3.kt new file mode 100644 index 00000000000..6c80b7c6c32 --- /dev/null +++ b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall3.kt @@ -0,0 +1,8 @@ +// WITH_RUNTIME +class A { + operator fun invoke() {} +} + +fun foo(a: A) { + a.let { b -> b.invoke() } +} \ No newline at end of file diff --git a/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall3.kt.after b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall3.kt.after new file mode 100644 index 00000000000..aacb0eec881 --- /dev/null +++ b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall3.kt.after @@ -0,0 +1,8 @@ +// WITH_RUNTIME +class A { + operator fun invoke() {} +} + +fun foo(a: A) { + a.invoke() +} \ No newline at end of file diff --git a/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall4.kt b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall4.kt new file mode 100644 index 00000000000..e99b38d9f6c --- /dev/null +++ b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall4.kt @@ -0,0 +1,9 @@ +// IS_APPLICABLE: false +// WITH_RUNTIME +class A { + operator fun invoke(a: A, i: Int) {} +} + +fun foo(a: A) { + a.let { it(it, 1) } +} \ No newline at end of file diff --git a/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall5.kt b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall5.kt new file mode 100644 index 00000000000..a3743aa7468 --- /dev/null +++ b/idea/testData/intentions/replaceSingleLineLetIntention/invokeCall5.kt @@ -0,0 +1,9 @@ +// IS_APPLICABLE: false +// WITH_RUNTIME +class A { + operator fun invoke() {} +} + +fun foo(a: A) { + (1 to a).let { (i, b) -> b() } +} \ 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 c5e3bca984a..0442a9e76ce 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -15204,6 +15204,31 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/replaceSingleLineLetIntention/inWithRangeMultipleParam.kt"); } + @TestMetadata("invokeCall.kt") + public void testInvokeCall() throws Exception { + runTest("idea/testData/intentions/replaceSingleLineLetIntention/invokeCall.kt"); + } + + @TestMetadata("invokeCall2.kt") + public void testInvokeCall2() throws Exception { + runTest("idea/testData/intentions/replaceSingleLineLetIntention/invokeCall2.kt"); + } + + @TestMetadata("invokeCall3.kt") + public void testInvokeCall3() throws Exception { + runTest("idea/testData/intentions/replaceSingleLineLetIntention/invokeCall3.kt"); + } + + @TestMetadata("invokeCall4.kt") + public void testInvokeCall4() throws Exception { + runTest("idea/testData/intentions/replaceSingleLineLetIntention/invokeCall4.kt"); + } + + @TestMetadata("invokeCall5.kt") + public void testInvokeCall5() throws Exception { + runTest("idea/testData/intentions/replaceSingleLineLetIntention/invokeCall5.kt"); + } + @TestMetadata("lambdaWithBinaryExpression.kt") public void testLambdaWithBinaryExpression() throws Exception { runTest("idea/testData/intentions/replaceSingleLineLetIntention/lambdaWithBinaryExpression.kt");