diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberOutOfObjectIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberOutOfObjectIntention.kt index 5c5f3ebbcab..bfd31d640aa 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberOutOfObjectIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberOutOfObjectIntention.kt @@ -25,8 +25,10 @@ import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.* import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject +import org.jetbrains.kotlin.psi.psiUtil.isPrivate abstract class MoveMemberOutOfObjectIntention(text: String) : SelfTargetingRangeIntention(KtNamedDeclaration::class.java, text) { @@ -48,22 +50,29 @@ abstract class MoveMemberOutOfObjectIntention(text: String) : } } - if (element is KtClassOrObject) { + if (element is KtClassOrObject || !element.isPrivate() && destination is KtFile) { val moveDescriptor = MoveDeclarationsDescriptor( project, MoveSource(element), KotlinMoveTargetForExistingElement(destination), MoveDeclarationsDelegate.NestedClass() ) - object : CompositeRefactoringRunner(project, MoveKotlinDeclarationsProcessor.REFACTORING_ID) { + val compositeRefactoringRunner = object : CompositeRefactoringRunner(project, MoveKotlinDeclarationsProcessor.REFACTORING_ID) { override fun runRefactoring() = MoveKotlinDeclarationsProcessor(moveDescriptor).run() - override fun onRefactoringDone() = runWriteAction { deleteClassOrObjectIfEmpty() } - }.run() + override fun onExit() = runWriteAction { deleteClassOrObjectIfEmpty() } + } + if (element is KtClassOrObject) { + compositeRefactoringRunner.run() + } else { + val conflicts = MultiMap().apply { addConflicts(element, this) } + project.checkConflictsInteractively(conflicts) { + compositeRefactoringRunner.run() + } + } return } val conflicts = MultiMap().apply { addConflicts(element, this) } - project.checkConflictsInteractively(conflicts) { runWriteAction { Mover.Default(element, destination) diff --git a/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/after/a/A.kt b/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/after/a/A.kt new file mode 100644 index 00000000000..49946425fb8 --- /dev/null +++ b/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/after/a/A.kt @@ -0,0 +1,3 @@ +package a + +fun foo() {} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/after/b/B.kt b/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/after/b/B.kt new file mode 100644 index 00000000000..d6c9ac259cb --- /dev/null +++ b/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/after/b/B.kt @@ -0,0 +1,7 @@ +package b + +import a.foo + +fun main() { + foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/before/a/A.kt b/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/before/a/A.kt new file mode 100644 index 00000000000..320517cd957 --- /dev/null +++ b/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/before/a/A.kt @@ -0,0 +1,5 @@ +package a + +object A { + fun foo() {} +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/before/b/B.kt b/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/before/b/B.kt new file mode 100644 index 00000000000..8f8ab01a7de --- /dev/null +++ b/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/before/b/B.kt @@ -0,0 +1,7 @@ +package b + +import a.A + +fun main() { + A.foo() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/function.test b/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/function.test new file mode 100644 index 00000000000..7602f55c85e --- /dev/null +++ b/idea/testData/multiFileIntentions/moveMemberToTopLevel/function/function.test @@ -0,0 +1,5 @@ +{ + "mainFile": "a/A.kt", + "intentionClass": "org.jetbrains.kotlin.idea.intentions.MoveMemberToTopLevelIntention", + "withRuntime": "true" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/MultiFileIntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/MultiFileIntentionTestGenerated.java index 8b9da443034..6418a2540cd 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/MultiFileIntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/MultiFileIntentionTestGenerated.java @@ -108,6 +108,11 @@ public class MultiFileIntentionTestGenerated extends AbstractMultiFileIntentionT runTest("idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/optimizeImports.test"); } + @TestMetadata("moveMemberToTopLevel/function/function.test") + public void testMoveMemberToTopLevel_function_Function() throws Exception { + runTest("idea/testData/multiFileIntentions/moveMemberToTopLevel/function/function.test"); + } + @TestMetadata("moveOutOfCompanion/moveClass/moveClass.test") public void testMoveOutOfCompanion_moveClass_MoveClass() throws Exception { runTest("idea/testData/multiFileIntentions/moveOutOfCompanion/moveClass/moveClass.test");