diff --git a/ChangeLog.md b/ChangeLog.md index ab5d4fe25c6..98288f64a4c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -116,6 +116,7 @@ These artifacts include extensions for the types available in the latter JDKs, s - [`KT-13883`](https://youtrack.jetbrains.com/issue/KT-13883) Move to Companion Object: Fix exception when applied to class - [`KT-13876`](https://youtrack.jetbrains.com/issue/KT-13876) Move to Companion Object: Forbid for functions/properties referencing type parameters of the containing class - [`KT-13877`](https://youtrack.jetbrains.com/issue/KT-13877) Move to Companion Object: Warn if companion object already contains function with the same signature +- [`KT-13933`](https://youtrack.jetbrains.com/issue/KT-13933) Convert Parameter to Receiver: Do not qualify companion members with labeled 'this' ##### New features diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinImplicitThisToParameterUsage.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinImplicitThisToParameterUsage.kt index 82e0daaf4da..4d3a7dddaa3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinImplicitThisToParameterUsage.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinImplicitThisToParameterUsage.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.refactoring.changeSignature.usages import com.intellij.usageView.UsageInfo +import org.jetbrains.kotlin.descriptors.ClassifierDescriptor import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinChangeInfo import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinParameterInfo import org.jetbrains.kotlin.psi.KtPsiFactory @@ -25,6 +26,8 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.idea.codeInsight.shorten.addToShorteningWaitSet import org.jetbrains.kotlin.idea.core.ShortenReferences.Options +import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers +import org.jetbrains.kotlin.resolve.DescriptorUtils abstract class KotlinImplicitReceiverUsage(callElement: KtElement): KotlinUsageInfo(callElement) { protected abstract fun getNewReceiverText(): String @@ -60,7 +63,11 @@ class KotlinImplicitThisUsage( ): KotlinImplicitReceiverUsage(callElement) { override fun getNewReceiverText(): String { val name = targetDescriptor.name - return if (name.isSpecial) "this" else "this@${name.asString()}" + return when { + name.isSpecial -> "this" + DescriptorUtils.isCompanionObject(targetDescriptor) -> IdeDescriptorRenderers.SOURCE_CODE.renderClassifierName(targetDescriptor as ClassifierDescriptor) + else -> "this@${name.asString()}" + } } override fun processReplacedElement(element: KtElement) { diff --git a/idea/testData/intentions/convertParameterToReceiver/companionAsReceiver.kt b/idea/testData/intentions/convertParameterToReceiver/companionAsReceiver.kt new file mode 100644 index 00000000000..84a55d678f0 --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/companionAsReceiver.kt @@ -0,0 +1,19 @@ +interface Application { + fun put(testKey: String, s: String) +} + +abstract class ApplicationModule { + abstract fun install(application: Application) +} + +class AppTest { + class ApplicationLoaderTestApplicationFeatureWithEnvironment() : ApplicationModule() { + override fun install(application: Application) { + application.put(TestKey, "2") + } + } + + companion object { + val TestKey = "" + } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertParameterToReceiver/companionAsReceiver.kt.after b/idea/testData/intentions/convertParameterToReceiver/companionAsReceiver.kt.after new file mode 100644 index 00000000000..51f655b5881 --- /dev/null +++ b/idea/testData/intentions/convertParameterToReceiver/companionAsReceiver.kt.after @@ -0,0 +1,19 @@ +interface Application { + fun put(testKey: String, s: String) +} + +abstract class ApplicationModule { + abstract fun Application.install() +} + +class AppTest { + class ApplicationLoaderTestApplicationFeatureWithEnvironment() : ApplicationModule() { + override fun Application.install() { + put(TestKey, "2") + } + } + + companion object { + val TestKey = "" + } +} \ 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 ecf85cb9e7b..3842fc11854 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -4285,6 +4285,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("companionAsReceiver.kt") + public void testCompanionAsReceiver() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertParameterToReceiver/companionAsReceiver.kt"); + doTest(fileName); + } + @TestMetadata("functionExpression.kt") public void testFunctionExpression() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertParameterToReceiver/functionExpression.kt");