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.callUtil.CallUtilPackage;
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
|
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.lazy.BodyResolveMode;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.JetScope;
|
import org.jetbrains.kotlin.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue;
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue;
|
||||||
@@ -284,7 +285,7 @@ public class JetChangeSignatureUsageProcessor implements ChangeSignatureUsagePro
|
|||||||
}
|
}
|
||||||
|
|
||||||
ReceiverValue receiverValue = resolvedCall.getExtensionReceiver();
|
ReceiverValue receiverValue = resolvedCall.getExtensionReceiver();
|
||||||
if (!(receiverValue instanceof ThisReceiver)) {
|
if (!receiverValue.exists()) {
|
||||||
receiverValue = resolvedCall.getDispatchReceiver();
|
receiverValue = resolvedCall.getDispatchReceiver();
|
||||||
}
|
}
|
||||||
if (receiverValue instanceof ThisReceiver) {
|
if (receiverValue instanceof ThisReceiver) {
|
||||||
|
|||||||
+4
-1
@@ -57,7 +57,10 @@ public class JetImplicitOuterThisToQualifiedThisUsage(
|
|||||||
callElement: JetElement,
|
callElement: JetElement,
|
||||||
val targetDescriptor: DeclarationDescriptor
|
val targetDescriptor: DeclarationDescriptor
|
||||||
): JetImplicitReceiverUsage(callElement) {
|
): 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) {
|
override fun processReplacedElement(element: JetElement) {
|
||||||
element.addToShorteningWaitSet(Options(removeThisLabels = true, removeThis = true))
|
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());
|
JetPsiFactory psiFactory = new JetPsiFactory(getProject());
|
||||||
changeInfo.addParameter(
|
changeInfo.addParameter(
|
||||||
new JetParameterInfo(changeInfo.getMethodDescriptor().getBaseDescriptor(),
|
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(
|
changeInfo.addParameter(
|
||||||
new JetParameterInfo(changeInfo.getMethodDescriptor().getBaseDescriptor(),
|
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);
|
doTest(changeInfo);
|
||||||
}
|
}
|
||||||
@@ -949,6 +951,30 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
|
|||||||
doTest(changeInfo);
|
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
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
protected String getTestDataPath() {
|
protected String getTestDataPath() {
|
||||||
|
|||||||
Reference in New Issue
Block a user