From bb2a5b00b768d7f2fb4f137c9dedc59a6b3a06bd Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 8 Feb 2016 16:29:15 +0300 Subject: [PATCH] Change Signature: Fix reference substitution when default value is a single simple name reference #KT-10954 Fixed --- .../usages/KotlinFunctionCallUsage.kt | 10 +++++++--- .../simpleNameWithDefaultValueSubstitution.kt | 12 ++++++++++++ .../simpleNameWithDefaultValueSubstitution.kt.after | 12 ++++++++++++ .../introduce/ExtractionTestGenerated.java | 6 ++++++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 idea/testData/refactoring/introduceParameter/simpleNameWithDefaultValueSubstitution.kt create mode 100644 idea/testData/refactoring/introduceParameter/simpleNameWithDefaultValueSubstitution.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinFunctionCallUsage.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinFunctionCallUsage.kt index ae6adb7a49a..b06b6912446 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinFunctionCallUsage.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinFunctionCallUsage.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.codeInsight.shorten.addToShorteningWaitSet import org.jetbrains.kotlin.idea.core.moveFunctionLiteralOutsideParentheses +import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.refactoring.replaceListPsiAndKeepDelimiters import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinChangeInfo import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinParameterInfo @@ -168,13 +169,13 @@ class KotlinFunctionCallUsage( ): KtExpression { if (referenceMap.isEmpty() || resolvedCall == null) return expression - val newExpression = expression.copy() as KtExpression + var newExpression = expression.copy() as KtExpression val nameCounterpartMap = createNameCounterpartMap(expression, newExpression) val valueArguments = resolvedCall.valueArguments - val replacements = ArrayList>() + val replacements = ArrayList>() loop@ for ((ref, descriptor) in referenceMap.entries) { var argumentExpression: KtExpression? val addReceiver: Boolean @@ -235,7 +236,10 @@ class KotlinFunctionCallUsage( // Sort by descending offset so that call arguments are replaced before call itself ContainerUtil.sort(replacements, REVERSED_TEXT_OFFSET_COMPARATOR) for ((expressionToReplace, replacingExpression) in replacements) { - expressionToReplace.replace(replacingExpression) + val replaced = expressionToReplace.replaced(replacingExpression) + if (expressionToReplace == newExpression) { + newExpression = replaced + } } return newExpression diff --git a/idea/testData/refactoring/introduceParameter/simpleNameWithDefaultValueSubstitution.kt b/idea/testData/refactoring/introduceParameter/simpleNameWithDefaultValueSubstitution.kt new file mode 100644 index 00000000000..b0c8e822054 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/simpleNameWithDefaultValueSubstitution.kt @@ -0,0 +1,12 @@ +// WITH_DEFAULT_VALUE: false + +class A { + val prop = "" + + fun foo() = bar("") + + private fun bar(x: String): Boolean { + prop + return true + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/simpleNameWithDefaultValueSubstitution.kt.after b/idea/testData/refactoring/introduceParameter/simpleNameWithDefaultValueSubstitution.kt.after new file mode 100644 index 00000000000..d87a4c1ebdb --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/simpleNameWithDefaultValueSubstitution.kt.after @@ -0,0 +1,12 @@ +// WITH_DEFAULT_VALUE: false + +class A { + val prop = "" + + fun foo() = bar("", prop) + + private fun bar(x: String, s: String): Boolean { + s + return true + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java index 3141683943b..e39a15a0b7f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java @@ -3457,6 +3457,12 @@ public class ExtractionTestGenerated extends AbstractExtractionTest { doIntroduceSimpleParameterTest(fileName); } + @TestMetadata("simpleNameWithDefaultValueSubstitution.kt") + public void testSimpleNameWithDefaultValueSubstitution() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/simpleNameWithDefaultValueSubstitution.kt"); + doIntroduceSimpleParameterTest(fileName); + } + @TestMetadata("substituteBinaryExpressions.kt") public void testSubstituteBinaryExpressions() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/substituteBinaryExpressions.kt");