diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddJvmNameAnnotationFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddJvmNameAnnotationFix.kt index a5f160fc542..1896d7512e1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddJvmNameAnnotationFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddJvmNameAnnotationFix.kt @@ -55,9 +55,24 @@ class AddJvmNameAnnotationFix(element: KtElement, private val jvmName: String) : function, NewDeclarationNameValidator.Target.FUNCTIONS_AND_CLASSES ) - - val jvmName = KotlinNameSuggester.suggestNameByName(functionName, nameValidator) + val receiverTypeElements = function.receiverTypeReference?.typeElements()?.joinToString("") { it.text } ?: "" + val jvmName = KotlinNameSuggester.suggestNameByName(functionName + receiverTypeElements, nameValidator) return AddJvmNameAnnotationFix(function.findAnnotation(JVM_NAME_FQ_NAME) ?: function, jvmName) } + + private fun KtTypeReference.typeElements(): List { + val typeElements = mutableListOf() + fun collect(typeReference: KtTypeReference) { + val typeElement = typeReference.typeElement ?: return + val typeArguments = typeElement.typeArgumentsAsTypes + if (typeArguments.isEmpty()) { + typeElements.add(typeElement) + } else { + typeArguments.forEach { collect(it) } + } + } + typeElement?.typeArgumentsAsTypes?.forEach { collect(it) } + return typeElements + } } } diff --git a/idea/testData/quickfix/addJvmNameAnnotation/extension.kt b/idea/testData/quickfix/addJvmNameAnnotation/extension.kt new file mode 100644 index 00000000000..ec67e07fd08 --- /dev/null +++ b/idea/testData/quickfix/addJvmNameAnnotation/extension.kt @@ -0,0 +1,7 @@ +// "Add '@JvmName' annotation" "true" +// WITH_RUNTIME +interface Foo + +fun Foo.foo() = this + +fun Foo.foo() = this \ No newline at end of file diff --git a/idea/testData/quickfix/addJvmNameAnnotation/extension.kt.after b/idea/testData/quickfix/addJvmNameAnnotation/extension.kt.after new file mode 100644 index 00000000000..d94d8e45288 --- /dev/null +++ b/idea/testData/quickfix/addJvmNameAnnotation/extension.kt.after @@ -0,0 +1,8 @@ +// "Add '@JvmName' annotation" "true" +// WITH_RUNTIME +interface Foo + +fun Foo.foo() = this + +@JvmName("fooString") +fun Foo.foo() = this \ No newline at end of file diff --git a/idea/testData/quickfix/addJvmNameAnnotation/extension2.kt b/idea/testData/quickfix/addJvmNameAnnotation/extension2.kt new file mode 100644 index 00000000000..db7ef1fda85 --- /dev/null +++ b/idea/testData/quickfix/addJvmNameAnnotation/extension2.kt @@ -0,0 +1,7 @@ +// "Add '@JvmName' annotation" "true" +// WITH_RUNTIME +interface Bar + +fun Bar.bar() = this + +fun Bar>>.bar() = this \ No newline at end of file diff --git a/idea/testData/quickfix/addJvmNameAnnotation/extension2.kt.after b/idea/testData/quickfix/addJvmNameAnnotation/extension2.kt.after new file mode 100644 index 00000000000..8d2b6bf384c --- /dev/null +++ b/idea/testData/quickfix/addJvmNameAnnotation/extension2.kt.after @@ -0,0 +1,8 @@ +// "Add '@JvmName' annotation" "true" +// WITH_RUNTIME +interface Bar + +@JvmName("barIntDouble") +fun Bar.bar() = this + +fun Bar>>.bar() = this \ No newline at end of file diff --git a/idea/testData/quickfix/addJvmNameAnnotation/extension3.kt b/idea/testData/quickfix/addJvmNameAnnotation/extension3.kt new file mode 100644 index 00000000000..a97d2398bc0 --- /dev/null +++ b/idea/testData/quickfix/addJvmNameAnnotation/extension3.kt @@ -0,0 +1,7 @@ +// "Add '@JvmName' annotation" "true" +// WITH_RUNTIME +interface Bar + +fun Bar.bar() = this + +fun Bar>>.bar() = this \ No newline at end of file diff --git a/idea/testData/quickfix/addJvmNameAnnotation/extension3.kt.after b/idea/testData/quickfix/addJvmNameAnnotation/extension3.kt.after new file mode 100644 index 00000000000..556a6ddda1a --- /dev/null +++ b/idea/testData/quickfix/addJvmNameAnnotation/extension3.kt.after @@ -0,0 +1,8 @@ +// "Add '@JvmName' annotation" "true" +// WITH_RUNTIME +interface Bar + +fun Bar.bar() = this + +@JvmName("barIntLongDoubleString") +fun Bar>>.bar() = this \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 463cce477bb..12ff3b7e264 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -879,6 +879,21 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/addJvmNameAnnotation/basic.kt"); } + @TestMetadata("extension.kt") + public void testExtension() throws Exception { + runTest("idea/testData/quickfix/addJvmNameAnnotation/extension.kt"); + } + + @TestMetadata("extension2.kt") + public void testExtension2() throws Exception { + runTest("idea/testData/quickfix/addJvmNameAnnotation/extension2.kt"); + } + + @TestMetadata("extension3.kt") + public void testExtension3() throws Exception { + runTest("idea/testData/quickfix/addJvmNameAnnotation/extension3.kt"); + } + @TestMetadata("hasAnnotation.kt") public void testHasAnnotation() throws Exception { runTest("idea/testData/quickfix/addJvmNameAnnotation/hasAnnotation.kt");