diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceJavaClass/common.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceJavaClass/common.kt index 103693a5901..9e7424563ba 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceJavaClass/common.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceJavaClass/common.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.quickfix.replaceJavaClass import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.idea.caches.resolve.analyze @@ -32,6 +33,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.isAncestor import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm +import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.types.typeUtil.isArrayOfJavaLangClass import org.jetbrains.kotlin.types.typeUtil.isJavaLangClass @@ -51,6 +53,16 @@ private class JavaClassParameterReplacementTask( override val element: JetElement = typeReference } +private fun renderClassNameForKClassLiteral(type: JetType): String? { + val descriptorRenderer = IdeDescriptorRenderers.SOURCE_CODE + if (KotlinBuiltIns.isArray(type)) { + return descriptorRenderer.renderType(type) + } + + val classDescriptor = (type.getConstructor().getDeclarationDescriptor() as? ClassDescriptor) ?: return null + return descriptorRenderer.renderClassifierName(classDescriptor) +} + fun createReplacementTasks(element: JetElement, anyJavaClass: Boolean = false): List { val replacementTasks = arrayListOf() @@ -64,7 +76,7 @@ fun createReplacementTasks(element: JetElement, anyJavaClass: Boolean = false): if (returnType.isJavaLangClass()) { val inferredType = returnType.getArguments().firstOrNull()?.getType() ?: return if (inferredType.isError()) return - val renderedType = IdeDescriptorRenderers.SOURCE_CODE.renderType(inferredType) + val renderedType = renderClassNameForKClassLiteral(inferredType) ?: return replacementTasks.add(JavaClassCallReplacementTask(expression, renderedType)) } }) diff --git a/idea/testData/quickfix/migration/replaceJavaClassAsAnnotationParameter/manyFilesMultiple.after.kt b/idea/testData/quickfix/migration/replaceJavaClassAsAnnotationParameter/manyFilesMultiple.after.kt index ab3d945db7f..fe4f68a886a 100644 --- a/idea/testData/quickfix/migration/replaceJavaClassAsAnnotationParameter/manyFilesMultiple.after.kt +++ b/idea/testData/quickfix/migration/replaceJavaClassAsAnnotationParameter/manyFilesMultiple.after.kt @@ -16,7 +16,7 @@ Ann2(arg = array(Double::class)) class MyClass3 [Ann1(Char::class)] () { Ann3(String::class) class Nested { Ann1(arg = String::class) fun foo1() { annotation class LocalAnn(val arg: KClass<*>) - [LocalAnn(Class<*>::class)] val x = 1 + [LocalAnn(Class::class)] val x = 1 } } diff --git a/idea/testData/quickfix/migration/replaceJavaClassWithKClassForJavaAnnotation/genericArgumentMultiple.after.kt b/idea/testData/quickfix/migration/replaceJavaClassWithKClassForJavaAnnotation/genericArgumentMultiple.after.kt new file mode 100644 index 00000000000..0eabb835ac1 --- /dev/null +++ b/idea/testData/quickfix/migration/replaceJavaClassWithKClassForJavaAnnotation/genericArgumentMultiple.after.kt @@ -0,0 +1,15 @@ +// "Replace javaClass() with T::class in whole project" "true" +// WITH_RUNTIME + +Ann(List::class) class MyClass1 +Ann(List::class) class MyClass2 +Ann(MutableList::class) class MyClass3 + +Ann(Array::class) class MyClass4 +Ann(Array<*>::class) class MyClass5 +Ann(Array::class) class MyClass6 + +class Outer { + Ann(Array::class) + class Nested +} diff --git a/idea/testData/quickfix/migration/replaceJavaClassWithKClassForJavaAnnotation/genericArgumentMultiple.before.Main.kt b/idea/testData/quickfix/migration/replaceJavaClassWithKClassForJavaAnnotation/genericArgumentMultiple.before.Main.kt new file mode 100644 index 00000000000..6191e5b0986 --- /dev/null +++ b/idea/testData/quickfix/migration/replaceJavaClassWithKClassForJavaAnnotation/genericArgumentMultiple.before.Main.kt @@ -0,0 +1,15 @@ +// "Replace javaClass() with T::class in whole project" "true" +// WITH_RUNTIME + +Ann(javaClass>()) class MyClass1 +Ann(javaClass>()) class MyClass2 +Ann(javaClass>()) class MyClass3 + +Ann(javaClass>()) class MyClass4 +Ann(javaClass>()) class MyClass5 +Ann(javaClass>()) class MyClass6 + +class Outer { + Ann(javaClass>()) + class Nested +} diff --git a/idea/testData/quickfix/migration/replaceJavaClassWithKClassForJavaAnnotation/genericArgumentMultiple.before.data.Sample.java b/idea/testData/quickfix/migration/replaceJavaClassWithKClassForJavaAnnotation/genericArgumentMultiple.before.data.Sample.java new file mode 100644 index 00000000000..fc6ee8c06e4 --- /dev/null +++ b/idea/testData/quickfix/migration/replaceJavaClassWithKClassForJavaAnnotation/genericArgumentMultiple.before.data.Sample.java @@ -0,0 +1,3 @@ +public @interface Ann { + Class value(); +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java index 13e2e6c0a57..d520aa4b33c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -983,6 +983,12 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes doTestWithExtraFile(fileName); } + @TestMetadata("genericArgumentMultiple.before.Main.kt") + public void testGenericArgumentMultiple() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/migration/replaceJavaClassWithKClassForJavaAnnotation/genericArgumentMultiple.before.Main.kt"); + doTestWithExtraFile(fileName); + } + @TestMetadata("implicitParameterMultiple.before.Main.kt") public void testImplicitParameterMultiple() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/migration/replaceJavaClassWithKClassForJavaAnnotation/implicitParameterMultiple.before.Main.kt");