Move: Do not update Kotlin usages of extension members, add imports instead

#KT-5378 Fixed
This commit is contained in:
Alexey Sedunov
2014-07-10 21:11:28 +04:00
parent 99ecb82ce0
commit 17dd5b9d05
112 changed files with 1061 additions and 5 deletions
@@ -38,8 +38,6 @@ import com.intellij.psi.PsiDirectory
import org.jetbrains.jet.lang.psi.psiUtil.getPackage
import org.jetbrains.jet.lang.psi.JetFile
import org.jetbrains.jet.plugin.refactoring.move.PackageNameInfo
import org.jetbrains.jet.lang.psi.JetPsiUtil
import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.plugin.refactoring.createKotlinFile
import org.jetbrains.jet.plugin.refactoring.move.updateInternalReferencesOnPackageNameChange
import org.jetbrains.jet.plugin.codeInsight.addToShorteningWaitSet
@@ -52,7 +50,6 @@ import java.util.ArrayList
import java.util.HashSet
import com.intellij.psi.PsiReference
import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.refactoring.util.MoveRenameUsageInfo
import com.intellij.refactoring.util.TextOccurrencesUtil
import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassHandler
@@ -72,6 +69,11 @@ import com.intellij.openapi.util.Ref
import org.jetbrains.jet.plugin.refactoring.getKotlinFqName
import org.jetbrains.jet.plugin.references.JetSimpleNameReference.ShorteningMode
import org.jetbrains.jet.plugin.search.projectScope
import org.jetbrains.jet.lang.psi.psiUtil.isExtensionDeclaration
import org.jetbrains.jet.plugin.references.JetReference
import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType
import org.jetbrains.jet.lang.psi.JetImportDirective
public class MoveKotlinTopLevelDeclarationsOptions(
val elementsToMove: Collection<JetNamedDeclaration>,
@@ -81,6 +83,14 @@ public class MoveKotlinTopLevelDeclarationsOptions(
val moveCallback: MoveCallback? = null
)
class MoveRenameUsageInfoForExtension(
element: PsiElement,
reference: PsiReference,
startOffset: Int,
endOffset: Int,
referencedElement: PsiElement
): MoveRenameUsageInfo(element, reference, startOffset, endOffset, referencedElement, false)
public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val options: MoveKotlinTopLevelDeclarationsOptions) : BaseRefactoringProcessor(project) {
class object {
private val LOG: Logger = Logger.getInstance(javaClass<MoveKotlinTopLevelDeclarationsProcessor>())
@@ -101,6 +111,21 @@ public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val optio
}
override fun findUsages(): Array<UsageInfo> {
fun createUsageInfo(
element: PsiElement,
reference: PsiReference,
startOffset: Int,
endOffset: Int,
referencedElement: PsiElement
): UsageInfo {
if (reference is JetReference
&& referencedElement.namedUnwrappedElement!!.isExtensionDeclaration()
&& element.getParentByType(javaClass<JetImportDirective>()) == null) {
return MoveRenameUsageInfoForExtension(element, reference, startOffset, endOffset, referencedElement)
}
return MoveRenameUsageInfo(element, reference, startOffset, endOffset, referencedElement, false)
}
val newPackageName = options.moveTarget.packageWrapper?.getQualifiedName() ?: ""
fun collectUsages(): List<UsageInfo> {
@@ -114,7 +139,7 @@ public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val optio
.mapTo(ArrayList<UsageInfo?>()) { ref ->
if (foundReferences.add(ref)) {
val range = ref.getRangeInElement()!!
MoveRenameUsageInfo(ref.getElement(), ref, range.getStartOffset(), range.getEndOffset(), lightElement, false)
createUsageInfo(ref.getElement(), ref, range.getStartOffset(), range.getEndOffset(), lightElement)
}
else null
}
@@ -274,7 +299,20 @@ public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val optio
}
}
nonCodeUsages = CommonMoveUtil.retargetUsages(usages, oldToNewElementsMapping)
if (usages == null) return
nonCodeUsages = CommonMoveUtil.retargetUsages(
usages.filter { it !is MoveRenameUsageInfoForExtension }.copyToArray(),
oldToNewElementsMapping
)
for (usage in usages.filterIsInstance(javaClass<MoveRenameUsageInfoForExtension>())) {
val newElement = oldToNewElementsMapping[usage.getReferencedElement()]
ImportInsertHelper.addImportDirectiveIfNeeded(
newElement!!.getKotlinFqName()!!,
usage.getElement()!!.getContainingFile() as JetFile
)
}
}
catch (e: IncorrectOperationException) {
nonCodeUsages = null