From 88a5eb24d5f561bc3e5077dac47d13bf56daba47 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Wed, 20 Jun 2018 13:07:44 +0300 Subject: [PATCH] "Convert lambda to reference": fix case with companion object So #KT-24385 Fixed --- .../intentions/ConvertLambdaToReferenceIntention.kt | 6 ++++-- .../intentions/convertLambdaToReference/companion2.kt | 6 ++++++ .../convertLambdaToReference/companion2.kt.after | 6 ++++++ .../intentions/convertLambdaToReference/companion3.kt | 9 +++++++++ .../convertLambdaToReference/companion3.kt.after | 9 +++++++++ .../kotlin/idea/intentions/IntentionTestGenerated.java | 10 ++++++++++ 6 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 idea/testData/intentions/convertLambdaToReference/companion2.kt create mode 100644 idea/testData/intentions/convertLambdaToReference/companion2.kt.after create mode 100644 idea/testData/intentions/convertLambdaToReference/companion3.kt create mode 100644 idea/testData/intentions/convertLambdaToReference/companion3.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 37cc79f5b88..fc43fc781de 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.resolve.BindingContext.FUNCTION import org.jetbrains.kotlin.resolve.BindingContext.REFERENCE_TARGET import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue +import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.types.isDynamic @@ -230,10 +231,11 @@ open class ConvertLambdaToReferenceIntention(text: String) : val calleeReferenceExpression = singleStatement.calleeExpression as? KtNameReferenceExpression ?: return null val resolvedCall = calleeReferenceExpression.resolveToCall() ?: return null val receiver = resolvedCall.dispatchReceiver ?: resolvedCall.extensionReceiver + val descriptor by lazy { receiver?.type?.constructor?.declarationDescriptor } val receiverText = when { - receiver == null -> "" + receiver == null || descriptor?.isCompanionObject() == true -> "" lambdaExpression.getResolutionScope().getImplicitReceiversHierarchy().size == 1 -> "this" - else -> receiver.type.constructor.declarationDescriptor?.name?.let { "this@$it" } ?: return null + else -> descriptor?.name?.let { "this@$it" } ?: return null } "$receiverText::${singleStatement.getCallReferencedName()}" } diff --git a/idea/testData/intentions/convertLambdaToReference/companion2.kt b/idea/testData/intentions/convertLambdaToReference/companion2.kt new file mode 100644 index 00000000000..69c2e07dc0a --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/companion2.kt @@ -0,0 +1,6 @@ +class C { + companion object { + fun foo(s: String) = 1 + } + val f = { s: String -> foo(s) } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/companion2.kt.after b/idea/testData/intentions/convertLambdaToReference/companion2.kt.after new file mode 100644 index 00000000000..70a36047b78 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/companion2.kt.after @@ -0,0 +1,6 @@ +class C { + companion object { + fun foo(s: String) = 1 + } + val f = ::foo +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/companion3.kt b/idea/testData/intentions/convertLambdaToReference/companion3.kt new file mode 100644 index 00000000000..681eb352921 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/companion3.kt @@ -0,0 +1,9 @@ +class C { + companion object { + fun foo(s: String) = 1 + } +} + +class Test { + val f = { s: String -> C.foo(s) } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/companion3.kt.after b/idea/testData/intentions/convertLambdaToReference/companion3.kt.after new file mode 100644 index 00000000000..fd78acfb6bc --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/companion3.kt.after @@ -0,0 +1,9 @@ +class C { + companion object { + fun foo(s: String) = 1 + } +} + +class Test { + val f = C.Companion::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 771fa187d68..acb986e6cdd 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -5095,6 +5095,16 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/convertLambdaToReference/companion.kt"); } + @TestMetadata("companion2.kt") + public void testCompanion2() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/companion2.kt"); + } + + @TestMetadata("companion3.kt") + public void testCompanion3() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/companion3.kt"); + } + @TestMetadata("constructor.kt") public void testConstructor() throws Exception { runTest("idea/testData/intentions/convertLambdaToReference/constructor.kt");