From b4410c625f9eead64da7e6526dc7f35080cea098 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 7 Sep 2015 13:52:49 +0300 Subject: [PATCH] Change Signature: Recreate call expression when converting receiver to parameter #KT-8878 Fixed --- .../changeSignature/usages/JetFunctionCallUsage.java | 10 ++++++++-- .../convertReceiverToParameter/genericReceiver.kt | 9 +++++++++ .../genericReceiver.kt.after | 9 +++++++++ .../kotlin/idea/intentions/AbstractIntentionTest.java | 4 ++++ .../kotlin/idea/intentions/IntentionTestGenerated.java | 6 ++++++ 5 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 idea/testData/intentions/convertReceiverToParameter/genericReceiver.kt create mode 100644 idea/testData/intentions/convertReceiverToParameter/genericReceiver.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetFunctionCallUsage.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetFunctionCallUsage.java index 210a310ab76..cfa86d51049 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetFunctionCallUsage.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetFunctionCallUsage.java @@ -45,7 +45,10 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilPackage; -import org.jetbrains.kotlin.resolve.calls.model.*; +import org.jetbrains.kotlin.resolve.calls.model.ArgumentMatch; +import org.jetbrains.kotlin.resolve.calls.model.ExpressionValueArgument; +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; +import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument; import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode; import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver; @@ -460,7 +463,7 @@ public class JetFunctionCallUsage extends JetUsageInfo { JetElement newElement = element; if (newReceiverInfo != originalReceiverInfo) { - PsiElement replacingElement = element; + PsiElement replacingElement; if (newReceiverInfo != null) { ValueArgument receiverArgument = argumentMap.get(newReceiverInfo.getOldIndex()); JetExpression extensionReceiverExpression = receiverArgument != null ? receiverArgument.getArgumentExpression() : null; @@ -472,6 +475,9 @@ public class JetFunctionCallUsage extends JetUsageInfo { replacingElement = PsiPackage.createExpressionByPattern(psiFactory, "$0.$1", receiver, element); } + else { + replacingElement = psiFactory.createExpression(element.getText()); + } newElement = (JetElement) elementToReplace.replace(replacingElement); } diff --git a/idea/testData/intentions/convertReceiverToParameter/genericReceiver.kt b/idea/testData/intentions/convertReceiverToParameter/genericReceiver.kt new file mode 100644 index 00000000000..ea1bbdf9e90 --- /dev/null +++ b/idea/testData/intentions/convertReceiverToParameter/genericReceiver.kt @@ -0,0 +1,9 @@ +// CHECK_ERRORS_AFTER + +fun T.bar() { + toString() +} + +fun foo(a: T) { + a.bar() +} \ No newline at end of file diff --git a/idea/testData/intentions/convertReceiverToParameter/genericReceiver.kt.after b/idea/testData/intentions/convertReceiverToParameter/genericReceiver.kt.after new file mode 100644 index 00000000000..96bc3086478 --- /dev/null +++ b/idea/testData/intentions/convertReceiverToParameter/genericReceiver.kt.after @@ -0,0 +1,9 @@ +// CHECK_ERRORS_AFTER + +fun bar(t: T) { + t.toString() +} + +fun foo(a: T) { + bar(a) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/AbstractIntentionTest.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/AbstractIntentionTest.java index 194d964c8a1..c95e8bbb61e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/AbstractIntentionTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/AbstractIntentionTest.java @@ -123,6 +123,10 @@ public abstract class AbstractIntentionTest extends KotlinCodeInsightTestCase { DirectiveBasedActionUtils.INSTANCE$.checkForUnexpectedErrors((JetFile) getFile()); doTestFor(pathToFile, intentionAction, fileText); + + if (InTextDirectivesUtils.isDirectiveDefined(fileText, "// CHECK_ERRORS_AFTER")) { + DirectiveBasedActionUtils.INSTANCE$.checkForUnexpectedErrors((JetFile) getFile()); + } } finally { if (isWithRuntime) { diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 454a5550ff2..e271d656b63 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -3682,6 +3682,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/convertReceiverToParameter"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); } + @TestMetadata("genericReceiver.kt") + public void testGenericReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertReceiverToParameter/genericReceiver.kt"); + doTest(fileName); + } + @TestMetadata("localFun.kt") public void testLocalFun() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertReceiverToParameter/localFun.kt");