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 ede78dfcc58..02b32459093 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.idea.refactoring.fqName.isImported import org.jetbrains.kotlin.idea.references.KtSimpleNameReference import org.jetbrains.kotlin.idea.references.KtSimpleNameReference.ShorteningMode import org.jetbrains.kotlin.idea.references.mainReference +import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* @@ -123,6 +124,17 @@ fun KtElement.processInternalReferencesToUpdateOnPackageNameChange( val isExtension = isCallable && refExpr.isExtensionRef(bindingContext) val isCallableReference = isCallableReference(refExpr.mainReference) + val declaration by lazy { + var result = DescriptorToSourceUtilsIde.getAnyDeclaration(project, descriptor) ?: return@lazy null + + if (descriptor.isCompanionObject() + && bindingContext[BindingContext.SHORT_REFERENCE_TO_COMPANION_OBJECT, refExpr] != null) { + result = (result as KtObjectDeclaration).containingClassOrObject ?: result + } + + result + } + if (isCallable) { if (!isCallableReference) { if (isExtension && containingDescriptor is ClassDescriptor) { @@ -137,17 +149,11 @@ fun KtElement.processInternalReferencesToUpdateOnPackageNameChange( if (!isExtension) { if (!(containingDescriptor is PackageFragmentDescriptor - || containingDescriptor is ClassDescriptor && containingDescriptor.kind == ClassKind.OBJECT)) return null + || containingDescriptor is ClassDescriptor && containingDescriptor.kind == ClassKind.OBJECT + || descriptor is JavaCallableMemberDescriptor && ((declaration as? PsiMember)?.hasModifierProperty(PsiModifier.STATIC) ?: false))) return null } } - var declaration = DescriptorToSourceUtilsIde.getAnyDeclaration(project, descriptor) ?: return null - - if (descriptor.isCompanionObject() - && bindingContext[BindingContext.SHORT_REFERENCE_TO_COMPANION_OBJECT, refExpr] != null) { - declaration = (declaration as KtObjectDeclaration).containingClassOrObject ?: declaration - } - if (!DescriptorUtils.getFqName(descriptor).isSafe) return null val (oldContainer, newContainer) = containerChangeInfo @@ -166,6 +172,8 @@ fun KtElement.processInternalReferencesToUpdateOnPackageNameChange( val isImported = isImported(descriptor) if (isImported && this is KtFile) return null + if (declaration == null) return null + if (isExtension || containerFqName != null || isImported) return { createMoveUsageInfoIfPossible(it.mainReference, declaration, false, true) } diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticField/after/foo/J.java b/idea/testData/refactoring/copy/refToImportJavaStaticField/after/foo/J.java new file mode 100644 index 00000000000..88560d1a3b7 --- /dev/null +++ b/idea/testData/refactoring/copy/refToImportJavaStaticField/after/foo/J.java @@ -0,0 +1,5 @@ +package foo; + +public class J { + public static int JJJ = 1; +} \ No newline at end of file diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticField/after/foo/test.kt b/idea/testData/refactoring/copy/refToImportJavaStaticField/after/foo/test.kt new file mode 100644 index 00000000000..4e4fb32b49d --- /dev/null +++ b/idea/testData/refactoring/copy/refToImportJavaStaticField/after/foo/test.kt @@ -0,0 +1,7 @@ +package foo + +import foo.J.JJJ + +fun test() { + val x = JJJ +} diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticField/after/foo/test2.kt b/idea/testData/refactoring/copy/refToImportJavaStaticField/after/foo/test2.kt new file mode 100644 index 00000000000..9fdfb79e3ad --- /dev/null +++ b/idea/testData/refactoring/copy/refToImportJavaStaticField/after/foo/test2.kt @@ -0,0 +1,5 @@ +package foo + +fun test2() { + val x = J.JJJ +} \ No newline at end of file diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticField/before/foo/J.java b/idea/testData/refactoring/copy/refToImportJavaStaticField/before/foo/J.java new file mode 100644 index 00000000000..88560d1a3b7 --- /dev/null +++ b/idea/testData/refactoring/copy/refToImportJavaStaticField/before/foo/J.java @@ -0,0 +1,5 @@ +package foo; + +public class J { + public static int JJJ = 1; +} \ No newline at end of file diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticField/before/foo/test.kt b/idea/testData/refactoring/copy/refToImportJavaStaticField/before/foo/test.kt new file mode 100644 index 00000000000..cbff5af4098 --- /dev/null +++ b/idea/testData/refactoring/copy/refToImportJavaStaticField/before/foo/test.kt @@ -0,0 +1,7 @@ +package foo + +import foo.J.JJJ + +fun test() { + val x = JJJ +} diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticField/refToImportedJavaStaticField.test b/idea/testData/refactoring/copy/refToImportJavaStaticField/refToImportedJavaStaticField.test new file mode 100644 index 00000000000..7a4e0a1724d --- /dev/null +++ b/idea/testData/refactoring/copy/refToImportJavaStaticField/refToImportedJavaStaticField.test @@ -0,0 +1,5 @@ +{ + "mainFile": "foo/test.kt", + "targetPackage": "foo", + "newName": "test2" +} diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticMethod/after/foo/J.java b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/after/foo/J.java new file mode 100644 index 00000000000..d4ba52c1006 --- /dev/null +++ b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/after/foo/J.java @@ -0,0 +1,7 @@ +package foo; + +public class J { + public static void jjj() { + + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticMethod/after/foo/test.kt b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/after/foo/test.kt new file mode 100644 index 00000000000..708e4f52db0 --- /dev/null +++ b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/after/foo/test.kt @@ -0,0 +1,7 @@ +package foo + +import foo.J.jjj + +fun test() { + jjj() +} diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticMethod/after/foo/test2.kt b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/after/foo/test2.kt new file mode 100644 index 00000000000..4e269b72cc3 --- /dev/null +++ b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/after/foo/test2.kt @@ -0,0 +1,5 @@ +package foo + +fun test2() { + J.jjj() +} \ No newline at end of file diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticMethod/before/foo/J.java b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/before/foo/J.java new file mode 100644 index 00000000000..d4ba52c1006 --- /dev/null +++ b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/before/foo/J.java @@ -0,0 +1,7 @@ +package foo; + +public class J { + public static void jjj() { + + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticMethod/before/foo/test.kt b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/before/foo/test.kt new file mode 100644 index 00000000000..5f4bcff8b61 --- /dev/null +++ b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/before/foo/test.kt @@ -0,0 +1,7 @@ +package foo + +import foo.J.jjj + +fun test() { + jjj() +} diff --git a/idea/testData/refactoring/copy/refToImportJavaStaticMethod/refToImportedJavaStaticMethod.test b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/refToImportedJavaStaticMethod.test new file mode 100644 index 00000000000..7a4e0a1724d --- /dev/null +++ b/idea/testData/refactoring/copy/refToImportJavaStaticMethod/refToImportedJavaStaticMethod.test @@ -0,0 +1,5 @@ +{ + "mainFile": "foo/test.kt", + "targetPackage": "foo", + "newName": "test2" +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java index 7b56d34859f..2d1f98329f3 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/copy/CopyTestGenerated.java @@ -167,4 +167,16 @@ public class CopyTestGenerated extends AbstractCopyTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/copyTopLevelPropertyWithRename/copyTopLevelPropertyWithRename.test"); doTest(fileName); } + + @TestMetadata("refToImportJavaStaticField/refToImportedJavaStaticField.test") + public void testRefToImportJavaStaticField_RefToImportedJavaStaticField() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/refToImportJavaStaticField/refToImportedJavaStaticField.test"); + doTest(fileName); + } + + @TestMetadata("refToImportJavaStaticMethod/refToImportedJavaStaticMethod.test") + public void testRefToImportJavaStaticMethod_RefToImportedJavaStaticMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/copy/refToImportJavaStaticMethod/refToImportedJavaStaticMethod.test"); + doTest(fileName); + } }