diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureUsageProcessor.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureUsageProcessor.java index 2bc4e2c1877..a88e427749d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureUsageProcessor.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureUsageProcessor.java @@ -67,6 +67,7 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilPackage; import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo; +import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind; import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode; import org.jetbrains.kotlin.resolve.scopes.JetScope; import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue; @@ -284,7 +285,7 @@ public class JetChangeSignatureUsageProcessor implements ChangeSignatureUsagePro } ReceiverValue receiverValue = resolvedCall.getExtensionReceiver(); - if (!(receiverValue instanceof ThisReceiver)) { + if (!receiverValue.exists()) { receiverValue = resolvedCall.getDispatchReceiver(); } if (receiverValue instanceof ThisReceiver) { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetImplicitThisToParameterUsage.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetImplicitThisToParameterUsage.kt index 9c255963baf..b67d7c1ce6e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetImplicitThisToParameterUsage.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetImplicitThisToParameterUsage.kt @@ -57,7 +57,10 @@ public class JetImplicitOuterThisToQualifiedThisUsage( callElement: JetElement, val targetDescriptor: DeclarationDescriptor ): JetImplicitReceiverUsage(callElement) { - override fun getNewReceiverText(): String = "this@${targetDescriptor.getName().asString()}" + override fun getNewReceiverText(): String { + val name = targetDescriptor.getName() + return if (name.isSpecial()) "this" else "this@${name.asString()}" + } override fun processReplacedElement(element: JetElement) { element.addToShorteningWaitSet(Options(removeThisLabels = true, removeThis = true)) diff --git a/idea/testData/refactoring/changeSignature/ParameterToReceiverExplicitReceiverAfter.kt b/idea/testData/refactoring/changeSignature/ParameterToReceiverExplicitReceiverAfter.kt new file mode 100644 index 00000000000..0be561dabb4 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/ParameterToReceiverExplicitReceiverAfter.kt @@ -0,0 +1,7 @@ +class C { + fun String.foo() { + 1.bar() + } + + fun Int.bar() {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/ParameterToReceiverExplicitReceiverBefore.kt b/idea/testData/refactoring/changeSignature/ParameterToReceiverExplicitReceiverBefore.kt new file mode 100644 index 00000000000..bb3a4a4b56a --- /dev/null +++ b/idea/testData/refactoring/changeSignature/ParameterToReceiverExplicitReceiverBefore.kt @@ -0,0 +1,7 @@ +class C { + fun foo(s: String) { + 1.bar() + } + + fun Int.bar() {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/ParameterToReceiverImplicitReceiversAfter.kt b/idea/testData/refactoring/changeSignature/ParameterToReceiverImplicitReceiversAfter.kt new file mode 100644 index 00000000000..80691eac044 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/ParameterToReceiverImplicitReceiversAfter.kt @@ -0,0 +1,11 @@ +public inline fun with(receiver: T, f: T.() -> R): R = receiver.f() + +class C { + fun String.foo() { + with(1) { + bar() + } + } + + fun Int.bar() {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/ParameterToReceiverImplicitReceiversBefore.kt b/idea/testData/refactoring/changeSignature/ParameterToReceiverImplicitReceiversBefore.kt new file mode 100644 index 00000000000..f94ad72daf1 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/ParameterToReceiverImplicitReceiversBefore.kt @@ -0,0 +1,11 @@ +public inline fun with(receiver: T, f: T.() -> R): R = receiver.f() + +class C { + fun foo(s: String) { + with(1) { + bar() + } + } + + fun Int.bar() {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/ReceiverToParameterExplicitReceiverAfter.kt b/idea/testData/refactoring/changeSignature/ReceiverToParameterExplicitReceiverAfter.kt new file mode 100644 index 00000000000..b859bb49e16 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/ReceiverToParameterExplicitReceiverAfter.kt @@ -0,0 +1,7 @@ +class C { + fun foo(s: String) { + 1.bar() + } + + fun Int.bar() {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/ReceiverToParameterExplicitReceiverBefore.kt b/idea/testData/refactoring/changeSignature/ReceiverToParameterExplicitReceiverBefore.kt new file mode 100644 index 00000000000..0d24a148d27 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/ReceiverToParameterExplicitReceiverBefore.kt @@ -0,0 +1,7 @@ +class C { + fun String.foo() { + 1.bar() + } + + fun Int.bar() {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/ReceiverToParameterImplicitReceiversAfter.kt b/idea/testData/refactoring/changeSignature/ReceiverToParameterImplicitReceiversAfter.kt new file mode 100644 index 00000000000..3e4ed121d52 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/ReceiverToParameterImplicitReceiversAfter.kt @@ -0,0 +1,11 @@ +public inline fun with(receiver: T, f: T.() -> R): R = receiver.f() + +class C { + fun foo(s: String) { + with(1) { + bar() + } + } + + fun Int.bar() {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/ReceiverToParameterImplicitReceiversBefore.kt b/idea/testData/refactoring/changeSignature/ReceiverToParameterImplicitReceiversBefore.kt new file mode 100644 index 00000000000..0d5c40e17e0 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/ReceiverToParameterImplicitReceiversBefore.kt @@ -0,0 +1,11 @@ +public inline fun with(receiver: T, f: T.() -> R): R = receiver.f() + +class C { + fun String.foo() { + with(1) { + bar() + } + } + + fun Int.bar() {} +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java index 5929cc7cd0e..81ba967c24c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java @@ -341,11 +341,13 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase { JetPsiFactory psiFactory = new JetPsiFactory(getProject()); changeInfo.addParameter( new JetParameterInfo(changeInfo.getMethodDescriptor().getBaseDescriptor(), - -1, "s", KotlinBuiltIns.getInstance().getStringType(), null, psiFactory.createExpression("\"abc\""), JetValVar.None, null) + -1, "s", KotlinBuiltIns.getInstance().getStringType(), null, psiFactory.createExpression("\"abc\""), + JetValVar.None, null) ); changeInfo.addParameter( new JetParameterInfo(changeInfo.getMethodDescriptor().getBaseDescriptor(), - -1, "o", KotlinBuiltIns.getInstance().getNullableAnyType(), null, psiFactory.createExpression("\"def\""), JetValVar.None, null) + -1, "o", KotlinBuiltIns.getInstance().getNullableAnyType(), null, + psiFactory.createExpression("\"def\""), JetValVar.None, null) ); doTest(changeInfo); } @@ -949,6 +951,30 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase { doTest(changeInfo); } + public void testReceiverToParameterExplicitReceiver() throws Exception { + JetChangeInfo changeInfo = getChangeInfo(); + changeInfo.setReceiverParameterInfo(null); + doTest(changeInfo); + } + + public void testReceiverToParameterImplicitReceivers() throws Exception { + JetChangeInfo changeInfo = getChangeInfo(); + changeInfo.setReceiverParameterInfo(null); + doTest(changeInfo); + } + + public void testParameterToReceiverExplicitReceiver() throws Exception { + JetChangeInfo changeInfo = getChangeInfo(); + changeInfo.setReceiverParameterInfo(changeInfo.getNewParameters()[0]); + doTest(changeInfo); + } + + public void testParameterToReceiverImplicitReceivers() throws Exception { + JetChangeInfo changeInfo = getChangeInfo(); + changeInfo.setReceiverParameterInfo(changeInfo.getNewParameters()[0]); + doTest(changeInfo); + } + @NotNull @Override protected String getTestDataPath() {