Change Signature: Do not replace implicit receivers in calls with at least one explicit receiver

#KT-7988 Fixed
This commit is contained in:
Alexey Sedunov
2015-06-11 21:05:05 +03:00
parent d58112a32a
commit 5409b19abc
11 changed files with 106 additions and 4 deletions
@@ -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) {
@@ -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))
@@ -0,0 +1,7 @@
class C {
fun String.foo() {
1.bar()
}
fun Int.bar() {}
}
@@ -0,0 +1,7 @@
class C {
fun <caret>foo(s: String) {
1.bar()
}
fun Int.bar() {}
}
@@ -0,0 +1,11 @@
public inline fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()
class C {
fun String.foo() {
with(1) {
bar()
}
}
fun Int.bar() {}
}
@@ -0,0 +1,11 @@
public inline fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()
class C {
fun <caret>foo(s: String) {
with(1) {
bar()
}
}
fun Int.bar() {}
}
@@ -0,0 +1,7 @@
class C {
fun foo(s: String) {
1.bar()
}
fun Int.bar() {}
}
@@ -0,0 +1,7 @@
class C {
fun String.<caret>foo() {
1.bar()
}
fun Int.bar() {}
}
@@ -0,0 +1,11 @@
public inline fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()
class C {
fun foo(s: String) {
with(1) {
bar()
}
}
fun Int.bar() {}
}
@@ -0,0 +1,11 @@
public inline fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()
class C {
fun String.<caret>foo() {
with(1) {
bar()
}
}
fun Int.bar() {}
}
@@ -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() {