"Change JVM name" (@JvmName) quickfix: improve name suggester for generic functions
#KT-38559 Fixed
This commit is contained in:
committed by
Yan Zhulanow
parent
5efbbdea57
commit
6868f53f46
@@ -55,9 +55,24 @@ class AddJvmNameAnnotationFix(element: KtElement, private val jvmName: String) :
|
|||||||
function,
|
function,
|
||||||
NewDeclarationNameValidator.Target.FUNCTIONS_AND_CLASSES
|
NewDeclarationNameValidator.Target.FUNCTIONS_AND_CLASSES
|
||||||
)
|
)
|
||||||
|
val receiverTypeElements = function.receiverTypeReference?.typeElements()?.joinToString("") { it.text } ?: ""
|
||||||
val jvmName = KotlinNameSuggester.suggestNameByName(functionName, nameValidator)
|
val jvmName = KotlinNameSuggester.suggestNameByName(functionName + receiverTypeElements, nameValidator)
|
||||||
return AddJvmNameAnnotationFix(function.findAnnotation(JVM_NAME_FQ_NAME) ?: function, jvmName)
|
return AddJvmNameAnnotationFix(function.findAnnotation(JVM_NAME_FQ_NAME) ?: function, jvmName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun KtTypeReference.typeElements(): List<KtTypeElement> {
|
||||||
|
val typeElements = mutableListOf<KtTypeElement>()
|
||||||
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add '@JvmName' annotation" "true"
|
||||||
|
// WITH_RUNTIME
|
||||||
|
interface Foo<T>
|
||||||
|
|
||||||
|
fun Foo<Int>.foo() = this
|
||||||
|
|
||||||
|
fun <caret>Foo<String>.foo() = this
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// "Add '@JvmName' annotation" "true"
|
||||||
|
// WITH_RUNTIME
|
||||||
|
interface Foo<T>
|
||||||
|
|
||||||
|
fun Foo<Int>.foo() = this
|
||||||
|
|
||||||
|
@JvmName("fooString")
|
||||||
|
fun Foo<String>.foo() = this
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add '@JvmName' annotation" "true"
|
||||||
|
// WITH_RUNTIME
|
||||||
|
interface Bar<T, U>
|
||||||
|
|
||||||
|
fun <caret>Bar<Int, Double>.bar() = this
|
||||||
|
|
||||||
|
fun Bar<Int, Bar<Long, Bar<Double, String>>>.bar() = this
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// "Add '@JvmName' annotation" "true"
|
||||||
|
// WITH_RUNTIME
|
||||||
|
interface Bar<T, U>
|
||||||
|
|
||||||
|
@JvmName("barIntDouble")
|
||||||
|
fun Bar<Int, Double>.bar() = this
|
||||||
|
|
||||||
|
fun Bar<Int, Bar<Long, Bar<Double, String>>>.bar() = this
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add '@JvmName' annotation" "true"
|
||||||
|
// WITH_RUNTIME
|
||||||
|
interface Bar<T, U>
|
||||||
|
|
||||||
|
fun Bar<Int, Double>.bar() = this
|
||||||
|
|
||||||
|
fun <caret>Bar<Int, Bar<Long, Bar<Double, String>>>.bar() = this
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// "Add '@JvmName' annotation" "true"
|
||||||
|
// WITH_RUNTIME
|
||||||
|
interface Bar<T, U>
|
||||||
|
|
||||||
|
fun Bar<Int, Double>.bar() = this
|
||||||
|
|
||||||
|
@JvmName("barIntLongDoubleString")
|
||||||
|
fun Bar<Int, Bar<Long, Bar<Double, String>>>.bar() = this
|
||||||
@@ -879,6 +879,21 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
|||||||
runTest("idea/testData/quickfix/addJvmNameAnnotation/basic.kt");
|
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")
|
@TestMetadata("hasAnnotation.kt")
|
||||||
public void testHasAnnotation() throws Exception {
|
public void testHasAnnotation() throws Exception {
|
||||||
runTest("idea/testData/quickfix/addJvmNameAnnotation/hasAnnotation.kt");
|
runTest("idea/testData/quickfix/addJvmNameAnnotation/hasAnnotation.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user