Change Signature: Do not replace implicit receivers in calls with at least one explicit receiver
#KT-7988 Fixed
This commit is contained in:
+2
-1
@@ -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) {
|
||||
|
||||
+4
-1
@@ -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))
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
class C {
|
||||
fun String.foo() {
|
||||
1.bar()
|
||||
}
|
||||
|
||||
fun Int.bar() {}
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
class C {
|
||||
fun <caret>foo(s: String) {
|
||||
1.bar()
|
||||
}
|
||||
|
||||
fun Int.bar() {}
|
||||
}
|
||||
+11
@@ -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() {}
|
||||
}
|
||||
+11
@@ -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() {}
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
class C {
|
||||
fun foo(s: String) {
|
||||
1.bar()
|
||||
}
|
||||
|
||||
fun Int.bar() {}
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
class C {
|
||||
fun String.<caret>foo() {
|
||||
1.bar()
|
||||
}
|
||||
|
||||
fun Int.bar() {}
|
||||
}
|
||||
+11
@@ -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() {}
|
||||
}
|
||||
+11
@@ -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() {}
|
||||
}
|
||||
+28
-2
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user