diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt index 59e4edc4f1e..db26ac29fe1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.approximateFlexibleTypes import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext.FUNCTION import org.jetbrains.kotlin.resolve.BindingContext.REFERENCE_TARGET import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall @@ -229,8 +230,7 @@ open class ConvertLambdaToReferenceIntention(text: String) : companion object { private fun buildReferenceText(lambdaExpression: KtLambdaExpression, shortTypes: Boolean): String? { - val singleStatement = lambdaExpression.singleStatementOrNull() - return when (singleStatement) { + return when (val singleStatement = lambdaExpression.singleStatementOrNull()) { is KtCallExpression -> { val calleeReferenceExpression = singleStatement.calleeExpression as? KtNameReferenceExpression ?: return null val resolvedCall = calleeReferenceExpression.resolveToCall() ?: return null @@ -244,10 +244,9 @@ open class ConvertLambdaToReferenceIntention(text: String) : "$receiverText::${singleStatement.getCallReferencedName()}" } is KtDotQualifiedExpression -> { - val selector = singleStatement.selectorExpression - val selectorReferenceName = when (selector) { + val selectorReferenceName = when (val selector = singleStatement.selectorExpression) { is KtCallExpression -> selector.getCallReferencedName() ?: return null - is KtNameReferenceExpression -> selector.getReferencedName() + is KtNameReferenceExpression -> selector.getSafeReferencedName() else -> return null } val receiver = singleStatement.receiverExpression @@ -278,7 +277,9 @@ open class ConvertLambdaToReferenceIntention(text: String) : } } - private fun KtCallExpression.getCallReferencedName() = (calleeExpression as? KtNameReferenceExpression)?.getReferencedName() + private fun KtCallExpression.getCallReferencedName() = (calleeExpression as? KtNameReferenceExpression)?.getSafeReferencedName() + + private fun KtNameReferenceExpression.getSafeReferencedName() = getReferencedNameAsName().render() private fun KtLambdaExpression.singleStatementOrNull() = bodyExpression?.statements?.singleOrNull() } diff --git a/idea/testData/intentions/convertLambdaToReference/backtickEscaped.kt b/idea/testData/intentions/convertLambdaToReference/backtickEscaped.kt new file mode 100644 index 00000000000..690d9b98a92 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/backtickEscaped.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME +fun `super`(x: Int): Int = TODO() + +fun main(args: Array) { + listOf(1).map { `super`(it) } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/backtickEscaped.kt.after b/idea/testData/intentions/convertLambdaToReference/backtickEscaped.kt.after new file mode 100644 index 00000000000..73fe55ba50d --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/backtickEscaped.kt.after @@ -0,0 +1,6 @@ +// WITH_RUNTIME +fun `super`(x: Int): Int = TODO() + +fun main(args: Array) { + listOf(1).map(::`super`) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/backtickEscaped2.kt b/idea/testData/intentions/convertLambdaToReference/backtickEscaped2.kt new file mode 100644 index 00000000000..5f253db7e3f --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/backtickEscaped2.kt @@ -0,0 +1,3 @@ +class Person(val `super`: String) + +val reader = { p: Person -> p.`super` } \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/backtickEscaped2.kt.after b/idea/testData/intentions/convertLambdaToReference/backtickEscaped2.kt.after new file mode 100644 index 00000000000..4776f17822d --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/backtickEscaped2.kt.after @@ -0,0 +1,3 @@ +class Person(val `super`: String) + +val reader = Person::`super` \ 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 9b625179740..0cbf9cf1910 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -4700,6 +4700,16 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/convertLambdaToReference/argumentWithReceiver.kt"); } + @TestMetadata("backtickEscaped.kt") + public void testBacktickEscaped() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/backtickEscaped.kt"); + } + + @TestMetadata("backtickEscaped2.kt") + public void testBacktickEscaped2() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/backtickEscaped2.kt"); + } + @TestMetadata("classReference.kt") public void testClassReference() throws Exception { runTest("idea/testData/intentions/convertLambdaToReference/classReference.kt");