diff --git a/ChangeLog.md b/ChangeLog.md index fe5b65f0577..b8ed1700881 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -41,6 +41,7 @@ Issues fixed: - [KT-11483](https://youtrack.jetbrains.com/issue/KT-11483) Pass implicit receiver as argument when moving member function to companion object - [KT-11512](https://youtrack.jetbrains.com/issue/KT-11512) Allow choosing any source root in "Move file to directory" intention - [KT-10950](https://youtrack.jetbrains.com/issue/KT-10950) Keep original file package name when moving top-level declarations to separate file (provided it's not ambiguous) +- [KT-10174](https://youtrack.jetbrains.com/issue/KT-10174) Optimize imports after applying "Move declaration to separate file" intention #### Debugger diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt index b382b30d40d..91fba0ce546 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations +import com.intellij.codeInsight.actions.OptimizeImportsProcessor import com.intellij.codeInsight.intention.LowPriorityAction import com.intellij.codeInsight.navigation.NavigationUtil import com.intellij.openapi.application.ApplicationManager @@ -28,6 +29,7 @@ import org.jetbrains.kotlin.idea.intentions.SelfTargetingRangeIntention import org.jetbrains.kotlin.idea.core.moveCaret import org.jetbrains.kotlin.idea.refactoring.createKotlinFile import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ui.MoveKotlinTopLevelDeclarationsDialog +import org.jetbrains.kotlin.idea.refactoring.runRefactoringWithPostprocessing import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClassOrObject @@ -103,6 +105,9 @@ class MoveDeclarationToSeparateFileIntention : FileEditorManager.getInstance(project).selectedTextEditor?.moveCaret(newDeclaration.startOffset + originalOffset) } ) - MoveKotlinDeclarationsProcessor(project, moveOptions).run() + + val move = { MoveKotlinDeclarationsProcessor(project, moveOptions).run() } + val optimizeImports = { OptimizeImportsProcessor(project, file).run() } + move.runRefactoringWithPostprocessing(project, MoveKotlinDeclarationsProcessor.REFACTORING_ID, optimizeImports) } } \ No newline at end of file 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 b77aa2111fb..d4cdfc01c77 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 @@ -108,6 +108,7 @@ class MoveKotlinDeclarationsProcessor( val mover: Mover = Mover.Default) : BaseRefactoringProcessor(project) { companion object { private val REFACTORING_NAME = "Move declarations" + val REFACTORING_ID = "move.kotlin.declarations" } private var nonCodeUsages: Array? = null @@ -119,6 +120,8 @@ class MoveKotlinDeclarationsProcessor( private val resolutionFacade by lazy { KotlinCacheService.getInstance(project).getResolutionFacade(elementsToMove) } + override fun getRefactoringId() = REFACTORING_ID + override fun createUsageViewDescriptor(usages: Array): UsageViewDescriptor { val targetContainerFqName = descriptor.moveTarget.targetContainerFqName?.let { if (it.isRoot) UsageViewBundle.message("default.package.presentable.name") else it.asString() diff --git a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToFile/after/source/test.kt b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToFile/after/source/test.kt index cc7a9d70e8b..bf0c26be2f6 100644 --- a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToFile/after/source/test.kt +++ b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToFile/after/source/test.kt @@ -1,7 +1,5 @@ package p -import q.bar - fun foo() { } diff --git a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/after/Baz.kt b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/after/Baz.kt new file mode 100644 index 00000000000..fafabe1ae39 --- /dev/null +++ b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/after/Baz.kt @@ -0,0 +1,4 @@ +package baz + +class Baz { +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/after/Foo.kt b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/after/Foo.kt new file mode 100644 index 00000000000..78356433c7a --- /dev/null +++ b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/after/Foo.kt @@ -0,0 +1,7 @@ +package foo.bar + +import baz.Baz + +class Foo { + val b = Baz() +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/after/test.kt b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/after/test.kt new file mode 100644 index 00000000000..4eca9347d48 --- /dev/null +++ b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/after/test.kt @@ -0,0 +1,3 @@ +package foo.bar + +class Bar \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/before/Baz.kt b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/before/Baz.kt new file mode 100644 index 00000000000..fafabe1ae39 --- /dev/null +++ b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/before/Baz.kt @@ -0,0 +1,4 @@ +package baz + +class Baz { +} \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/before/test.kt b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/before/test.kt new file mode 100644 index 00000000000..72cad4575ab --- /dev/null +++ b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/before/test.kt @@ -0,0 +1,9 @@ +package foo.bar + +import baz.Baz + +class Foo { + val b = Baz() +} + +class Bar \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/optimizeImports.test b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/optimizeImports.test new file mode 100644 index 00000000000..bf16cae2672 --- /dev/null +++ b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/optimizeImports.test @@ -0,0 +1,5 @@ +{ + "mainFile": "test.kt", + "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.MoveDeclarationToSeparateFileIntention", + "isApplicable": "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 ba931c26b3a..e47f4d54b55 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/MultiFileIntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/MultiFileIntentionTestGenerated.java @@ -83,6 +83,12 @@ public class MultiFileIntentionTestGenerated extends AbstractMultiFileIntentionT doTest(fileName); } + @TestMetadata("moveDeclarationToSeparateFile/optimizeImports/optimizeImports.test") + public void testMoveDeclarationToSeparateFile_optimizeImports_OptimizeImports() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/optimizeImports.test"); + doTest(fileName); + } + @TestMetadata("moveFileToPackageMatchingDirectory/moveToDefaultDirectory/moveToDefaultDirectory.test") public void testMoveFileToPackageMatchingDirectory_moveToDefaultDirectory_MoveToDefaultDirectory() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/multiFileIntentions/moveFileToPackageMatchingDirectory/moveToDefaultDirectory/moveToDefaultDirectory.test");