diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/inferParameterInfo.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/inferParameterInfo.kt index ee79035cec7..e230b85ed1c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/inferParameterInfo.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/inferParameterInfo.kt @@ -126,6 +126,7 @@ internal fun ExtractionData.inferParametersInfo( NewDeclarationNameValidator.Target.VARIABLES ) + val existingParameterNames = hashSetOf() for ((descriptorToExtract, parameter) in extractedDescriptorToParameter) { if (!parameter .getParameterType(options.allowSpecialClassNames) @@ -135,8 +136,20 @@ internal fun ExtractionData.inferParametersInfo( if (currentName == null) { currentName = KotlinNameSuggester.suggestNamesByType(getParameterType(options.allowSpecialClassNames), varNameValidator, "p").first() } + + require(currentName != null) + + if ("$currentName" in existingParameterNames) { + var index = 0 + while ("$currentName$index" in existingParameterNames) { + index++ + } + currentName = "$currentName$index" + } + mirrorVarName = if (descriptorToExtract in modifiedVarDescriptors) KotlinNameSuggester.suggestNameByName(name, varNameValidator) else null info.parameters.add(this) + currentName?.let { existingParameterNames += it } } } diff --git a/idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/thisLabels.kt b/idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/thisLabels.kt index 16a05e39f94..75ea824edb9 100644 --- a/idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/thisLabels.kt +++ b/idea/testData/debugger/tinyApp/src/evaluate/multipleBreakpoints/thisLabels.kt @@ -27,5 +27,5 @@ fun T.inlineBlock(t: T, block: T.() -> Unit) { // EXPRESSION: this // RESULT: 2: I -// EXPRESSION: this@c -// RESULT: 3: I \ No newline at end of file +// EXPRESSION: this + this@a + this@b + this@c +// RESULT: 12: I \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/basic/sameParameterNames.kt b/idea/testData/refactoring/extractFunction/basic/sameParameterNames.kt new file mode 100644 index 00000000000..20ce49dfcd1 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/basic/sameParameterNames.kt @@ -0,0 +1,20 @@ +// SUGGESTED_NAMES: s, getA +// PARAM_TYPES: kotlin.String +// PARAM_TYPES: kotlin.String, kotlin.Comparable, kotlin.CharSequence, java.io.Serializable, kotlin.Any +// PARAM_TYPES: kotlin.String, kotlin.Comparable, kotlin.CharSequence, java.io.Serializable, kotlin.Any +// PARAM_DESCRIPTOR: local final fun kotlin.String.(): kotlin.Unit defined in Foo.foo.., local final fun kotlin.String.(): kotlin.Unit defined in Foo.foo., local final fun kotlin.String.(): kotlin.Unit defined in Foo.foo +class Foo { + fun foo() { + block("a") a@ { + block("b") b@ { + block("c") c@ { + val a = this@c + this@b + this@a + this + this@Foo.toString() + } + } + } + } +} + +private inline fun block(t: T, block: T.() -> Unit) { + t.block() +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/basic/sameParameterNames.kt.after b/idea/testData/refactoring/extractFunction/basic/sameParameterNames.kt.after new file mode 100644 index 00000000000..8ac765b02f6 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/basic/sameParameterNames.kt.after @@ -0,0 +1,22 @@ +// SUGGESTED_NAMES: s, getA +// PARAM_TYPES: kotlin.String +// PARAM_TYPES: kotlin.String, kotlin.Comparable, kotlin.CharSequence, java.io.Serializable, kotlin.Any +// PARAM_TYPES: kotlin.String, kotlin.Comparable, kotlin.CharSequence, java.io.Serializable, kotlin.Any +// PARAM_DESCRIPTOR: local final fun kotlin.String.(): kotlin.Unit defined in Foo.foo.., local final fun kotlin.String.(): kotlin.Unit defined in Foo.foo., local final fun kotlin.String.(): kotlin.Unit defined in Foo.foo +class Foo { + fun foo() { + block("a") a@ { + block("b") b@ { + block("c") c@ { + val a = s(this@c, this@b, this@a) + } + } + } + } + + private fun s(s: String, s0: String, s1: String) = s + s0 + s1 + s + this@Foo.toString() +} + +private inline fun block(t: T, block: T.() -> Unit) { + t.block() +} 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 ade0b43ec87..c8cd6d63222 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java @@ -996,6 +996,11 @@ public class ExtractionTestGenerated extends AbstractExtractionTest { runTest("idea/testData/refactoring/extractFunction/basic/refInReturn.kt"); } + @TestMetadata("sameParameterNames.kt") + public void testSameParameterNames() throws Exception { + runTest("idea/testData/refactoring/extractFunction/basic/sameParameterNames.kt"); + } + @TestMetadata("selectedConstructor.kt") public void testSelectedConstructor() throws Exception { runTest("idea/testData/refactoring/extractFunction/basic/selectedConstructor.kt");