File Move: Fix update of extension references. Reuse MoveKotlinTopLevelDeclarationsProcessor
This commit is contained in:
@@ -21,4 +21,8 @@
|
||||
<item name='com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler void updateMovedFile(com.intellij.psi.PsiFile) 0'>
|
||||
<annotation name='org.jetbrains.annotations.NotNull'/>
|
||||
</item>
|
||||
<item
|
||||
name='com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler$1 void retargetUsages(java.util.List<com.intellij.usageView.UsageInfo>, java.util.Map<com.intellij.psi.PsiElement,com.intellij.psi.PsiElement>) 0'>
|
||||
<annotation name='org.jetbrains.annotations.NotNull'/>
|
||||
</item>
|
||||
</root>
|
||||
+26
-19
@@ -29,6 +29,9 @@ import com.intellij.psi.SmartPointerManager
|
||||
import org.jetbrains.jet.lang.psi.JetElement
|
||||
import org.jetbrains.jet.lang.psi.JetQualifiedExpression
|
||||
import org.jetbrains.jet.lang.psi.JetUserType
|
||||
import org.jetbrains.jet.lang.psi.JetFile
|
||||
import org.jetbrains.jet.lang.psi.UserDataProperty
|
||||
import org.jetbrains.jet.lang.psi.NotNullableUserDataProperty
|
||||
|
||||
public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper<Any> {
|
||||
private val LOG = Logger.getInstance(javaClass<KotlinShortenReferencesRefactoringHelper>().getCanonicalName())
|
||||
@@ -36,10 +39,10 @@ public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper<Any> {
|
||||
override fun prepareOperation(usages: Array<out UsageInfo>?): Any? {
|
||||
if (usages != null && usages.isNotEmpty()) {
|
||||
val project = usages[0].getProject()
|
||||
val elementsToShorten = project.getElementsToShorten(false)
|
||||
if (elementsToShorten != null && !elementsToShorten.isEmpty()) {
|
||||
val elementsToShorten = project.elementsToShorten
|
||||
if (project.ensureElementsToShortenIsEmptyBeforeRefactoring && elementsToShorten != null && !elementsToShorten.isEmpty()) {
|
||||
LOG.warn("Waiting set for reference shortening is not empty")
|
||||
project.clearElementsToShorten()
|
||||
project.elementsToShorten = null
|
||||
}
|
||||
}
|
||||
return null
|
||||
@@ -47,32 +50,36 @@ public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper<Any> {
|
||||
|
||||
override fun performOperation(project: Project, operationData: Any?) {
|
||||
ApplicationManager.getApplication()!!.runWriteAction {
|
||||
project.getElementsToShorten(false)?.let { bindRequests ->
|
||||
project.clearElementsToShorten()
|
||||
project.elementsToShorten?.let { bindRequests ->
|
||||
project.elementsToShorten = null
|
||||
ShortenReferences.process(bindRequests.map() { it.getElement() }.filterNotNull())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private val ELEMENTS_TO_SHORTEN_KEY = Key.create<MutableSet<SmartPsiElementPointer<JetElement>>>("ELEMENTS_TO_SHORTEN_KEY")
|
||||
private var Project.elementsToShorten: MutableSet<SmartPsiElementPointer<JetElement>>?
|
||||
by UserDataProperty(Key.create("ELEMENTS_TO_SHORTEN_KEY"))
|
||||
|
||||
private fun Project.getElementsToShorten(createIfNeeded: Boolean): MutableSet<SmartPsiElementPointer<JetElement>>? {
|
||||
var elementsToShorten = getUserData(ELEMENTS_TO_SHORTEN_KEY)
|
||||
if (createIfNeeded && elementsToShorten == null) {
|
||||
elementsToShorten = HashSet()
|
||||
putUserData(ELEMENTS_TO_SHORTEN_KEY, elementsToShorten)
|
||||
/*
|
||||
* When one refactoring invokes another this value must be set to false so that shortening wait-set is not cleared
|
||||
* and previously collected references are processed correctly. Afterwards it must be reset to original value
|
||||
*/
|
||||
public var Project.ensureElementsToShortenIsEmptyBeforeRefactoring: Boolean
|
||||
by NotNullableUserDataProperty(Key.create("ENSURE_ELEMENTS_TO_SHORTEN_IS_EMPTY"), true)
|
||||
|
||||
private fun Project.getOrCreateElementsToShorten(): MutableSet<SmartPsiElementPointer<JetElement>> {
|
||||
var elements = elementsToShorten
|
||||
if (elements == null) {
|
||||
elements = HashSet()
|
||||
elementsToShorten = elements
|
||||
}
|
||||
|
||||
return elements!!
|
||||
}
|
||||
|
||||
return elementsToShorten
|
||||
}
|
||||
|
||||
private fun Project.clearElementsToShorten() {
|
||||
putUserData(ELEMENTS_TO_SHORTEN_KEY, null)
|
||||
}
|
||||
|
||||
public fun JetElement.addToShorteningWaitSet() {
|
||||
assert (ApplicationManager.getApplication()!!.isWriteAccessAllowed(), "Write access needed")
|
||||
val project = getProject()
|
||||
project.getElementsToShorten(true)!!.add(SmartPointerManager.getInstance(project).createSmartPsiElementPointer(this))
|
||||
project.getOrCreateElementsToShorten().add(SmartPointerManager.getInstance(project).createSmartPsiElementPointer(this))
|
||||
}
|
||||
|
||||
+53
-113
@@ -24,59 +24,27 @@ import com.intellij.usageView.UsageInfo
|
||||
import com.intellij.openapi.roots.JavaProjectRootsUtil
|
||||
import com.intellij.psi.PsiCompiledElement
|
||||
import org.jetbrains.jet.lang.psi.JetFile
|
||||
import java.util.ArrayList
|
||||
import com.intellij.psi.search.searches.ReferencesSearch
|
||||
import com.intellij.refactoring.util.MoveRenameUsageInfo
|
||||
import org.jetbrains.jet.lang.psi.JetNamedDeclaration
|
||||
import com.intellij.openapi.util.text.StringUtil
|
||||
import com.intellij.psi.PsiReference
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName
|
||||
import org.jetbrains.jet.plugin.references.JetSimpleNameReference
|
||||
import com.intellij.openapi.util.Key
|
||||
import org.jetbrains.jet.plugin.refactoring.getAndRemoveCopyableUserData
|
||||
import org.jetbrains.jet.lang.psi.psiUtil.getPackage
|
||||
import org.jetbrains.jet.plugin.references.JetReference
|
||||
import org.jetbrains.jet.asJava.toLightElements
|
||||
import org.jetbrains.jet.lang.psi.JetDeclaration
|
||||
import com.intellij.openapi.util.TextRange
|
||||
import com.intellij.openapi.diagnostic.Logger
|
||||
import org.jetbrains.jet.lang.psi.JetClassOrObject
|
||||
import org.jetbrains.jet.plugin.search.usagesSearch.descriptor
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils
|
||||
import com.intellij.refactoring.util.TextOccurrencesUtil
|
||||
import java.util.Collections
|
||||
import org.jetbrains.jet.plugin.refactoring.move.PackageNameInfo
|
||||
import org.jetbrains.jet.plugin.search.projectScope
|
||||
import org.jetbrains.jet.plugin.search.fileScope
|
||||
import org.jetbrains.jet.plugin.search.minus
|
||||
import org.jetbrains.jet.plugin.refactoring.move.getInternalReferencesToUpdateOnPackageNameChange
|
||||
import org.jetbrains.jet.plugin.refactoring.move.postProcessMoveUsages
|
||||
import org.jetbrains.jet.plugin.codeInsight.addToShorteningWaitSet
|
||||
import org.jetbrains.jet.plugin.refactoring.move.moveTopLevelDeclarations.MoveKotlinTopLevelDeclarationsProcessor
|
||||
import org.jetbrains.jet.plugin.refactoring.move.moveTopLevelDeclarations.MoveKotlinTopLevelDeclarationsOptions
|
||||
import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil
|
||||
import org.jetbrains.jet.plugin.refactoring.move.moveTopLevelDeclarations.DeferredJetFileKotlinMoveTarget
|
||||
import org.jetbrains.jet.plugin.refactoring.move.moveTopLevelDeclarations.Mover
|
||||
import org.jetbrains.jet.plugin.codeInsight.ensureElementsToShortenIsEmptyBeforeRefactoring
|
||||
|
||||
public class MoveKotlinFileHandler : MoveFileHandler() {
|
||||
class object {
|
||||
private val LOG = Logger.getInstance(javaClass<MoveKotlinFileHandler>())
|
||||
private var packageNameInfo: PackageNameInfo? = null
|
||||
private var declarationMoveProcessor: MoveKotlinTopLevelDeclarationsProcessor? = null
|
||||
|
||||
class MoveRenameKotlinUsageInfo(
|
||||
reference: JetSimpleNameReference,
|
||||
range: TextRange,
|
||||
referencedElement: JetDeclaration,
|
||||
val newFqName: FqName
|
||||
) : MoveRenameUsageInfo(reference.getElement(), reference, range.getStartOffset(), range.getEndOffset(), referencedElement, false) {
|
||||
val jetReference: JetSimpleNameReference get() = getReference() as JetSimpleNameReference
|
||||
}
|
||||
|
||||
class MoveRenameJavaUsageInfo(
|
||||
reference: PsiReference,
|
||||
range: TextRange,
|
||||
referencedElement: JetDeclaration,
|
||||
val lightElementIndex: Int
|
||||
) : MoveRenameUsageInfo(reference.getElement(), reference, range.getStartOffset(), range.getEndOffset(), referencedElement, false) {
|
||||
val jetDeclaration: JetDeclaration get() = getReferencedElement() as JetDeclaration
|
||||
}
|
||||
|
||||
private val PACKAGE_NAME_INFO_KEY =
|
||||
Key.create<PackageNameInfo>("${javaClass<MoveKotlinFileHandler>().getCanonicalName()}.PACKAGE_NAME_INFO_KEY")
|
||||
private fun clearState() {
|
||||
packageNameInfo = null
|
||||
declarationMoveProcessor = null
|
||||
}
|
||||
|
||||
private fun JetFile.packageMatchesDirectory(): Boolean {
|
||||
@@ -88,95 +56,52 @@ public class MoveKotlinFileHandler : MoveFileHandler() {
|
||||
return !JavaProjectRootsUtil.isOutsideJavaSourceRoot(element)
|
||||
}
|
||||
|
||||
override fun prepareMovedFile(file: PsiFile, moveDestination: PsiDirectory, oldToNewMap: Map<PsiElement, PsiElement>) {
|
||||
if (file is JetFile && file.packageMatchesDirectory()) {
|
||||
val newPackage = moveDestination.getPackage()
|
||||
if (newPackage != null) {
|
||||
file.putCopyableUserData(
|
||||
PACKAGE_NAME_INFO_KEY,
|
||||
PackageNameInfo(file.getPackageFqName(), FqName(newPackage.getQualifiedName()))
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun findUsages(
|
||||
psiFile: PsiFile,
|
||||
newParent: PsiDirectory,
|
||||
searchInComments: Boolean,
|
||||
searchInNonJavaFiles: Boolean
|
||||
): List<UsageInfo>? {
|
||||
clearState()
|
||||
|
||||
if (psiFile !is JetFile || !psiFile.packageMatchesDirectory()) return null
|
||||
|
||||
val newPackage = newParent.getPackage()
|
||||
if (newPackage == null) return null
|
||||
|
||||
val packageNameInfo = PackageNameInfo(psiFile.getPackageFqName(), FqName(newPackage.getQualifiedName()))
|
||||
val project = psiFile.getProject()
|
||||
val newPackageName = newParent.getPackage()?.getQualifiedName() ?: ""
|
||||
|
||||
val searchScope = project.projectScope() - psiFile.fileScope()
|
||||
return psiFile.getDeclarations().flatMap { declaration ->
|
||||
val name = (declaration as? JetNamedDeclaration)?.getName()
|
||||
if (name != null) {
|
||||
val newFqName = StringUtil.getQualifiedName(newPackageName, name)!!
|
||||
|
||||
val results = ReferencesSearch.search(declaration, searchScope, false)
|
||||
.toSet()
|
||||
.mapTo(ArrayList<UsageInfo?>()) { ref ->
|
||||
val range = ref.getRangeInElement()!!
|
||||
|
||||
when (ref) {
|
||||
is JetSimpleNameReference ->
|
||||
MoveRenameKotlinUsageInfo(ref, range, declaration, FqName(newFqName))
|
||||
is JetReference ->
|
||||
// Can't rebind other JetReferences
|
||||
null
|
||||
else -> {
|
||||
val lightElementWithIndex =
|
||||
declaration.toLightElements().withIndices().find { p -> ref.isReferenceTo(p.second) }
|
||||
if (lightElementWithIndex != null && lightElementWithIndex.first >= 0) {
|
||||
MoveRenameJavaUsageInfo(ref, range, declaration, lightElementWithIndex.first)
|
||||
}
|
||||
else null
|
||||
}
|
||||
}
|
||||
}
|
||||
.filterNotNull()
|
||||
if (declaration is JetClassOrObject) {
|
||||
declaration.descriptor?.let { DescriptorUtils.getFqName(it).asString() }?.let { stringToSearch ->
|
||||
TextOccurrencesUtil.findNonCodeUsages(
|
||||
declaration, stringToSearch, searchInComments, searchInNonJavaFiles, newFqName, results
|
||||
)
|
||||
}
|
||||
val declarationMoveProcessor = MoveKotlinTopLevelDeclarationsProcessor(
|
||||
project,
|
||||
MoveKotlinTopLevelDeclarationsOptions(
|
||||
elementsToMove = psiFile.getDeclarations().filterIsInstance(javaClass<JetNamedDeclaration>()),
|
||||
moveTarget = DeferredJetFileKotlinMoveTarget(project, packageNameInfo.newPackageName) {
|
||||
MoveFilesOrDirectoriesUtil.doMoveFile(psiFile, newParent)
|
||||
newParent.findFile(psiFile.getName()) as? JetFile
|
||||
},
|
||||
updateInternalReferences = false
|
||||
),
|
||||
object: Mover {
|
||||
[suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")]
|
||||
override fun invoke(originalElement: JetNamedDeclaration, targetFile: JetFile): JetNamedDeclaration = originalElement
|
||||
}
|
||||
)
|
||||
|
||||
results
|
||||
}
|
||||
else Collections.emptyList<UsageInfo>()
|
||||
}
|
||||
this.packageNameInfo = packageNameInfo
|
||||
this.declarationMoveProcessor = declarationMoveProcessor
|
||||
|
||||
return declarationMoveProcessor.findUsages().toList()
|
||||
}
|
||||
|
||||
override fun retargetUsages(usageInfos: List<UsageInfo>?, oldToNewMap: Map<PsiElement, PsiElement>?) {
|
||||
usageInfos?.forEach { usage ->
|
||||
when (usage) {
|
||||
is MoveRenameKotlinUsageInfo -> {
|
||||
usage.jetReference.bindToFqName(usage.newFqName)
|
||||
}
|
||||
is MoveRenameJavaUsageInfo -> {
|
||||
val lightElements = usage.jetDeclaration.toLightElements()
|
||||
val index = usage.lightElementIndex
|
||||
if (index < lightElements.size) {
|
||||
usage.getReference()!!.bindToElement(lightElements[index])
|
||||
}
|
||||
else {
|
||||
LOG.error("Can't find light element with index $index for ${usage.jetDeclaration.getText()} ")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
override fun prepareMovedFile(file: PsiFile, moveDestination: PsiDirectory, oldToNewMap: Map<PsiElement, PsiElement>) {
|
||||
|
||||
}
|
||||
|
||||
override fun updateMovedFile(file: PsiFile) {
|
||||
if (file !is JetFile) return
|
||||
|
||||
val packageNameInfo = file.getAndRemoveCopyableUserData(PACKAGE_NAME_INFO_KEY)
|
||||
val packageNameInfo = packageNameInfo
|
||||
if (packageNameInfo == null) return
|
||||
|
||||
val usages = file.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo)
|
||||
@@ -185,4 +110,19 @@ public class MoveKotlinFileHandler : MoveFileHandler() {
|
||||
val packageRef = file.getPackageDirective()?.getLastReferenceExpression()?.getReference() as? JetSimpleNameReference
|
||||
packageRef?.bindToFqName(packageNameInfo.newPackageName)
|
||||
}
|
||||
|
||||
override fun retargetUsages(usageInfos: List<UsageInfo>?, oldToNewMap: Map<PsiElement, PsiElement>?) {
|
||||
val processor = declarationMoveProcessor ?: return
|
||||
|
||||
val project = processor.project
|
||||
val ensureElementsToShortenIsEmpty = project.ensureElementsToShortenIsEmptyBeforeRefactoring
|
||||
|
||||
try {
|
||||
project.ensureElementsToShortenIsEmptyBeforeRefactoring = false
|
||||
usageInfos?.let { processor.execute(it) }
|
||||
} finally {
|
||||
project.ensureElementsToShortenIsEmptyBeforeRefactoring = ensureElementsToShortenIsEmpty
|
||||
clearState()
|
||||
}
|
||||
}
|
||||
}
|
||||
+20
-1
@@ -22,6 +22,9 @@ import org.jetbrains.jet.lang.psi.JetFile
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiFile
|
||||
import com.intellij.psi.PsiManager
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName
|
||||
import com.intellij.openapi.project.Project
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
public trait KotlinMoveTarget {
|
||||
val packageWrapper: PackageWrapper?
|
||||
@@ -45,7 +48,7 @@ public class MoveDestinationKotlinMoveTarget(val moveDestination: MoveDestinatio
|
||||
}
|
||||
|
||||
public class JetFileKotlinMoveTarget(val targetFile: JetFile): KotlinMoveTarget {
|
||||
override val packageWrapper: PackageWrapper? = targetFile.getPackageName()?.let { packageName ->
|
||||
override val packageWrapper: PackageWrapper? = targetFile.getPackageFqName().asString().let { packageName ->
|
||||
PackageWrapper(PsiManager.getInstance(targetFile.getProject()), packageName)
|
||||
}
|
||||
|
||||
@@ -53,6 +56,22 @@ public class JetFileKotlinMoveTarget(val targetFile: JetFile): KotlinMoveTarget
|
||||
|
||||
override fun getTargetPsiIfExists(originalPsi: PsiElement): PsiElement? = targetFile
|
||||
|
||||
// No additional verification is needed
|
||||
override fun verify(file: PsiFile): String? = null
|
||||
}
|
||||
|
||||
public class DeferredJetFileKotlinMoveTarget(
|
||||
project: Project,
|
||||
val packageFqName: FqName,
|
||||
createFile: () -> JetFile?): KotlinMoveTarget {
|
||||
val createdFile: JetFile? by Delegates.lazy(createFile)
|
||||
|
||||
override val packageWrapper: PackageWrapper = PackageWrapper(PsiManager.getInstance(project), packageFqName.asString())
|
||||
|
||||
override fun getOrCreateTargetPsi(originalPsi: PsiElement): PsiElement? = createdFile
|
||||
|
||||
override fun getTargetPsiIfExists(originalPsi: PsiElement): PsiElement? = null
|
||||
|
||||
// No additional verification is needed
|
||||
override fun verify(file: PsiFile): String? = null
|
||||
}
|
||||
+33
-16
@@ -72,16 +72,32 @@ import org.jetbrains.jet.plugin.refactoring.move.postProcessMoveUsages
|
||||
import org.jetbrains.jet.plugin.references.JetSimpleNameReference.ShorteningMode
|
||||
import org.jetbrains.jet.lang.psi.psiUtil.isAncestor
|
||||
import org.jetbrains.jet.plugin.refactoring.move.MoveRenameUsageInfoForExtension
|
||||
import org.jetbrains.jet.lang.psi.JetDeclaration
|
||||
|
||||
trait Mover: (originalElement: JetNamedDeclaration, targetFile: JetFile) -> JetNamedDeclaration {
|
||||
object Default: Mover {
|
||||
[suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")]
|
||||
override fun invoke(originalElement: JetNamedDeclaration, targetFile: JetFile): JetNamedDeclaration {
|
||||
val newElement = targetFile.add(originalElement) as JetNamedDeclaration
|
||||
originalElement.delete()
|
||||
return newElement
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class MoveKotlinTopLevelDeclarationsOptions(
|
||||
val elementsToMove: Collection<JetNamedDeclaration>,
|
||||
val moveTarget: KotlinMoveTarget,
|
||||
val searchInCommentsAndStrings: Boolean = true,
|
||||
val searchInNonCode: Boolean = true,
|
||||
val updateInternalReferences: Boolean = true,
|
||||
val moveCallback: MoveCallback? = null
|
||||
)
|
||||
|
||||
public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val options: MoveKotlinTopLevelDeclarationsOptions) : BaseRefactoringProcessor(project) {
|
||||
public class MoveKotlinTopLevelDeclarationsProcessor(
|
||||
val project: Project,
|
||||
val options: MoveKotlinTopLevelDeclarationsOptions,
|
||||
val mover: Mover = Mover.Default) : BaseRefactoringProcessor(project) {
|
||||
class object {
|
||||
private val LOG: Logger = Logger.getInstance(javaClass<MoveKotlinTopLevelDeclarationsProcessor>())
|
||||
|
||||
@@ -100,7 +116,7 @@ public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val optio
|
||||
)
|
||||
}
|
||||
|
||||
override fun findUsages(): Array<UsageInfo> {
|
||||
public override fun findUsages(): Array<UsageInfo> {
|
||||
val newPackageName = options.moveTarget.packageWrapper?.getQualifiedName() ?: ""
|
||||
|
||||
fun collectUsages(): List<UsageInfo> {
|
||||
@@ -232,26 +248,23 @@ public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val optio
|
||||
val targetFile =
|
||||
if (targetPsi is PsiDirectory) {
|
||||
val existingFile = if (targetPsi != file!!.getContainingDirectory()) targetPsi.findFile(file.getName()) else null
|
||||
val newFile = existingFile ?: declaration.getFileNameAfterMove()?.let {
|
||||
fileName ->
|
||||
createKotlinFile(fileName, targetPsi)
|
||||
}
|
||||
|
||||
newFile
|
||||
existingFile ?: declaration.getFileNameAfterMove()?.let {createKotlinFile(it, targetPsi)}
|
||||
}
|
||||
else targetPsi
|
||||
|
||||
assert(targetFile is JetFile, "Couldn't create Koltin file for: ${declaration.javaClass}: ${declaration.getText()}")
|
||||
targetFile as JetFile
|
||||
|
||||
val packageNameInfo = PackageNameInfo(file!!.getPackageFqName(), (targetFile as JetFile).getPackageFqName())
|
||||
val (usagesToProcessLater, usagesToProcessNow) = declaration
|
||||
.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo)
|
||||
.partition { it is MoveRenameUsageInfoForExtension }
|
||||
postProcessMoveUsages(usagesToProcessNow, shorteningMode = ShorteningMode.NO_SHORTENING)
|
||||
usagesToProcessAfterMove.addAll(usagesToProcessLater)
|
||||
if (options.updateInternalReferences) {
|
||||
val packageNameInfo = PackageNameInfo(file!!.getPackageFqName(), targetFile.getPackageFqName())
|
||||
val (usagesToProcessLater, usagesToProcessNow) = declaration
|
||||
.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo)
|
||||
.partition { it is MoveRenameUsageInfoForExtension }
|
||||
postProcessMoveUsages(usagesToProcessNow, shorteningMode = ShorteningMode.NO_SHORTENING)
|
||||
usagesToProcessAfterMove.addAll(usagesToProcessLater)
|
||||
}
|
||||
|
||||
val newElement = targetFile.add(declaration) as JetNamedDeclaration
|
||||
declaration.delete()
|
||||
val newElement = mover(declaration, targetFile)
|
||||
|
||||
newElement.addToShorteningWaitSet()
|
||||
|
||||
@@ -294,5 +307,9 @@ public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val optio
|
||||
options.moveCallback?.refactoringCompleted()
|
||||
}
|
||||
|
||||
fun execute(usages: List<UsageInfo>) {
|
||||
execute(usages.copyToArray())
|
||||
}
|
||||
|
||||
override fun getCommandName(): String = REFACTORING_NAME
|
||||
}
|
||||
|
||||
+2
-2
@@ -365,9 +365,9 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog {
|
||||
|
||||
try {
|
||||
MoveKotlinTopLevelDeclarationsOptions options = new MoveKotlinTopLevelDeclarationsOptions(
|
||||
elementsToMove, target, isSearchInComments(), isSearchInNonJavaFiles(), moveCallback
|
||||
elementsToMove, target, isSearchInComments(), isSearchInNonJavaFiles(), true, moveCallback
|
||||
);
|
||||
invokeRefactoring(new MoveKotlinTopLevelDeclarationsProcessor(myProject, options));
|
||||
invokeRefactoring(new MoveKotlinTopLevelDeclarationsProcessor(myProject, options, Mover.Default.INSTANCE$));
|
||||
}
|
||||
catch (IncorrectOperationException e) {
|
||||
CommonRefactoringUtil.showErrorMessage(RefactoringBundle.message("error.title"), e.getMessage(), null, myProject);
|
||||
|
||||
+8
-3
@@ -1,10 +1,15 @@
|
||||
package a
|
||||
|
||||
import b.test
|
||||
import b.TEST
|
||||
import b.Test
|
||||
|
||||
fun bar() {
|
||||
val t: Test = Test()
|
||||
b.test()
|
||||
println(b.TEST)
|
||||
b.TEST = ""
|
||||
test()
|
||||
t.test()
|
||||
println(TEST)
|
||||
println(t.TEST)
|
||||
TEST = ""
|
||||
t.TEST = ""
|
||||
}
|
||||
|
||||
+3
@@ -7,6 +7,9 @@ import b.TEST as _TEST
|
||||
fun bar() {
|
||||
val t: _Test = _Test()
|
||||
_test()
|
||||
t._test()
|
||||
println(_TEST)
|
||||
println(t._TEST)
|
||||
_TEST = ""
|
||||
t._TEST = ""
|
||||
}
|
||||
|
||||
+3
@@ -6,7 +6,10 @@ 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, "");
|
||||
}
|
||||
}
|
||||
|
||||
+8
-3
@@ -1,10 +1,15 @@
|
||||
package a
|
||||
|
||||
import b.test
|
||||
import b.TEST
|
||||
import b.Test
|
||||
|
||||
fun bar() {
|
||||
val t: Test = Test()
|
||||
b.test()
|
||||
println(b.TEST)
|
||||
b.TEST = ""
|
||||
test()
|
||||
t.test()
|
||||
println(TEST)
|
||||
println(t.TEST)
|
||||
TEST = ""
|
||||
t.TEST = ""
|
||||
}
|
||||
|
||||
+3
@@ -6,7 +6,10 @@ 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, "");
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -7,6 +7,9 @@ import b.TEST as _TEST
|
||||
fun bar() {
|
||||
val t: _Test = _Test()
|
||||
_test()
|
||||
t._test()
|
||||
println(_TEST)
|
||||
println(t._TEST)
|
||||
_TEST = ""
|
||||
t._TEST = ""
|
||||
}
|
||||
|
||||
+3
@@ -10,7 +10,10 @@ class J {
|
||||
void bar() {
|
||||
Test t = new Test();
|
||||
test();
|
||||
test(t);
|
||||
System.out.println(getTEST());
|
||||
System.out.println(getTEST(t));
|
||||
setTEST("");
|
||||
setTEST(t, "");
|
||||
}
|
||||
}
|
||||
|
||||
+14
@@ -15,7 +15,21 @@ fun test() {
|
||||
c.foo()
|
||||
}
|
||||
|
||||
fun Test.test() {
|
||||
a.foo()
|
||||
foo()
|
||||
c.foo()
|
||||
}
|
||||
|
||||
var TEST: String
|
||||
get() = a.FOO + FOO + c.FOO
|
||||
set(value: String) {
|
||||
a.FOO = value
|
||||
FOO = value
|
||||
c.FOO = value
|
||||
}
|
||||
|
||||
var Test.TEST: String
|
||||
get() = a.FOO + FOO + c.FOO
|
||||
set(value: String) {
|
||||
a.FOO = value
|
||||
|
||||
+3
@@ -6,7 +6,10 @@ 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, "");
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -6,7 +6,10 @@ 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, "");
|
||||
}
|
||||
}
|
||||
|
||||
+8
-3
@@ -1,11 +1,16 @@
|
||||
package c
|
||||
|
||||
import a.*
|
||||
import b.test
|
||||
import b.TEST
|
||||
import b.Test
|
||||
|
||||
fun bar() {
|
||||
val t: Test = Test()
|
||||
b.test()
|
||||
println(b.TEST)
|
||||
b.TEST = ""
|
||||
test()
|
||||
t.test()
|
||||
println(TEST)
|
||||
println(t.TEST)
|
||||
TEST = ""
|
||||
t.TEST = ""
|
||||
}
|
||||
|
||||
+3
@@ -6,7 +6,10 @@ 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, "");
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -6,7 +6,10 @@ 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, "");
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -7,6 +7,9 @@ import b.TEST
|
||||
fun bar() {
|
||||
val t: Test = Test()
|
||||
test()
|
||||
t.test()
|
||||
println(TEST)
|
||||
println(t.TEST)
|
||||
TEST = ""
|
||||
t.TEST = ""
|
||||
}
|
||||
|
||||
+3
@@ -7,6 +7,9 @@ import b.TEST as _TEST
|
||||
fun bar() {
|
||||
val t: _Test = _Test()
|
||||
_test()
|
||||
t._test()
|
||||
println(_TEST)
|
||||
println(t._TEST)
|
||||
_TEST = ""
|
||||
t._TEST = ""
|
||||
}
|
||||
|
||||
+3
@@ -10,7 +10,10 @@ class J {
|
||||
void bar() {
|
||||
Test t = new Test();
|
||||
test();
|
||||
test(t);
|
||||
System.out.println(getTEST());
|
||||
System.out.println(getTEST(t));
|
||||
setTEST("");
|
||||
setTEST(t, "");
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -3,6 +3,9 @@ package a
|
||||
fun bar() {
|
||||
val t: Test = Test()
|
||||
test()
|
||||
t.test()
|
||||
println(TEST)
|
||||
println(t.TEST)
|
||||
TEST = ""
|
||||
t.TEST = ""
|
||||
}
|
||||
|
||||
+3
@@ -7,6 +7,9 @@ import a.TEST as _TEST
|
||||
fun bar() {
|
||||
val t: _Test = _Test()
|
||||
_test()
|
||||
t._test()
|
||||
println(_TEST)
|
||||
println(t._TEST)
|
||||
_TEST = ""
|
||||
t._TEST = ""
|
||||
}
|
||||
|
||||
+14
@@ -15,7 +15,21 @@ fun test() {
|
||||
c.foo()
|
||||
}
|
||||
|
||||
fun Test.test() {
|
||||
foo()
|
||||
b.foo()
|
||||
c.foo()
|
||||
}
|
||||
|
||||
var TEST: String
|
||||
get() = FOO + b.FOO + c.FOO
|
||||
set(value: String) {
|
||||
FOO = value
|
||||
b.FOO = value
|
||||
c.FOO = value
|
||||
}
|
||||
|
||||
var Test.TEST: String
|
||||
get() = FOO + b.FOO + c.FOO
|
||||
set(value: String) {
|
||||
FOO = value
|
||||
|
||||
+3
@@ -4,7 +4,10 @@ class J {
|
||||
void bar() {
|
||||
Test t = new Test();
|
||||
APackage.test();
|
||||
APackage.test(t);
|
||||
System.out.println(APackage.getTEST());
|
||||
System.out.println(APackage.getTEST(t));
|
||||
APackage.setTEST("");
|
||||
APackage.setTEST(t, "");
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -3,6 +3,9 @@ package a
|
||||
fun bar() {
|
||||
val t: Test = Test()
|
||||
test()
|
||||
t.test()
|
||||
println(TEST)
|
||||
println(t.TEST)
|
||||
TEST = ""
|
||||
t.TEST = ""
|
||||
}
|
||||
|
||||
+3
@@ -6,7 +6,10 @@ class J {
|
||||
void bar() {
|
||||
Test t = new Test();
|
||||
test();
|
||||
test(t);
|
||||
System.out.println(getTEST());
|
||||
System.out.println(getTEST(t));
|
||||
setTEST("");
|
||||
setTEST(t, "");
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -7,6 +7,9 @@ import a.TEST as _TEST
|
||||
fun bar() {
|
||||
val t: _Test = _Test()
|
||||
_test()
|
||||
t._test()
|
||||
println(_TEST)
|
||||
println(t._TEST)
|
||||
_TEST = ""
|
||||
t._TEST = ""
|
||||
}
|
||||
|
||||
+3
@@ -8,7 +8,10 @@ class J {
|
||||
void bar() {
|
||||
Test t = new Test();
|
||||
test();
|
||||
test(t);
|
||||
System.out.println(getTEST());
|
||||
System.out.println(getTEST(t));
|
||||
setTEST("");
|
||||
setTEST(t, "");
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -4,7 +4,10 @@ class J {
|
||||
void bar() {
|
||||
a.Test t = new a.Test();
|
||||
a.APackage.test();
|
||||
a.APackage.test(t);
|
||||
System.out.println(a.APackage.getTEST());
|
||||
System.out.println(a.APackage.getTEST(t));
|
||||
a.APackage.setTEST("");
|
||||
a.APackage.setTEST(t, "");
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -6,7 +6,10 @@ class J {
|
||||
void bar() {
|
||||
Test t = new Test();
|
||||
APackage.test();
|
||||
APackage.test(t);
|
||||
System.out.println(APackage.getTEST());
|
||||
System.out.println(APackage.getTEST(t));
|
||||
APackage.setTEST("");
|
||||
APackage.setTEST(t, "");
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -5,6 +5,9 @@ import a.*
|
||||
fun bar() {
|
||||
val t: Test = Test()
|
||||
test()
|
||||
t.test()
|
||||
println(TEST)
|
||||
println(t.TEST)
|
||||
TEST = ""
|
||||
t.TEST = ""
|
||||
}
|
||||
|
||||
+3
@@ -6,7 +6,10 @@ class J {
|
||||
void bar() {
|
||||
a.Test t = new a.Test();
|
||||
test();
|
||||
test(t);
|
||||
System.out.println(getTEST());
|
||||
System.out.println(getTEST(t));
|
||||
setTEST("");
|
||||
setTEST(t, "");
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -7,7 +7,10 @@ class J {
|
||||
void bar() {
|
||||
Test t = new Test();
|
||||
APackage.test();
|
||||
APackage.test(t);
|
||||
System.out.println(APackage.getTEST());
|
||||
System.out.println(APackage.getTEST(t));
|
||||
APackage.setTEST("");
|
||||
APackage.setTEST(t, "");
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -7,6 +7,9 @@ import a.TEST
|
||||
fun bar() {
|
||||
val t: Test = Test()
|
||||
test()
|
||||
t.test()
|
||||
println(TEST)
|
||||
println(t.TEST)
|
||||
TEST = ""
|
||||
t.TEST = ""
|
||||
}
|
||||
|
||||
+3
@@ -7,6 +7,9 @@ import a.TEST as _TEST
|
||||
fun bar() {
|
||||
val t: _Test = _Test()
|
||||
_test()
|
||||
t._test()
|
||||
println(_TEST)
|
||||
println(t._TEST)
|
||||
_TEST = ""
|
||||
t._TEST = ""
|
||||
}
|
||||
|
||||
+3
@@ -8,7 +8,10 @@ class J {
|
||||
void bar() {
|
||||
a.Test t = new a.Test();
|
||||
test();
|
||||
test(t);
|
||||
System.out.println(getTEST());
|
||||
System.out.println(getTEST(t));
|
||||
setTEST("");
|
||||
setTEST(t, "");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user