diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LambdaSignatureTemplates.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LambdaSignatureTemplates.kt index 1258b4cdc6c..3ee15771412 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LambdaSignatureTemplates.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LambdaSignatureTemplates.kt @@ -154,6 +154,7 @@ object LambdaSignatureTemplates { template.addTextSegment("{ ") } + val noNameParameterCount = mutableMapOf() for ((i, parameterType) in parameterTypes.withIndex()) { if (i > 0) { template.addTextSegment(", ") @@ -168,7 +169,10 @@ object LambdaSignatureTemplates { } } else { - val nameSuggestions = nameSuggestions(parameterType) + val count = (noNameParameterCount[parameterType] ?: 0) + 1 + noNameParameterCount[parameterType] = count + val suffix = if (count == 1) null else "$count" + val nameSuggestions = nameSuggestions(parameterType, suffix) object : Expression() { override fun calculateResult(context: ExpressionContext?) = TextResult(nameSuggestions[0]) override fun calculateQuickResult(context: ExpressionContext?): Result? = null @@ -193,7 +197,11 @@ object LambdaSignatureTemplates { return template } - private fun nameSuggestions(parameterType: KotlinType) = KotlinNameSuggester.suggestNamesByType(parameterType, { true }, "p") + private fun nameSuggestions(parameterType: KotlinType, suffix: String? = null): List { + val suggestions = KotlinNameSuggester.suggestNamesByType(parameterType, { true }, "p") + return if (suffix != null) suggestions.map { "$it$suffix" } else suggestions + } + private fun nameSuggestion(parameterType: KotlinType) = nameSuggestions(parameterType)[0] private fun functionParameterTypes(functionType: KotlinType): List { diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters.kt b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters.kt new file mode 100644 index 00000000000..f256e95d4c5 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters.kt @@ -0,0 +1,9 @@ +fun foo(f: (Int, Int, Int) -> Unit) { +} + +fun main() { + foo +} + +// ELEMENT: foo +// TAIL_TEXT: " { Int, Int, Int -> ... } (f: (Int, Int, Int) -> Unit) ()" \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters.kt.after b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters.kt.after new file mode 100644 index 00000000000..86dc2dffcf8 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters.kt.after @@ -0,0 +1,9 @@ +fun foo(f: (Int, Int, Int) -> Unit) { +} + +fun main() { + foo { i, i2, i3 -> } +} + +// ELEMENT: foo +// TAIL_TEXT: " { Int, Int, Int -> ... } (f: (Int, Int, Int) -> Unit) ()" \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters2.kt b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters2.kt new file mode 100644 index 00000000000..f1a4398abb3 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters2.kt @@ -0,0 +1,9 @@ +fun bar(f: (Int, String, Int, String) -> Unit) { +} + +fun main() { + bar +} + +// ELEMENT: bar +// TAIL_TEXT: " { Int, String, Int, String -> ... } (f: (Int, String, Int, String) -> Unit) ()" \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters2.kt.after b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters2.kt.after new file mode 100644 index 00000000000..07b095438e6 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters2.kt.after @@ -0,0 +1,9 @@ +fun bar(f: (Int, String, Int, String) -> Unit) { +} + +fun main() { + bar { i, s, i2, s2 -> } +} + +// ELEMENT: bar +// TAIL_TEXT: " { Int, String, Int, String -> ... } (f: (Int, String, Int, String) -> Unit) ()" \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters3.kt b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters3.kt new file mode 100644 index 00000000000..09dc94d2517 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters3.kt @@ -0,0 +1,9 @@ +fun baz(f: (a: Int, b: String, Int, String, Int, String) -> Unit) { +} + +fun main() { + baz +} + +// ELEMENT: baz +// TAIL_TEXT: " { a, b, Int, String, Int, String -> ... } (f: (Int, String, Int, String, Int, String) -> Unit) ()" \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters3.kt.after b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters3.kt.after new file mode 100644 index 00000000000..1bfbf8f6372 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters3.kt.after @@ -0,0 +1,9 @@ +fun baz(f: (a: Int, b: String, Int, String, Int, String) -> Unit) { +} + +fun main() { + baz { a, b, i, s, i2, s2 -> } +} + +// ELEMENT: baz +// TAIL_TEXT: " { a, b, Int, String, Int, String -> ... } (f: (Int, String, Int, String, Int, String) -> Unit) ()" \ No newline at end of file diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java index 97e475e7601..dc927ca2528 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java @@ -410,6 +410,21 @@ public class BasicCompletionHandlerTestGenerated extends AbstractBasicCompletion runTest("idea/idea-completion/testData/handlers/basic/highOrderFunctions/ReplaceByLambdaTemplateNoClosingParenth.kt"); } + @TestMetadata("SameTypeParameters.kt") + public void testSameTypeParameters() throws Exception { + runTest("idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters.kt"); + } + + @TestMetadata("SameTypeParameters2.kt") + public void testSameTypeParameters2() throws Exception { + runTest("idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters2.kt"); + } + + @TestMetadata("SameTypeParameters3.kt") + public void testSameTypeParameters3() throws Exception { + runTest("idea/idea-completion/testData/handlers/basic/highOrderFunctions/SameTypeParameters3.kt"); + } + @TestMetadata("WithArgsEmptyLambdaAfter.kt") public void testWithArgsEmptyLambdaAfter() throws Exception { runTest("idea/idea-completion/testData/handlers/basic/highOrderFunctions/WithArgsEmptyLambdaAfter.kt");