From 87a12ee1c70c24485f9932d06d467c2fe9a61e91 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 7 Apr 2017 19:49:14 +0300 Subject: [PATCH] Move: Check for conflicts using entire collections of elements to move --- .../MoveFilesWithDeclarationsProcessor.kt | 35 +++++++--- .../MoveKotlinDeclarationsProcessor.kt | 13 +++- .../moveDeclarations/moveConflictUtils.kt | 67 ++++++++++++++++--- .../MoveKotlinFileHandler.kt | 7 +- .../after/A/A.iml | 11 +++ .../after/A/src/test/J.java | 6 ++ .../after/B/B.iml | 11 +++ .../after/B/src/test2/Bar.kt | 6 ++ .../after/B/src/test2/Foo.kt | 5 ++ .../after/B/src/test2/dummy.txt | 0 .../before/A/A.iml | 11 +++ .../before/A/src/test/Bar.kt | 6 ++ .../before/A/src/test/Foo.kt | 5 ++ .../before/A/src/test/J.java | 6 ++ .../before/B/B.iml | 11 +++ .../before/B/src/test2/dummy.txt | 0 .../conflicts.txt | 6 ++ ...ultipleFilesToUnrelatedModuleConflict.test | 5 ++ .../move/MultiModuleMoveTestGenerated.java | 6 ++ 19 files changed, 194 insertions(+), 23 deletions(-) create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/A/A.iml create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/A/src/test/J.java create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/B.iml create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/src/test2/Bar.kt create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/src/test2/Foo.kt create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/src/test2/dummy.txt create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/A.iml create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/src/test/Bar.kt create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/src/test/Foo.kt create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/src/test/J.java create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/B/B.iml create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/B/src/test2/dummy.txt create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/conflicts.txt create mode 100644 idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/moveMultipleFilesToUnrelatedModuleConflict.test diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveFilesWithDeclarationsProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveFilesWithDeclarationsProcessor.kt index 69422ea3b92..cb1cf7f3287 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveFilesWithDeclarationsProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveFilesWithDeclarationsProcessor.kt @@ -27,9 +27,11 @@ import com.intellij.refactoring.move.MoveCallback import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesProcessor import com.intellij.usageView.UsageInfo import com.intellij.usageView.UsageViewDescriptor -import com.intellij.usageView.UsageViewUtil import com.intellij.util.containers.MultiMap import com.intellij.util.text.UniqueNameGenerator +import org.jetbrains.kotlin.idea.refactoring.move.moveFilesOrDirectories.allElementsToMove +import org.jetbrains.kotlin.idea.refactoring.move.moveFilesOrDirectories.shouldFixFqName +import org.jetbrains.kotlin.psi.KtFile class MoveFilesWithDeclarationsProcessor @JvmOverloads constructor ( project: Project, @@ -56,14 +58,23 @@ class MoveFilesWithDeclarationsProcessor @JvmOverloads constructor ( return MoveFilesWithDeclarationsViewDescriptor(elementsToMove.toTypedArray(), targetDirectory) } + override fun findUsages(): Array { + try { + markScopeToMove(elementsToMove) + return super.findUsages() + } + finally { + markScopeToMove(null) + } + } + override fun preprocessUsages(refUsages: Ref>): Boolean { val usages = refUsages.get() val (conflictUsages, usagesToProcess) = usages.partition { it is ConflictUsageInfo } - val distinctConflictUsages = UsageViewUtil.removeDuplicatedUsages(conflictUsages.toTypedArray()) val conflicts = MultiMap() - for (conflictUsage in distinctConflictUsages) { + for (conflictUsage in conflictUsages) { conflicts.putValues(conflictUsage.element, (conflictUsage as ConflictUsageInfo).messages) } @@ -83,15 +94,23 @@ class MoveFilesWithDeclarationsProcessor @JvmOverloads constructor ( sourceFile.name = temporaryName } - private fun markShouldFixFqName(value: Boolean) { - fun PsiElement.doMark(value: Boolean) { + private fun markPsiFiles(mark: PsiFile.() -> Unit) { + fun PsiElement.doMark(mark: PsiFile.() -> Unit) { when (this) { - is PsiJavaFile -> shouldFixFqName = value - is PsiDirectory -> children.forEach { it.doMark(value) } + is PsiFile -> mark() + is PsiDirectory -> children.forEach { it.doMark(mark) } } } - elementsToMove.forEach { it.doMark(value) } + elementsToMove.forEach { it.doMark(mark) } + } + + private fun markShouldFixFqName(value: Boolean) { + markPsiFiles { (this as? PsiJavaFile)?.shouldFixFqName = value } + } + + private fun markScopeToMove(allElementsToMove: List?) { + markPsiFiles { (this as? KtFile)?.allElementsToMove = allElementsToMove } } override fun performRefactoring(usages: Array) { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt index f43b2ac74a7..4314c08e6b5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt @@ -85,7 +85,7 @@ interface Mover : (KtNamedDeclaration, KtElement) -> KtNamedDeclaration { internal var KtSimpleNameExpression.internalUsageInfo: UsageInfo? by CopyableUserDataProperty(Key.create("INTERNAL_USAGE_INFO")) -class MoveDeclarationsDescriptor( +class MoveDeclarationsDescriptor @JvmOverloads constructor( val project: Project, val elementsToMove: Collection, val moveTarget: KotlinMoveTarget, @@ -95,7 +95,8 @@ class MoveDeclarationsDescriptor( val scanEntireFile: Boolean = false, val deleteSourceFiles: Boolean = false, val moveCallback: MoveCallback? = null, - val openInEditor: Boolean = false + val openInEditor: Boolean = false, + val allElementsToMove: List? = null ) class ConflictUsageInfo(element: PsiElement, val messages: Collection) : UsageInfo(element) @@ -188,7 +189,13 @@ class MoveKotlinDeclarationsProcessor( } val usages = ArrayList() - val conflictChecker = MoveConflictChecker(project, elementsToMove, descriptor.moveTarget, elementsToMove.first()) + val conflictChecker = MoveConflictChecker( + project, + elementsToMove, + descriptor.moveTarget, + elementsToMove.first(), + allElementsToMove = descriptor.allElementsToMove + ) for ((sourceFile, kotlinToLightElements) in kotlinToLightElementsBySourceFile) { val internalUsages = LinkedHashSet() val externalUsages = LinkedHashSet() diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/moveConflictUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/moveConflictUtils.kt index c55fc8c1618..a89a14a3e0c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/moveConflictUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/moveConflictUtils.kt @@ -18,12 +18,12 @@ package org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.vfs.VirtualFile -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiMember -import com.intellij.psi.PsiMethod +import com.intellij.psi.* import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.searches.ReferencesSearch +import com.intellij.psi.util.PsiTreeUtil import com.intellij.refactoring.RefactoringBundle import com.intellij.refactoring.util.* import com.intellij.usageView.UsageInfo @@ -40,7 +40,10 @@ import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.refactoring.getUsageContext import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.* +import org.jetbrains.kotlin.psi.psiUtil.contains +import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType +import org.jetbrains.kotlin.psi.psiUtil.isAncestor import org.jetbrains.kotlin.renderer.ClassifierNamePolicy import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy @@ -60,12 +63,15 @@ class MoveConflictChecker( private val elementsToMove: Collection, private val moveTarget: KotlinMoveTarget, contextElement: KtElement, - private val doNotGoIn: Collection = emptyList() + private val doNotGoIn: Collection = emptyList(), + allElementsToMove: Collection? = null ) { private val resolutionFacade = contextElement.getResolutionFacade() private val fakeFile = KtPsiFactory(project).createFile("") + private val allElementsToMove = allElementsToMove ?: elementsToMove + private fun PackageFragmentDescriptor.withSource(sourceFile: KtFile): PackageFragmentDescriptor { return object : PackageFragmentDescriptor by this { override fun getOriginal() = this @@ -144,10 +150,49 @@ class MoveConflictChecker( private fun render(declaration: PsiElement) = RefactoringUIUtil.getDescription(declaration, false) + // Based on RefactoringConflictsUtil.analyzeModuleConflicts + fun analyzeModuleConflictsInUsages(project: Project, + usages: Collection, + sourceRoot: VirtualFile, + conflicts: MultiMap) { + val targetModule = ModuleUtilCore.findModuleForFile(sourceRoot, project) ?: return + + val isInTestSources = ModuleRootManager.getInstance(targetModule).fileIndex.isInTestSourceContent(sourceRoot) + NextUsage@ for (usage in usages) { + val element = usage.element ?: continue + if (PsiTreeUtil.getParentOfType(element, PsiImportStatement::class.java, false) != null) continue + if (isToBeMoved(element)) continue@NextUsage + + val resolveScope = element.resolveScope + if (resolveScope.isSearchInModuleContent(targetModule, isInTestSources)) continue + + val usageFile = element.containingFile + val usageVFile = usageFile.virtualFile ?: continue + val usageModule = ModuleUtilCore.findModuleForFile(usageVFile, project) ?: continue + val container = if (usageFile is PsiJavaFile) ConflictsUtil.getContainer(element) else usageFile + val scopeDescription = RefactoringUIUtil.getDescription(container, true) + val referencedElement = (if (usage is MoveRenameUsageInfo) usage.referencedElement else usage.element) ?: error(usage) + val message = if (usageModule == targetModule && isInTestSources) { + RefactoringBundle.message("0.referenced.in.1.will.not.be.accessible.from.production.of.module.2", + RefactoringUIUtil.getDescription(referencedElement, true), + scopeDescription, + CommonRefactoringUtil.htmlEmphasize(usageModule.name)) + } + else { + RefactoringBundle.message("0.referenced.in.1.will.not.be.accessible.from.module.2", + RefactoringUIUtil.getDescription(referencedElement, true), + scopeDescription, + CommonRefactoringUtil.htmlEmphasize(usageModule.name)) + } + conflicts.putValue(referencedElement, CommonRefactoringUtil.capitalize(message)) + } + } + fun checkModuleConflictsInUsages(externalUsages: MutableSet, conflicts: MultiMap) { val newConflicts = MultiMap() val sourceRoot = moveTarget.targetFile ?: return - RefactoringConflictsUtil.analyzeModuleConflicts(project, elementsToMove, externalUsages.toTypedArray(), sourceRoot, newConflicts) + + analyzeModuleConflictsInUsages(project, externalUsages, sourceRoot, newConflicts) if (!newConflicts.isEmpty) { val referencedElementsToSkip = newConflicts.keySet().mapNotNullTo(HashSet()) { it.namedUnwrappedElement } externalUsages.removeIf { @@ -228,7 +273,7 @@ class MoveConflictChecker( val target = DescriptorToSourceUtilsIde.getAnyDeclaration(project, targetDescriptor) ?: return@forEachDescendantOfType - if (target.isInsideOf(elementsToMove)) return@forEachDescendantOfType + if (isToBeMoved(target)) return@forEachDescendantOfType if (isInScope(target, targetDescriptor)) return@forEachDescendantOfType if (target is KtTypeParameter) return@forEachDescendantOfType @@ -256,7 +301,7 @@ class MoveConflictChecker( val element = usage.element if (element == null || usage !is MoveRenameUsageInfo || usage is NonCodeUsageInfo) continue - if (element.isInsideOf(elementsToMove)) continue + if (isToBeMoved(element)) continue val referencedElement = usage.referencedElement?.namedUnwrappedElement as? KtNamedDeclaration ?: continue val referencedDescriptor = resolutionFacade.resolveToDescriptor(referencedElement) @@ -286,7 +331,7 @@ class MoveConflictChecker( refExpr.references .forEach { ref -> val target = ref.resolve() ?: return@forEach - if (target.isInsideOf(elementsToMove)) return@forEach + if (isToBeMoved(target)) return@forEach val targetDescriptor = when (target) { is KtDeclaration -> target.resolveToDescriptor() is PsiMember -> target.getJavaMemberDescriptor() @@ -298,7 +343,7 @@ class MoveConflictChecker( val dispatchReceiver = resolvedCall.dispatchReceiver if (dispatchReceiver is ExpressionReceiver && dispatchReceiver.expression is KtSuperExpression) return@forEach val receiverClass = resolvedCall.dispatchReceiver?.type?.constructor?.declarationDescriptor?.source?.getPsi() - if (receiverClass != null && receiverClass.isInsideOf(elementsToMove)) return@forEach + if (receiverClass != null && isToBeMoved(receiverClass)) return@forEach } if (!targetDescriptor.isVisibleIn(targetContainer)) { @@ -310,7 +355,7 @@ class MoveConflictChecker( } } - private fun isToBeMoved(element: PsiElement): Boolean = elementsToMove.any { it.isAncestor(element, false) } + private fun isToBeMoved(element: PsiElement): Boolean = allElementsToMove.any { it.isAncestor(element, false) } private fun checkInternalMemberUsages(conflicts: MultiMap) { val sourceRoot = moveTarget.targetFile ?: return diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt index 938d67f4348..2e00cf2974c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.refactoring.move.moveFilesOrDirectories import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.roots.JavaProjectRootsUtil +import com.intellij.openapi.util.Key import com.intellij.psi.PsiCompiledElement import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiElement @@ -39,6 +40,9 @@ import org.jetbrains.kotlin.idea.refactoring.move.updatePackageDirective import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedDeclaration +import org.jetbrains.kotlin.psi.UserDataProperty + +internal var KtFile.allElementsToMove: List? by UserDataProperty(Key.create("SCOPE_TO_MOVE")) class MoveKotlinFileHandler : MoveFileHandler() { internal class FileInfo(file: KtFile) : UsageInfo(file) @@ -94,7 +98,8 @@ class MoveKotlinFileHandler : MoveFileHandler() { elementsToMove = psiFile.declarations.filterIsInstance(), moveTarget = moveTarget, delegate = MoveDeclarationsDelegate.TopLevel, - scanEntireFile = true + scanEntireFile = true, + allElementsToMove = psiFile.allElementsToMove ), Mover.Idle ) diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/A/A.iml b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/A/A.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/A/A.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/A/src/test/J.java b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/A/src/test/J.java new file mode 100644 index 00000000000..ffaf3498bb8 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/A/src/test/J.java @@ -0,0 +1,6 @@ +package test; + +public class J { + Foo foo = new Foo(); + Bar bar = new Bar(); +} diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/B.iml b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/B.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/B.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/src/test2/Bar.kt b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/src/test2/Bar.kt new file mode 100644 index 00000000000..bd5dc026b42 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/src/test2/Bar.kt @@ -0,0 +1,6 @@ +package test2 + +class Bar { + internal val foo = Foo() + val j = J() +} \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/src/test2/Foo.kt b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/src/test2/Foo.kt new file mode 100644 index 00000000000..29eb935ad41 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/src/test2/Foo.kt @@ -0,0 +1,5 @@ +package test2 + +internal class Foo { + val j = J() +} diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/src/test2/dummy.txt b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/after/B/src/test2/dummy.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/A.iml b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/A.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/A.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/src/test/Bar.kt b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/src/test/Bar.kt new file mode 100644 index 00000000000..fc632577116 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/src/test/Bar.kt @@ -0,0 +1,6 @@ +package test + +class Bar { + internal val foo = Foo() + val j = J() +} \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/src/test/Foo.kt b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/src/test/Foo.kt new file mode 100644 index 00000000000..d8852384d20 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/src/test/Foo.kt @@ -0,0 +1,5 @@ +package test + +internal class Foo { + val j = J() +} diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/src/test/J.java b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/src/test/J.java new file mode 100644 index 00000000000..ffaf3498bb8 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/A/src/test/J.java @@ -0,0 +1,6 @@ +package test; + +public class J { + Foo foo = new Foo(); + Bar bar = new Bar(); +} diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/B/B.iml b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/B/B.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/B/B.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/B/src/test2/dummy.txt b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/before/B/src/test2/dummy.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/conflicts.txt b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/conflicts.txt new file mode 100644 index 00000000000..6282fdaf52e --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/conflicts.txt @@ -0,0 +1,6 @@ +Class test.Bar, referenced in field J.bar, will not be accessible from module A +Class test.Bar, referenced in field J.bar, will not be accessible from module A +Class test.Foo, referenced in field J.foo, will not be accessible from module A +Class test.Foo, referenced in field J.foo, will not be accessible from module A +Class test.J, referenced in property test.Bar.j, will not be accessible in module B +Class test.J, referenced in property test.Foo.j, will not be accessible in module B \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/moveMultipleFilesToUnrelatedModuleConflict.test b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/moveMultipleFilesToUnrelatedModuleConflict.test new file mode 100644 index 00000000000..0c4cb4f0c4f --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/moveMultipleFilesToUnrelatedModuleConflict.test @@ -0,0 +1,5 @@ +{ + "filesToMove": ["A/src/test/Foo.kt", "A/src/test/Bar.kt"], + "type": "MOVE_FILES_WITH_DECLARATIONS", + "targetDirectory": "B/src/test2" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MultiModuleMoveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MultiModuleMoveTestGenerated.java index eaecc30e9ed..d45102199c1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MultiModuleMoveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MultiModuleMoveTestGenerated.java @@ -66,6 +66,12 @@ public class MultiModuleMoveTestGenerated extends AbstractMultiModuleMoveTest { doTest(fileName); } + @TestMetadata("moveMultipleFilesToUnrelatedModuleConflict/moveMultipleFilesToUnrelatedModuleConflict.test") + public void testMoveMultipleFilesToUnrelatedModuleConflict_MoveMultipleFilesToUnrelatedModuleConflict() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/moveMultipleFilesToUnrelatedModuleConflict.test"); + doTest(fileName); + } + @TestMetadata("moveToModuleWithoutLibConflict/moveToModuleWithoutLibConflict.test") public void testMoveToModuleWithoutLibConflict_MoveToModuleWithoutLibConflict() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/moveMultiModule/moveToModuleWithoutLibConflict/moveToModuleWithoutLibConflict.test");