Move: Fix ClassCastException on processing of callable references to Java methods
#KT-16809 Fixed
diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveUtils.kt
index 16f4d202..9a014ff 100644
--- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveUtils.kt
+++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveUtils.kt
@@ -42,6 +42,7 @@
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully
+import org.jetbrains.kotlin.idea.caches.resolve.getJavaMemberDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
import org.jetbrains.kotlin.idea.codeInsight.KotlinFileReferencesResolver
@@ -354,8 +355,13 @@
is UnqualifiableMoveRenameUsageInfo -> {
val file = with(usage) { if (addImportToOriginalFile) originalFile else counterpart(originalFile) } as KtFile
- val declaration = counterpart(usage.referencedElement!!).unwrapped as KtDeclaration
- ImportInsertHelper.getInstance(usage.project).importDescriptor(file, declaration.resolveToDescriptor())
+ val declaration = counterpart(usage.referencedElement!!).unwrapped
+ val referencedDescriptor = when (declaration) {
+ is KtDeclaration -> declaration.resolveToDescriptor()
+ is PsiMember -> declaration.getJavaMemberDescriptor()
+ else -> null
+ } ?: continue@usageLoop
+ ImportInsertHelper.getInstance(usage.project).importDescriptor(file, referencedDescriptor)
}
is MoveRenameUsageInfo -> {
diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/after/source/Foo.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/after/source/Foo.kt
new file mode 100644
index 0000000..fdcb9d1
--- /dev/null
+++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/after/source/Foo.kt
@@ -0,0 +1,4 @@
+package source
+
+fun test() = J::bar
+
diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/after/source/J.java b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/after/source/J.java
new file mode 100644
index 0000000..179df86
--- /dev/null
+++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/after/source/J.java
@@ -0,0 +1,7 @@
+package source;
+
+public class J {
+ public static void bar() {
+
+ }
+}
\ No newline at end of file
diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/after/target/Test.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/after/target/Test.kt
new file mode 100644
index 0000000..34ad565
--- /dev/null
+++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/after/target/Test.kt
@@ -0,0 +1,7 @@
+package target
+
+import source.J.bar
+
+class Test {
+ val x = J::bar
+}
\ No newline at end of file
diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/before/source/Foo.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/before/source/Foo.kt
new file mode 100644
index 0000000..8b9734b
--- /dev/null
+++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/before/source/Foo.kt
@@ -0,0 +1,7 @@
+package source
+
+fun test() = J::bar
+
+class <caret>Test {
+ val x = J::bar
+}
\ No newline at end of file
diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/before/source/J.java b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/before/source/J.java
new file mode 100644
index 0000000..179df86
--- /dev/null
+++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/before/source/J.java
@@ -0,0 +1,7 @@
+package source;
+
+public class J {
+ public static void bar() {
+
+ }
+}
\ No newline at end of file
diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/callableRefToJavaMethod.test b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/callableRefToJavaMethod.test
new file mode 100644
index 0000000..1a649bb
--- /dev/null
+++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/callableRefToJavaMethod.test
@@ -0,0 +1,5 @@
+{
+ "mainFile": "source/Foo.kt",
+ "type": "MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS",
+ "targetPackage": "target"
+}
diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java
index f0dd610..41adc91 100644
--- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java
+++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java
@@ -420,6 +420,12 @@
doTest(fileName);
}
+ @TestMetadata("kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/callableRefToJavaMethod.test")
+ public void testKotlin_moveTopLevelDeclarations_misc_callableReftoJavaMethod_CallableRefToJavaMethod() throws Exception {
+ String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/callableReftoJavaMethod/callableRefToJavaMethod.test");
+ doTest(fileName);
+ }
+
@TestMetadata("kotlin/moveTopLevelDeclarations/misc/companionExtensionMemberRef/companionExtensionMemberRef.test")
public void testKotlin_moveTopLevelDeclarations_misc_companionExtensionMemberRef_CompanionExtensionMemberRef() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/companionExtensionMemberRef/companionExtensionMemberRef.test");