From 2c692de98fced7b4ee2bad498a16357f8b565a9e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 10 Mar 2017 17:38:03 +0300 Subject: [PATCH] KT-13111: lambda --> reference support methods called via this now --- .../ConvertLambdaToReferenceIntention.kt | 34 ++++++++++++------- .../convertLambdaToReference/memberViaThis.kt | 4 +++ .../memberViaThis.kt.after | 4 +++ .../intentions/IntentionTestGenerated.java | 6 ++++ 4 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 idea/testData/intentions/convertLambdaToReference/memberViaThis.kt create mode 100644 idea/testData/intentions/convertLambdaToReference/memberViaThis.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 114d76461df..b0443e1f8dd 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt @@ -240,22 +240,30 @@ class ConvertLambdaToReferenceIntention : SelfTargetingOffsetIndependentIntentio is KtNameReferenceExpression -> selector.getReferencedName() else -> return null } - val receiver = singleStatement.receiverExpression as? KtNameReferenceExpression ?: return null + val receiver = singleStatement.receiverExpression val context = receiver.analyze() - val receiverDescriptor = context[REFERENCE_TARGET, receiver] ?: return null - val lambdaValueParameters = context[FUNCTION, lambdaExpression.functionLiteral]?.valueParameters ?: return null - if (receiverDescriptor is ParameterDescriptor && receiverDescriptor == lambdaValueParameters.firstOrNull()) { - val originalReceiverType = receiverDescriptor.type - val receiverType = originalReceiverType.approximateFlexibleTypes(preferNotNull = true) - if (shortTypes) { - "${IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(receiverType)}::$selectorReferenceName" + when (receiver) { + is KtNameReferenceExpression -> { + val receiverDescriptor = context[REFERENCE_TARGET, receiver] ?: return null + val lambdaValueParameters = context[FUNCTION, lambdaExpression.functionLiteral]?.valueParameters ?: return null + if (receiverDescriptor is ParameterDescriptor && receiverDescriptor == lambdaValueParameters.firstOrNull()) { + val originalReceiverType = receiverDescriptor.type + val receiverType = originalReceiverType.approximateFlexibleTypes(preferNotNull = true) + if (shortTypes) { + "${IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(receiverType)}::$selectorReferenceName" + } + else { + "${IdeDescriptorRenderers.SOURCE_CODE.renderType(receiverType)}::$selectorReferenceName" + } + } + else { + "${receiverDescriptor.name}::$selectorReferenceName" + } } - else { - "${IdeDescriptorRenderers.SOURCE_CODE.renderType(receiverType)}::$selectorReferenceName" + is KtThisExpression -> { + "${receiver.text}::$selectorReferenceName" } - } - else { - "${receiverDescriptor.name}::$selectorReferenceName" + else -> null } } else -> null diff --git a/idea/testData/intentions/convertLambdaToReference/memberViaThis.kt b/idea/testData/intentions/convertLambdaToReference/memberViaThis.kt new file mode 100644 index 00000000000..4d87fa15b18 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/memberViaThis.kt @@ -0,0 +1,4 @@ +class Owner(val z: Int) { + fun foo(y: Int) = y + z + val x = { y: Int -> this.foo(y) } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/memberViaThis.kt.after b/idea/testData/intentions/convertLambdaToReference/memberViaThis.kt.after new file mode 100644 index 00000000000..28f31629a23 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/memberViaThis.kt.after @@ -0,0 +1,4 @@ +class Owner(val z: Int) { + fun foo(y: Int) = y + z + val x = this::foo +} \ 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 16fc896daca..b2beb4201ed 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -4466,6 +4466,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("memberViaThis.kt") + public void testMemberViaThis() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertLambdaToReference/memberViaThis.kt"); + doTest(fileName); + } + @TestMetadata("name.kt") public void testName() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertLambdaToReference/name.kt");