File Move: Fix update of extension references. Reuse MoveKotlinTopLevelDeclarationsProcessor

This commit is contained in:
Alexey Sedunov
2014-10-09 15:21:50 +04:00
parent dc62d167ad
commit ff082be524
38 changed files with 271 additions and 160 deletions
@@ -21,4 +21,8 @@
<item name='com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler void updateMovedFile(com.intellij.psi.PsiFile) 0'> <item name='com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler void updateMovedFile(com.intellij.psi.PsiFile) 0'>
<annotation name='org.jetbrains.annotations.NotNull'/> <annotation name='org.jetbrains.annotations.NotNull'/>
</item> </item>
<item
name='com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler$1 void retargetUsages(java.util.List&lt;com.intellij.usageView.UsageInfo&gt;, java.util.Map&lt;com.intellij.psi.PsiElement,com.intellij.psi.PsiElement&gt;) 0'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root> </root>
@@ -29,6 +29,9 @@ import com.intellij.psi.SmartPointerManager
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.psi.JetQualifiedExpression import org.jetbrains.jet.lang.psi.JetQualifiedExpression
import org.jetbrains.jet.lang.psi.JetUserType 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> { public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper<Any> {
private val LOG = Logger.getInstance(javaClass<KotlinShortenReferencesRefactoringHelper>().getCanonicalName()) 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? { override fun prepareOperation(usages: Array<out UsageInfo>?): Any? {
if (usages != null && usages.isNotEmpty()) { if (usages != null && usages.isNotEmpty()) {
val project = usages[0].getProject() val project = usages[0].getProject()
val elementsToShorten = project.getElementsToShorten(false) val elementsToShorten = project.elementsToShorten
if (elementsToShorten != null && !elementsToShorten.isEmpty()) { if (project.ensureElementsToShortenIsEmptyBeforeRefactoring && elementsToShorten != null && !elementsToShorten.isEmpty()) {
LOG.warn("Waiting set for reference shortening is not empty") LOG.warn("Waiting set for reference shortening is not empty")
project.clearElementsToShorten() project.elementsToShorten = null
} }
} }
return null return null
@@ -47,32 +50,36 @@ public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper<Any> {
override fun performOperation(project: Project, operationData: Any?) { override fun performOperation(project: Project, operationData: Any?) {
ApplicationManager.getApplication()!!.runWriteAction { ApplicationManager.getApplication()!!.runWriteAction {
project.getElementsToShorten(false)?.let { bindRequests -> project.elementsToShorten?.let { bindRequests ->
project.clearElementsToShorten() project.elementsToShorten = null
ShortenReferences.process(bindRequests.map() { it.getElement() }.filterNotNull()) 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) * When one refactoring invokes another this value must be set to false so that shortening wait-set is not cleared
if (createIfNeeded && elementsToShorten == null) { * and previously collected references are processed correctly. Afterwards it must be reset to original value
elementsToShorten = HashSet() */
putUserData(ELEMENTS_TO_SHORTEN_KEY, elementsToShorten) 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() { public fun JetElement.addToShorteningWaitSet() {
assert (ApplicationManager.getApplication()!!.isWriteAccessAllowed(), "Write access needed") assert (ApplicationManager.getApplication()!!.isWriteAccessAllowed(), "Write access needed")
val project = getProject() val project = getProject()
project.getElementsToShorten(true)!!.add(SmartPointerManager.getInstance(project).createSmartPsiElementPointer(this)) project.getOrCreateElementsToShorten().add(SmartPointerManager.getInstance(project).createSmartPsiElementPointer(this))
} }
@@ -24,59 +24,27 @@ import com.intellij.usageView.UsageInfo
import com.intellij.openapi.roots.JavaProjectRootsUtil import com.intellij.openapi.roots.JavaProjectRootsUtil
import com.intellij.psi.PsiCompiledElement import com.intellij.psi.PsiCompiledElement
import org.jetbrains.jet.lang.psi.JetFile 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 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.lang.resolve.name.FqName
import org.jetbrains.jet.plugin.references.JetSimpleNameReference 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.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.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.getInternalReferencesToUpdateOnPackageNameChange
import org.jetbrains.jet.plugin.refactoring.move.postProcessMoveUsages 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() { public class MoveKotlinFileHandler : MoveFileHandler() {
class object { private var packageNameInfo: PackageNameInfo? = null
private val LOG = Logger.getInstance(javaClass<MoveKotlinFileHandler>()) private var declarationMoveProcessor: MoveKotlinTopLevelDeclarationsProcessor? = null
class MoveRenameKotlinUsageInfo( private fun clearState() {
reference: JetSimpleNameReference, packageNameInfo = null
range: TextRange, declarationMoveProcessor = null
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 JetFile.packageMatchesDirectory(): Boolean { private fun JetFile.packageMatchesDirectory(): Boolean {
@@ -88,95 +56,52 @@ public class MoveKotlinFileHandler : MoveFileHandler() {
return !JavaProjectRootsUtil.isOutsideJavaSourceRoot(element) 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( override fun findUsages(
psiFile: PsiFile, psiFile: PsiFile,
newParent: PsiDirectory, newParent: PsiDirectory,
searchInComments: Boolean, searchInComments: Boolean,
searchInNonJavaFiles: Boolean searchInNonJavaFiles: Boolean
): List<UsageInfo>? { ): List<UsageInfo>? {
clearState()
if (psiFile !is JetFile || !psiFile.packageMatchesDirectory()) return null 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 project = psiFile.getProject()
val newPackageName = newParent.getPackage()?.getQualifiedName() ?: ""
val searchScope = project.projectScope() - psiFile.fileScope() val declarationMoveProcessor = MoveKotlinTopLevelDeclarationsProcessor(
return psiFile.getDeclarations().flatMap { declaration -> project,
val name = (declaration as? JetNamedDeclaration)?.getName() MoveKotlinTopLevelDeclarationsOptions(
if (name != null) { elementsToMove = psiFile.getDeclarations().filterIsInstance(javaClass<JetNamedDeclaration>()),
val newFqName = StringUtil.getQualifiedName(newPackageName, name)!! moveTarget = DeferredJetFileKotlinMoveTarget(project, packageNameInfo.newPackageName) {
MoveFilesOrDirectoriesUtil.doMoveFile(psiFile, newParent)
val results = ReferencesSearch.search(declaration, searchScope, false) newParent.findFile(psiFile.getName()) as? JetFile
.toSet() },
.mapTo(ArrayList<UsageInfo?>()) { ref -> updateInternalReferences = false
val range = ref.getRangeInElement()!! ),
object: Mover {
when (ref) { [suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")]
is JetSimpleNameReference -> override fun invoke(originalElement: JetNamedDeclaration, targetFile: JetFile): JetNamedDeclaration = originalElement
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
)
}
} }
)
results this.packageNameInfo = packageNameInfo
} this.declarationMoveProcessor = declarationMoveProcessor
else Collections.emptyList<UsageInfo>()
} return declarationMoveProcessor.findUsages().toList()
} }
override fun retargetUsages(usageInfos: List<UsageInfo>?, oldToNewMap: Map<PsiElement, PsiElement>?) { override fun prepareMovedFile(file: PsiFile, moveDestination: PsiDirectory, 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 updateMovedFile(file: PsiFile) { override fun updateMovedFile(file: PsiFile) {
if (file !is JetFile) return if (file !is JetFile) return
val packageNameInfo = file.getAndRemoveCopyableUserData(PACKAGE_NAME_INFO_KEY) val packageNameInfo = packageNameInfo
if (packageNameInfo == null) return if (packageNameInfo == null) return
val usages = file.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo) val usages = file.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo)
@@ -185,4 +110,19 @@ public class MoveKotlinFileHandler : MoveFileHandler() {
val packageRef = file.getPackageDirective()?.getLastReferenceExpression()?.getReference() as? JetSimpleNameReference val packageRef = file.getPackageDirective()?.getLastReferenceExpression()?.getReference() as? JetSimpleNameReference
packageRef?.bindToFqName(packageNameInfo.newPackageName) 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()
}
}
} }
@@ -22,6 +22,9 @@ import org.jetbrains.jet.lang.psi.JetFile
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager 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 { public trait KotlinMoveTarget {
val packageWrapper: PackageWrapper? val packageWrapper: PackageWrapper?
@@ -45,7 +48,7 @@ public class MoveDestinationKotlinMoveTarget(val moveDestination: MoveDestinatio
} }
public class JetFileKotlinMoveTarget(val targetFile: JetFile): KotlinMoveTarget { 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) PackageWrapper(PsiManager.getInstance(targetFile.getProject()), packageName)
} }
@@ -56,3 +59,19 @@ public class JetFileKotlinMoveTarget(val targetFile: JetFile): KotlinMoveTarget
// No additional verification is needed // No additional verification is needed
override fun verify(file: PsiFile): String? = null 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
}
@@ -72,16 +72,32 @@ import org.jetbrains.jet.plugin.refactoring.move.postProcessMoveUsages
import org.jetbrains.jet.plugin.references.JetSimpleNameReference.ShorteningMode import org.jetbrains.jet.plugin.references.JetSimpleNameReference.ShorteningMode
import org.jetbrains.jet.lang.psi.psiUtil.isAncestor import org.jetbrains.jet.lang.psi.psiUtil.isAncestor
import org.jetbrains.jet.plugin.refactoring.move.MoveRenameUsageInfoForExtension 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( public class MoveKotlinTopLevelDeclarationsOptions(
val elementsToMove: Collection<JetNamedDeclaration>, val elementsToMove: Collection<JetNamedDeclaration>,
val moveTarget: KotlinMoveTarget, val moveTarget: KotlinMoveTarget,
val searchInCommentsAndStrings: Boolean = true, val searchInCommentsAndStrings: Boolean = true,
val searchInNonCode: Boolean = true, val searchInNonCode: Boolean = true,
val updateInternalReferences: Boolean = true,
val moveCallback: MoveCallback? = null 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 { class object {
private val LOG: Logger = Logger.getInstance(javaClass<MoveKotlinTopLevelDeclarationsProcessor>()) 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() ?: "" val newPackageName = options.moveTarget.packageWrapper?.getQualifiedName() ?: ""
fun collectUsages(): List<UsageInfo> { fun collectUsages(): List<UsageInfo> {
@@ -232,26 +248,23 @@ public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val optio
val targetFile = val targetFile =
if (targetPsi is PsiDirectory) { if (targetPsi is PsiDirectory) {
val existingFile = if (targetPsi != file!!.getContainingDirectory()) targetPsi.findFile(file.getName()) else null val existingFile = if (targetPsi != file!!.getContainingDirectory()) targetPsi.findFile(file.getName()) else null
val newFile = existingFile ?: declaration.getFileNameAfterMove()?.let { existingFile ?: declaration.getFileNameAfterMove()?.let {createKotlinFile(it, targetPsi)}
fileName ->
createKotlinFile(fileName, targetPsi)
}
newFile
} }
else targetPsi else targetPsi
assert(targetFile is JetFile, "Couldn't create Koltin file for: ${declaration.javaClass}: ${declaration.getText()}") 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()) if (options.updateInternalReferences) {
val (usagesToProcessLater, usagesToProcessNow) = declaration val packageNameInfo = PackageNameInfo(file!!.getPackageFqName(), targetFile.getPackageFqName())
.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo) val (usagesToProcessLater, usagesToProcessNow) = declaration
.partition { it is MoveRenameUsageInfoForExtension } .getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo)
postProcessMoveUsages(usagesToProcessNow, shorteningMode = ShorteningMode.NO_SHORTENING) .partition { it is MoveRenameUsageInfoForExtension }
usagesToProcessAfterMove.addAll(usagesToProcessLater) postProcessMoveUsages(usagesToProcessNow, shorteningMode = ShorteningMode.NO_SHORTENING)
usagesToProcessAfterMove.addAll(usagesToProcessLater)
}
val newElement = targetFile.add(declaration) as JetNamedDeclaration val newElement = mover(declaration, targetFile)
declaration.delete()
newElement.addToShorteningWaitSet() newElement.addToShorteningWaitSet()
@@ -294,5 +307,9 @@ public class MoveKotlinTopLevelDeclarationsProcessor(project: Project, val optio
options.moveCallback?.refactoringCompleted() options.moveCallback?.refactoringCompleted()
} }
fun execute(usages: List<UsageInfo>) {
execute(usages.copyToArray())
}
override fun getCommandName(): String = REFACTORING_NAME override fun getCommandName(): String = REFACTORING_NAME
} }
@@ -365,9 +365,9 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog {
try { try {
MoveKotlinTopLevelDeclarationsOptions options = new MoveKotlinTopLevelDeclarationsOptions( 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) { catch (IncorrectOperationException e) {
CommonRefactoringUtil.showErrorMessage(RefactoringBundle.message("error.title"), e.getMessage(), null, myProject); CommonRefactoringUtil.showErrorMessage(RefactoringBundle.message("error.title"), e.getMessage(), null, myProject);
@@ -1,10 +1,15 @@
package a package a
import b.test
import b.TEST
import b.Test import b.Test
fun bar() { fun bar() {
val t: Test = Test() val t: Test = Test()
b.test() test()
println(b.TEST) t.test()
b.TEST = "" println(TEST)
println(t.TEST)
TEST = ""
t.TEST = ""
} }
@@ -7,6 +7,9 @@ import b.TEST as _TEST
fun bar() { fun bar() {
val t: _Test = _Test() val t: _Test = _Test()
_test() _test()
t._test()
println(_TEST) println(_TEST)
println(t._TEST)
_TEST = "" _TEST = ""
t._TEST = ""
} }
@@ -6,7 +6,10 @@ class J {
void bar() { void bar() {
Test t = new Test(); Test t = new Test();
b.BPackage.test(); b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST()); System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST(""); b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
} }
} }
@@ -1,10 +1,15 @@
package a package a
import b.test
import b.TEST
import b.Test import b.Test
fun bar() { fun bar() {
val t: Test = Test() val t: Test = Test()
b.test() test()
println(b.TEST) t.test()
b.TEST = "" println(TEST)
println(t.TEST)
TEST = ""
t.TEST = ""
} }
@@ -6,7 +6,10 @@ class J {
void bar() { void bar() {
Test t = new Test(); Test t = new Test();
b.BPackage.test(); b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST()); System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST(""); b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
} }
} }
@@ -7,6 +7,9 @@ import b.TEST as _TEST
fun bar() { fun bar() {
val t: _Test = _Test() val t: _Test = _Test()
_test() _test()
t._test()
println(_TEST) println(_TEST)
println(t._TEST)
_TEST = "" _TEST = ""
t._TEST = ""
} }
@@ -10,7 +10,10 @@ class J {
void bar() { void bar() {
Test t = new Test(); Test t = new Test();
test(); test();
test(t);
System.out.println(getTEST()); System.out.println(getTEST());
System.out.println(getTEST(t));
setTEST(""); setTEST("");
setTEST(t, "");
} }
} }
@@ -15,6 +15,12 @@ fun test() {
c.foo() c.foo()
} }
fun Test.test() {
a.foo()
foo()
c.foo()
}
var TEST: String var TEST: String
get() = a.FOO + FOO + c.FOO get() = a.FOO + FOO + c.FOO
set(value: String) { set(value: String) {
@@ -22,3 +28,11 @@ var TEST: String
FOO = value FOO = value
c.FOO = value c.FOO = value
} }
var Test.TEST: String
get() = a.FOO + FOO + c.FOO
set(value: String) {
a.FOO = value
FOO = value
c.FOO = value
}
@@ -6,7 +6,10 @@ class J {
void bar() { void bar() {
Test t = new Test(); Test t = new Test();
b.BPackage.test(); b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST()); System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST(""); b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
} }
} }
@@ -6,7 +6,10 @@ class J {
void bar() { void bar() {
Test t = new Test(); Test t = new Test();
b.BPackage.test(); b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST()); System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST(""); b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
} }
} }
@@ -1,11 +1,16 @@
package c package c
import a.* import a.*
import b.test
import b.TEST
import b.Test import b.Test
fun bar() { fun bar() {
val t: Test = Test() val t: Test = Test()
b.test() test()
println(b.TEST) t.test()
b.TEST = "" println(TEST)
println(t.TEST)
TEST = ""
t.TEST = ""
} }
@@ -6,7 +6,10 @@ class J {
void bar() { void bar() {
Test t = new Test(); Test t = new Test();
b.BPackage.test(); b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST()); System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST(""); b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
} }
} }
@@ -6,7 +6,10 @@ class J {
void bar() { void bar() {
Test t = new Test(); Test t = new Test();
b.BPackage.test(); b.BPackage.test();
b.BPackage.test(t);
System.out.println(b.BPackage.getTEST()); System.out.println(b.BPackage.getTEST());
System.out.println(b.BPackage.getTEST(t));
b.BPackage.setTEST(""); b.BPackage.setTEST("");
b.BPackage.setTEST(t, "");
} }
} }
@@ -7,6 +7,9 @@ import b.TEST
fun bar() { fun bar() {
val t: Test = Test() val t: Test = Test()
test() test()
t.test()
println(TEST) println(TEST)
println(t.TEST)
TEST = "" TEST = ""
t.TEST = ""
} }
@@ -7,6 +7,9 @@ import b.TEST as _TEST
fun bar() { fun bar() {
val t: _Test = _Test() val t: _Test = _Test()
_test() _test()
t._test()
println(_TEST) println(_TEST)
println(t._TEST)
_TEST = "" _TEST = ""
t._TEST = ""
} }
@@ -10,7 +10,10 @@ class J {
void bar() { void bar() {
Test t = new Test(); Test t = new Test();
test(); test();
test(t);
System.out.println(getTEST()); System.out.println(getTEST());
System.out.println(getTEST(t));
setTEST(""); setTEST("");
setTEST(t, "");
} }
} }
@@ -3,6 +3,9 @@ package a
fun bar() { fun bar() {
val t: Test = Test() val t: Test = Test()
test() test()
t.test()
println(TEST) println(TEST)
println(t.TEST)
TEST = "" TEST = ""
t.TEST = ""
} }
@@ -7,6 +7,9 @@ import a.TEST as _TEST
fun bar() { fun bar() {
val t: _Test = _Test() val t: _Test = _Test()
_test() _test()
t._test()
println(_TEST) println(_TEST)
println(t._TEST)
_TEST = "" _TEST = ""
t._TEST = ""
} }
@@ -15,6 +15,12 @@ fun test() {
c.foo() c.foo()
} }
fun Test.test() {
foo()
b.foo()
c.foo()
}
var TEST: String var TEST: String
get() = FOO + b.FOO + c.FOO get() = FOO + b.FOO + c.FOO
set(value: String) { set(value: String) {
@@ -22,3 +28,11 @@ var TEST: String
b.FOO = value b.FOO = value
c.FOO = value c.FOO = value
} }
var Test.TEST: String
get() = FOO + b.FOO + c.FOO
set(value: String) {
FOO = value
b.FOO = value
c.FOO = value
}
@@ -4,7 +4,10 @@ class J {
void bar() { void bar() {
Test t = new Test(); Test t = new Test();
APackage.test(); APackage.test();
APackage.test(t);
System.out.println(APackage.getTEST()); System.out.println(APackage.getTEST());
System.out.println(APackage.getTEST(t));
APackage.setTEST(""); APackage.setTEST("");
APackage.setTEST(t, "");
} }
} }
@@ -3,6 +3,9 @@ package a
fun bar() { fun bar() {
val t: Test = Test() val t: Test = Test()
test() test()
t.test()
println(TEST) println(TEST)
println(t.TEST)
TEST = "" TEST = ""
t.TEST = ""
} }
@@ -6,7 +6,10 @@ class J {
void bar() { void bar() {
Test t = new Test(); Test t = new Test();
test(); test();
test(t);
System.out.println(getTEST()); System.out.println(getTEST());
System.out.println(getTEST(t));
setTEST(""); setTEST("");
setTEST(t, "");
} }
} }
@@ -7,6 +7,9 @@ import a.TEST as _TEST
fun bar() { fun bar() {
val t: _Test = _Test() val t: _Test = _Test()
_test() _test()
t._test()
println(_TEST) println(_TEST)
println(t._TEST)
_TEST = "" _TEST = ""
t._TEST = ""
} }
@@ -8,7 +8,10 @@ class J {
void bar() { void bar() {
Test t = new Test(); Test t = new Test();
test(); test();
test(t);
System.out.println(getTEST()); System.out.println(getTEST());
System.out.println(getTEST(t));
setTEST(""); setTEST("");
setTEST(t, "");
} }
} }
@@ -4,7 +4,10 @@ class J {
void bar() { void bar() {
a.Test t = new a.Test(); a.Test t = new a.Test();
a.APackage.test(); a.APackage.test();
a.APackage.test(t);
System.out.println(a.APackage.getTEST()); System.out.println(a.APackage.getTEST());
System.out.println(a.APackage.getTEST(t));
a.APackage.setTEST(""); a.APackage.setTEST("");
a.APackage.setTEST(t, "");
} }
} }
@@ -6,7 +6,10 @@ class J {
void bar() { void bar() {
Test t = new Test(); Test t = new Test();
APackage.test(); APackage.test();
APackage.test(t);
System.out.println(APackage.getTEST()); System.out.println(APackage.getTEST());
System.out.println(APackage.getTEST(t));
APackage.setTEST(""); APackage.setTEST("");
APackage.setTEST(t, "");
} }
} }
@@ -5,6 +5,9 @@ import a.*
fun bar() { fun bar() {
val t: Test = Test() val t: Test = Test()
test() test()
t.test()
println(TEST) println(TEST)
println(t.TEST)
TEST = "" TEST = ""
t.TEST = ""
} }
@@ -6,7 +6,10 @@ class J {
void bar() { void bar() {
a.Test t = new a.Test(); a.Test t = new a.Test();
test(); test();
test(t);
System.out.println(getTEST()); System.out.println(getTEST());
System.out.println(getTEST(t));
setTEST(""); setTEST("");
setTEST(t, "");
} }
} }
@@ -7,7 +7,10 @@ class J {
void bar() { void bar() {
Test t = new Test(); Test t = new Test();
APackage.test(); APackage.test();
APackage.test(t);
System.out.println(APackage.getTEST()); System.out.println(APackage.getTEST());
System.out.println(APackage.getTEST(t));
APackage.setTEST(""); APackage.setTEST("");
APackage.setTEST(t, "");
} }
} }
@@ -7,6 +7,9 @@ import a.TEST
fun bar() { fun bar() {
val t: Test = Test() val t: Test = Test()
test() test()
t.test()
println(TEST) println(TEST)
println(t.TEST)
TEST = "" TEST = ""
t.TEST = ""
} }
@@ -7,6 +7,9 @@ import a.TEST as _TEST
fun bar() { fun bar() {
val t: _Test = _Test() val t: _Test = _Test()
_test() _test()
t._test()
println(_TEST) println(_TEST)
println(t._TEST)
_TEST = "" _TEST = ""
t._TEST = ""
} }
@@ -8,7 +8,10 @@ class J {
void bar() { void bar() {
a.Test t = new a.Test(); a.Test t = new a.Test();
test(); test();
test(t);
System.out.println(getTEST()); System.out.println(getTEST());
System.out.println(getTEST(t));
setTEST(""); setTEST("");
setTEST(t, "");
} }
} }