diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt index c58ed53652f..6d2086a34f0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt @@ -33,7 +33,12 @@ import org.jetbrains.kotlin.types.isDynamic import org.jetbrains.kotlin.types.typeUtil.isTypeParameter import org.jetbrains.kotlin.types.typeUtil.isUnit -class ConvertLambdaToReferenceInspection : IntentionBasedInspection(ConvertLambdaToReferenceIntention()) +class ConvertLambdaToReferenceInspection( + val intention: ConvertLambdaToReferenceIntention = ConvertLambdaToReferenceIntention() +) : IntentionBasedInspection( + intention, + { intention.shouldSuggestToConvert(it) } +) class ConvertLambdaToReferenceIntention : SelfTargetingOffsetIndependentIntention( KtLambdaExpression::class.java, "Convert lambda to reference" @@ -141,6 +146,12 @@ class ConvertLambdaToReferenceIntention : SelfTargetingOffsetIndependentIntentio } } + internal fun shouldSuggestToConvert(element: KtLambdaExpression): Boolean { + val body = element.bodyExpression ?: return false + val referenceName = buildReferenceText(body.statements.singleOrNull() ?: return false) ?: return false + return referenceName.length < element.text.length + } + private fun KtCallExpression.getCallReferencedName() = (calleeExpression as? KtNameReferenceExpression)?.getReferencedName() private fun buildReferenceText(expression: KtExpression): String? { @@ -166,7 +177,7 @@ class ConvertLambdaToReferenceIntention : SelfTargetingOffsetIndependentIntentio override fun applyTo(element: KtLambdaExpression, editor: Editor?) { val body = element.bodyExpression ?: return val referenceName = buildReferenceText(body.statements.singleOrNull() ?: return) ?: return - val factory = KtPsiFactory(editor?.project) + val factory = KtPsiFactory(element) val lambdaArgument = element.parent as? KtLambdaArgument if (lambdaArgument == null) { // Without lambda argument syntax, just replace lambda with reference diff --git a/idea/testData/inspections/convertLambdaToReference/inspectionData/expected.xml b/idea/testData/inspections/convertLambdaToReference/inspectionData/expected.xml new file mode 100644 index 00000000000..0990a51a52f --- /dev/null +++ b/idea/testData/inspections/convertLambdaToReference/inspectionData/expected.xml @@ -0,0 +1,10 @@ + + + test.kt + 5 + light_idea_test_case + + Can be replaced with function reference + Convert lambda to reference + + \ No newline at end of file diff --git a/idea/testData/inspections/convertLambdaToReference/inspectionData/inspections.test b/idea/testData/inspections/convertLambdaToReference/inspectionData/inspections.test new file mode 100644 index 00000000000..2b2f8dee5a0 --- /dev/null +++ b/idea/testData/inspections/convertLambdaToReference/inspectionData/inspections.test @@ -0,0 +1 @@ +// INSPECTION_CLASS: org.jetbrains.kotlin.idea.intentions.ConvertLambdaToReferenceInspection \ No newline at end of file diff --git a/idea/testData/inspections/convertLambdaToReference/test.kt b/idea/testData/inspections/convertLambdaToReference/test.kt new file mode 100644 index 00000000000..7edab1a170d --- /dev/null +++ b/idea/testData/inspections/convertLambdaToReference/test.kt @@ -0,0 +1,9 @@ +// Mostly tested as intention. Here we just test shouldSuggestToConvert() + +// Should suggest to convert +class TheirWrapper(val x: Int) +val x = { y: Int -> TheirWrapper(y) } + +// Should not suggest to convert (too long reference) +fun foo(arg: TheirWrapper, convert: (TheirWrapper) -> String) = convert(arg) +val y = foo(TheirWrapper(42)) { it.toString() } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java index bc557eb8249..d96bf9f02bc 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java @@ -148,6 +148,12 @@ public class InspectionTestGenerated extends AbstractInspectionTest { doTest(fileName); } + @TestMetadata("convertLambdaToReference/inspectionData/inspections.test") + public void testConvertLambdaToReference_inspectionData_Inspections_test() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/convertLambdaToReference/inspectionData/inspections.test"); + doTest(fileName); + } + @TestMetadata("equalsAndHashCode/inspectionData/inspections.test") public void testEqualsAndHashCode_inspectionData_Inspections_test() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/equalsAndHashCode/inspectionData/inspections.test");