Do not insert type parameters when replacing javaClass with T::class
Type parameters are invalid for class literal unless class is `Array`
This commit is contained in:
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.kotlin.idea.quickfix.replaceJavaClass
|
package org.jetbrains.kotlin.idea.quickfix.replaceJavaClass
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
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.psi.psiUtil.isAncestor
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
|
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.isArrayOfJavaLangClass
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isJavaLangClass
|
import org.jetbrains.kotlin.types.typeUtil.isJavaLangClass
|
||||||
|
|
||||||
@@ -51,6 +53,16 @@ private class JavaClassParameterReplacementTask(
|
|||||||
override val element: JetElement = typeReference
|
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<ReplacementTask> {
|
fun createReplacementTasks(element: JetElement, anyJavaClass: Boolean = false): List<ReplacementTask> {
|
||||||
val replacementTasks = arrayListOf<ReplacementTask>()
|
val replacementTasks = arrayListOf<ReplacementTask>()
|
||||||
|
|
||||||
@@ -64,7 +76,7 @@ fun createReplacementTasks(element: JetElement, anyJavaClass: Boolean = false):
|
|||||||
if (returnType.isJavaLangClass()) {
|
if (returnType.isJavaLangClass()) {
|
||||||
val inferredType = returnType.getArguments().firstOrNull()?.getType() ?: return
|
val inferredType = returnType.getArguments().firstOrNull()?.getType() ?: return
|
||||||
if (inferredType.isError()) return
|
if (inferredType.isError()) return
|
||||||
val renderedType = IdeDescriptorRenderers.SOURCE_CODE.renderType(inferredType)
|
val renderedType = renderClassNameForKClassLiteral(inferredType) ?: return
|
||||||
replacementTasks.add(JavaClassCallReplacementTask(expression, renderedType))
|
replacementTasks.add(JavaClassCallReplacementTask(expression, renderedType))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
+1
-1
@@ -16,7 +16,7 @@ Ann2(arg = array(Double::class)) class MyClass3 [Ann1(Char::class)] () {
|
|||||||
Ann3(String::class) class Nested {
|
Ann3(String::class) class Nested {
|
||||||
Ann1(arg = String::class) fun foo1() {
|
Ann1(arg = String::class) fun foo1() {
|
||||||
annotation class LocalAnn(val arg: KClass<*>)
|
annotation class LocalAnn(val arg: KClass<*>)
|
||||||
[LocalAnn(Class<*>::class)] val x = 1
|
[LocalAnn(Class::class)] val x = 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// "Replace javaClass<T>() 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<String>::class) class MyClass4
|
||||||
|
Ann(Array<*>::class) class MyClass5
|
||||||
|
Ann(Array<in String>::class) class MyClass6
|
||||||
|
|
||||||
|
class Outer<T> {
|
||||||
|
Ann(Array<T>::class)
|
||||||
|
class Nested
|
||||||
|
}
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// "Replace javaClass<T>() with T::class in whole project" "true"
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
Ann(javaClass<List<String>><caret>()) class MyClass1
|
||||||
|
Ann(javaClass<List<*>>()) class MyClass2
|
||||||
|
Ann(javaClass<MutableList<in String>>()) class MyClass3
|
||||||
|
|
||||||
|
Ann(javaClass<Array<String>>()) class MyClass4
|
||||||
|
Ann(javaClass<Array<*>>()) class MyClass5
|
||||||
|
Ann(javaClass<Array<in String>>()) class MyClass6
|
||||||
|
|
||||||
|
class Outer<T> {
|
||||||
|
Ann(javaClass<Array<T>>())
|
||||||
|
class Nested
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
public @interface Ann {
|
||||||
|
Class<?> value();
|
||||||
|
}
|
||||||
@@ -983,6 +983,12 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes
|
|||||||
doTestWithExtraFile(fileName);
|
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")
|
@TestMetadata("implicitParameterMultiple.before.Main.kt")
|
||||||
public void testImplicitParameterMultiple() throws Exception {
|
public void testImplicitParameterMultiple() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/migration/replaceJavaClassWithKClassForJavaAnnotation/implicitParameterMultiple.before.Main.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/migration/replaceJavaClassWithKClassForJavaAnnotation/implicitParameterMultiple.before.Main.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user