Fixed updating Java references on moved Kotlin top-level callables.

This commit is contained in:
Evgeny Gerashchenko
2015-03-24 18:48:23 +03:00
parent 5b05c60858
commit f789933683
60 changed files with 264 additions and 124 deletions
@@ -16,47 +16,38 @@
package org.jetbrains.kotlin.idea.refactoring.move
import com.intellij.openapi.util.Comparing
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.*
import com.intellij.refactoring.move.moveMembers.MockMoveMembersOptions
import com.intellij.refactoring.move.moveMembers.MoveMemberHandler
import com.intellij.refactoring.move.moveMembers.MoveMembersProcessor
import com.intellij.refactoring.util.MoveRenameUsageInfo
import com.intellij.refactoring.util.NonCodeUsageInfo
import com.intellij.usageView.UsageInfo
import com.intellij.util.IncorrectOperationException
import org.jetbrains.kotlin.asJava.namedUnwrappedElement
import org.jetbrains.kotlin.asJava.unwrapped
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind
import org.jetbrains.kotlin.idea.JetFileType
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
import org.jetbrains.kotlin.idea.codeInsight.JetFileReferencesResolver
import org.jetbrains.kotlin.idea.refactoring.fqName.isImported
import org.jetbrains.kotlin.idea.references.JetReference
import org.jetbrains.kotlin.idea.references.JetSimpleNameReference
import org.jetbrains.kotlin.idea.references.JetSimpleNameReference.ShorteningMode
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.*
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.idea.references.JetSimpleNameReference
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.idea.JetFileType
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
import java.util.Collections
import org.jetbrains.kotlin.idea.refactoring.fqName.isImported
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
import com.intellij.usageView.UsageInfo
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiReference
import com.intellij.refactoring.util.MoveRenameUsageInfo
import org.jetbrains.kotlin.idea.references.JetReference
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import java.util.ArrayList
import com.intellij.refactoring.util.NonCodeUsageInfo
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.idea.references.JetSimpleNameReference.ShorteningMode
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.util.Comparing
import java.util.Comparator
import com.intellij.util.IncorrectOperationException
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor
import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.idea.caches.resolve.*
import org.jetbrains.kotlin.asJava.*
import org.jetbrains.kotlin.psi.JetSuperExpression
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import java.util.ArrayList
import java.util.Collections
import java.util.Comparator
public class PackageNameInfo(val oldPackageName: FqName, val newPackageName: FqName)
@@ -171,6 +162,24 @@ public fun JetNamedDeclaration.getFileNameAfterMove(): String? {
}
}
// returns true if successful
private fun updateJavaReference(reference: PsiReferenceExpression, newElement: PsiElement): Boolean {
if (newElement is PsiMember) {
val newClass = newElement.getContainingClass()
if (newClass != null && reference.getQualifierExpression() != null) {
val mockMoveMembersOptions = MockMoveMembersOptions(newClass.getQualifiedName(), array(newElement))
val moveMembersUsageInfo = MoveMembersProcessor.MoveMembersUsageInfo(
newElement, reference.getElement(), newClass, reference.getQualifierExpression(), reference)
val moveMemberHandler = MoveMemberHandler.EP_NAME.forLanguage(reference.getElement().getLanguage())
if (moveMemberHandler != null) {
moveMemberHandler.changeExternalUsage(mockMoveMembersOptions, moveMembersUsageInfo)
return true
}
}
}
return false
}
/**
* Perform usage postprocessing and return non-code usages
*/
@@ -222,6 +231,8 @@ fun postProcessMoveUsages(usages: List<UsageInfo>,
if (it is JetSimpleNameReference) {
it.bindToElement(newElement, shorteningMode)
}
else if (it is PsiReferenceExpression && updateJavaReference(it, newElement)) {
}
else {
it.bindToElement(newElement)
}
@@ -1,15 +1,16 @@
package a;
import b.BPackage;
import b.Test;
class J {
void bar() {
Test t = new Test();
b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
BPackage.test();
BPackage.test(t);
System.out.println(BPackage.getTEST());
System.out.println(BPackage.getTEST(t));
BPackage.setTEST("");
BPackage.setTEST(t, "");
}
}
@@ -1,15 +1,16 @@
package c;
import b.BPackage;
import b.Test;
class J {
void bar() {
Test t = new Test();
b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
BPackage.test();
BPackage.test(t);
System.out.println(BPackage.getTEST());
System.out.println(BPackage.getTEST(t));
BPackage.setTEST("");
BPackage.setTEST(t, "");
}
}
@@ -1,15 +1,16 @@
package c;
import b.BPackage;
import b.Test;
class J {
void bar() {
Test t = new Test();
b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
BPackage.test();
BPackage.test(t);
System.out.println(BPackage.getTEST());
System.out.println(BPackage.getTEST(t));
BPackage.setTEST("");
BPackage.setTEST(t, "");
}
}
@@ -1,15 +1,16 @@
package c;
import b.Test;
import b.BPackage;
class J {
void bar() {
Test t = new Test();
b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
BPackage.test();
BPackage.test(t);
System.out.println(BPackage.getTEST());
System.out.println(BPackage.getTEST(t));
BPackage.setTEST("");
BPackage.setTEST(t, "");
}
}
@@ -1,7 +1,9 @@
package a;
import b.BPackage;
class J {
void bar() {
b.BPackage.test(new Test());
BPackage.test(new Test());
}
}
@@ -2,6 +2,6 @@ package b;
class J {
void bar() {
b.BPackage.test(new a.Test());
BPackage.test(new a.Test());
}
}
@@ -4,6 +4,6 @@ import a.*;
class J {
void bar() {
b.BPackage.test(new Test());
BPackage.test(new Test());
}
}
@@ -4,6 +4,6 @@ import a.Test;
class J {
void bar() {
b.BPackage.test(new Test());
BPackage.test(new Test());
}
}
@@ -1,7 +1,9 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.test(new a.Test());
BPackage.test(new a.Test());
}
}
@@ -1,9 +1,10 @@
package c;
import a.*;
import b.BPackage;
class J {
void bar() {
b.BPackage.test(new Test());
BPackage.test(new Test());
}
}
@@ -1,9 +1,10 @@
package c;
import a.Test;
import b.BPackage;
class J {
void bar() {
b.BPackage.test(new Test());
BPackage.test(new Test());
}
}
@@ -1,8 +1,10 @@
package a;
import b.BPackage;
class J {
void bar() {
b.BPackage.getTest(new Test());
b.BPackage.setTest(new Test(), 0);
BPackage.getTest(new Test());
BPackage.setTest(new Test(), 0);
}
}
@@ -2,7 +2,7 @@ package b;
class J {
void bar() {
b.BPackage.getTest(new a.Test());
b.BPackage.setTest(new a.Test(), 0);
BPackage.getTest(new a.Test());
BPackage.setTest(new a.Test(), 0);
}
}
@@ -4,7 +4,7 @@ import a.*;
class J {
void bar() {
b.BPackage.getTest(new Test());
b.BPackage.setTest(new Test(), 0);
BPackage.getTest(new Test());
BPackage.setTest(new Test(), 0);
}
}
@@ -4,7 +4,7 @@ import a.Test;
class J {
void bar() {
b.BPackage.getTest(new Test());
b.BPackage.setTest(new Test(), 0);
BPackage.getTest(new Test());
BPackage.setTest(new Test(), 0);
}
}
@@ -1,8 +1,10 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.getTest(new a.Test());
b.BPackage.setTest(new a.Test(), 0);
BPackage.getTest(new a.Test());
BPackage.setTest(new a.Test(), 0);
}
}
@@ -1,10 +1,11 @@
package c;
import a.*;
import b.BPackage;
class J {
void bar() {
b.BPackage.getTest(new Test());
b.BPackage.setTest(new Test(), 0);
BPackage.getTest(new Test());
BPackage.setTest(new Test(), 0);
}
}
@@ -1,10 +1,11 @@
package c;
import a.Test;
import b.BPackage;
class J {
void bar() {
b.BPackage.getTest(new Test());
b.BPackage.setTest(new Test(), 0);
BPackage.getTest(new Test());
BPackage.setTest(new Test(), 0);
}
}
@@ -1,7 +1,9 @@
package a;
import b.BPackage;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -2,6 +2,6 @@ package b;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -2,6 +2,6 @@ package b;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -2,6 +2,6 @@ package b;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -1,7 +1,9 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -1,7 +1,9 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -1,7 +1,9 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -1,7 +1,9 @@
package a;
import b.BPackage;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -2,6 +2,6 @@ package b;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -2,6 +2,6 @@ package b;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -2,6 +2,6 @@ package b;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -1,7 +1,9 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -1,7 +1,9 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -1,7 +1,9 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.test();
BPackage.test();
}
}
@@ -0,0 +1,7 @@
import newPackage.NewPackagePackage;
class JavaUsage {
public static void main(String[] args) {
NewPackagePackage.foo();
}
}
@@ -0,0 +1,7 @@
import oldPackage.OldPackagePackage;
class JavaUsage {
public static void main(String[] args) {
OldPackagePackage.foo();
}
}
@@ -0,0 +1,8 @@
package oldPackage
fun <caret>foo() {
}
fun other() {
}
@@ -0,0 +1,5 @@
{
"mainFile": "oldPackage/fun.kt",
"type": "MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS",
"targetPackage": "newPackage"
}
@@ -0,0 +1,9 @@
// TODO Import of old package stays here because of a bug
import newPackage.NewPackagePackage;
import oldPackage.OldPackagePackage;
class JavaUsage {
public static void main(String[] args) {
NewPackagePackage.foo();
}
}
@@ -0,0 +1,8 @@
// TODO Import of old package stays here because of a bug
import oldPackage.OldPackagePackage;
class JavaUsage {
public static void main(String[] args) {
OldPackagePackage.foo();
}
}
@@ -0,0 +1,5 @@
package oldPackage
fun <caret>foo() {
}
@@ -0,0 +1,5 @@
{
"mainFile": "oldPackage/fun.kt",
"type": "MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS",
"targetPackage": "newPackage"
}
@@ -1,8 +1,10 @@
package a;
import b.BPackage;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -2,7 +2,7 @@ package b;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -2,7 +2,7 @@ package b;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -2,7 +2,7 @@ package b;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -1,8 +1,10 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -1,8 +1,10 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -1,8 +1,10 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -1,8 +1,10 @@
package a;
import b.BPackage;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -2,7 +2,7 @@ package b;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -2,7 +2,7 @@ package b;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -2,7 +2,7 @@ package b;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -1,8 +1,10 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -1,8 +1,10 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -1,8 +1,10 @@
package c;
import b.BPackage;
class J {
void bar() {
b.BPackage.setTest("");
System.out.println(b.BPackage.getTest());
BPackage.setTest("");
System.out.println(BPackage.getTest());
}
}
@@ -336,6 +336,12 @@ public class JetMoveTestGenerated extends AbstractJetMoveTest {
doTest(fileName);
}
@TestMetadata("kotlin/moveTopLevelDeclarations/moveFunctionToPackageUsedInJava/moveFunctionToPackageUsedInJava.test")
public void testKotlin_moveTopLevelDeclarations_moveFunctionToPackageUsedInJava_MoveFunctionToPackageUsedInJava() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackageUsedInJava/moveFunctionToPackageUsedInJava.test");
doTest(fileName);
}
@TestMetadata("kotlin/moveTopLevelDeclarations/moveFunctionToPackageWithConflicts/moveFunctionToPackageWithConflicts.test")
public void testKotlin_moveTopLevelDeclarations_moveFunctionToPackageWithConflicts_MoveFunctionToPackageWithConflicts() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToPackageWithConflicts/moveFunctionToPackageWithConflicts.test");
@@ -360,6 +366,12 @@ public class JetMoveTestGenerated extends AbstractJetMoveTest {
doTest(fileName);
}
@TestMetadata("kotlin/moveTopLevelDeclarations/moveOnlyFunctionToPackageUsedInJava/moveOnlyFunctionToPackageUsedInJava.test")
public void testKotlin_moveTopLevelDeclarations_moveOnlyFunctionToPackageUsedInJava_MoveOnlyFunctionToPackageUsedInJava() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveOnlyFunctionToPackageUsedInJava/moveOnlyFunctionToPackageUsedInJava.test");
doTest(fileName);
}
@TestMetadata("kotlin/moveTopLevelDeclarations/movePropertyToFile/movePropertyToFile.test")
public void testKotlin_moveTopLevelDeclarations_movePropertyToFile_MovePropertyToFile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/movePropertyToFile/movePropertyToFile.test");