From 7ea1700b78974d0d372b780770ebfb83fc2e8352 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Tue, 23 Jun 2020 11:58:01 +0900 Subject: [PATCH] Convert lambda to reference: support generic function call #KT-14578 Fixed #KT-14395 Fixed --- .../ConvertLambdaToReferenceIntention.kt | 12 ++++++++++-- .../convertLambdaToReference/generic2.kt | 6 ++++++ .../convertLambdaToReference/generic2.kt.after | 6 ++++++ .../convertLambdaToReference/generic3.kt | 8 ++++++++ .../convertLambdaToReference/generic3.kt.after | 8 ++++++++ .../convertLambdaToReference/generic4.kt | 4 ++++ .../convertLambdaToReference/generic4.kt.after | 4 ++++ .../idea/intentions/IntentionTestGenerated.java | 15 +++++++++++++++ 8 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 idea/testData/intentions/convertLambdaToReference/generic2.kt create mode 100644 idea/testData/intentions/convertLambdaToReference/generic2.kt.after create mode 100644 idea/testData/intentions/convertLambdaToReference/generic3.kt create mode 100644 idea/testData/intentions/convertLambdaToReference/generic3.kt.after create mode 100644 idea/testData/intentions/convertLambdaToReference/generic4.kt create mode 100644 idea/testData/intentions/convertLambdaToReference/generic4.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 ee5ecf1a7ab..b8b6a2b5007 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt @@ -88,7 +88,7 @@ open class ConvertLambdaToReferenceIntention(textGetter: () -> String) : SelfTar ) return false // No references with type parameters - if (calleeDescriptor.typeParameters.isNotEmpty()) return false + if (calleeDescriptor.typeParameters.isNotEmpty() && lambdaExpression.parentValueArgument() == null) return false // No references to Java synthetic properties if (calleeDescriptor is SyntheticJavaPropertyDescriptor) return false @@ -237,6 +237,12 @@ open class ConvertLambdaToReferenceIntention(textGetter: () -> String) : SelfTar } lambdaArgument.delete() } + + outerCallExpression.typeArgumentList?.let { + if (RemoveExplicitTypeArgumentsIntention.isApplicableTo(it, approximateFlexible = false)) { + it.delete() + } + } } } @@ -257,7 +263,9 @@ open class ConvertLambdaToReferenceIntention(textGetter: () -> String) : SelfTar val calledFunctionInLambda = lambda.singleStatementOrNull() ?.getResolvedCall(context)?.resultingDescriptor as? FunctionDescriptor ?: return val overloadedFunctions = calledFunctionInLambda.overloadedFunctions() - if (overloadedFunctions.count { it.valueParameters.size == calledFunctionInLambda.valueParameters.size } < 2) return + if (overloadedFunctions.count { it.valueParameters.size == calledFunctionInLambda.valueParameters.size } < 2 + && calledFunctionInLambda.typeParameters.isEmpty() + ) return if (InsertExplicitTypeArgumentsIntention.isApplicableTo(this, context)) { InsertExplicitTypeArgumentsIntention.applyTo(this) diff --git a/idea/testData/intentions/convertLambdaToReference/generic2.kt b/idea/testData/intentions/convertLambdaToReference/generic2.kt new file mode 100644 index 00000000000..05e8308901e --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/generic2.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME +fun foo(i: Int): T? = null + +fun test(list: List) { + list.mapNotNull { foo(it) } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/generic2.kt.after b/idea/testData/intentions/convertLambdaToReference/generic2.kt.after new file mode 100644 index 00000000000..c94ec089480 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/generic2.kt.after @@ -0,0 +1,6 @@ +// WITH_RUNTIME +fun foo(i: Int): T? = null + +fun test(list: List) { + list.mapNotNull(::foo) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/generic3.kt b/idea/testData/intentions/convertLambdaToReference/generic3.kt new file mode 100644 index 00000000000..d7424173fa8 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/generic3.kt @@ -0,0 +1,8 @@ +// WITH_RUNTIME +interface CD + +fun D.foo(): D? = null + +fun test(x: List) { + x.mapNotNull { it.foo() } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/generic3.kt.after b/idea/testData/intentions/convertLambdaToReference/generic3.kt.after new file mode 100644 index 00000000000..ae1d640543d --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/generic3.kt.after @@ -0,0 +1,8 @@ +// WITH_RUNTIME +interface CD + +fun D.foo(): D? = null + +fun test(x: List) { + x.mapNotNull(CD::foo) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/generic4.kt b/idea/testData/intentions/convertLambdaToReference/generic4.kt new file mode 100644 index 00000000000..56dc4477189 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/generic4.kt @@ -0,0 +1,4 @@ +// WITH_RUNTIME +fun test() { + listOf(listOf(1)).filter { it.isNotEmpty() } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/generic4.kt.after b/idea/testData/intentions/convertLambdaToReference/generic4.kt.after new file mode 100644 index 00000000000..05393768608 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/generic4.kt.after @@ -0,0 +1,4 @@ +// WITH_RUNTIME +fun test() { + listOf(listOf(1)).filter(List::isNotEmpty) +} \ 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 535c5727b0a..f3ac1f62444 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -5095,6 +5095,21 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/convertLambdaToReference/generic.kt"); } + @TestMetadata("generic2.kt") + public void testGeneric2() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/generic2.kt"); + } + + @TestMetadata("generic3.kt") + public void testGeneric3() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/generic3.kt"); + } + + @TestMetadata("generic4.kt") + public void testGeneric4() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/generic4.kt"); + } + @TestMetadata("globalProperty.kt") public void testGlobalProperty() throws Exception { runTest("idea/testData/intentions/convertLambdaToReference/globalProperty.kt");