From 0ec3d152186a787f6448f3c719e608980e031656 Mon Sep 17 00:00:00 2001 From: Vadim Brilyantov Date: Tue, 29 Jan 2019 19:29:24 +0300 Subject: [PATCH] #KT-19924: Fix usability issue with extract declaration from file intention Fix ExtractDeclaration intention name in tests Fix ExtractDeclaration intention folder and description to avoid "not found Dir URL" exception --- idea/resources/META-INF/plugin-common.xml | 2 +- .../after.kt.template | 0 .../before.kt.template | 0 .../description.html | 5 ++ .../description.html | 5 -- ...actDeclarationFromCurrentFileIntention.kt} | 50 +++++++++---------- .../moveDeclarationToSeparateFile/.intention | 2 +- .../moveClassToExistingFile.test | 2 +- .../moveClassToFile/moveClassToFile.test | 2 +- .../moveClassToFileInDefaultPackage.test | 2 +- .../moveSingleToFile/moveSingleToFile.test | 2 +- .../optimizeImports/optimizeImports.test | 2 +- .../abstract/makeInlineClassAbstract.kt | 2 +- idea/testData/quickfix/abstract/manyImpl.kt | 2 +- .../quickfix/modifiers/noAbstractForObject.kt | 4 +- ...OfferToImplementMembersForExpectedClass.kt | 2 +- .../implemenAsConstructorParameterFunction.kt | 2 +- .../implemenAsConstructorParameterInObject.kt | 2 +- .../quickfix/removeUnused/usedClassAsAlias.kt | 2 +- .../removeUnused/usedObjectAsAlias.kt | 2 +- .../specifyOverrideExplicitly/notPossible.kt | 2 +- 21 files changed, 47 insertions(+), 47 deletions(-) rename idea/resources/intentionDescriptions/{MoveDeclarationToSeparateFileIntention => ExtractDeclarationFromCurrentFileIntention}/after.kt.template (100%) rename idea/resources/intentionDescriptions/{MoveDeclarationToSeparateFileIntention => ExtractDeclarationFromCurrentFileIntention}/before.kt.template (100%) create mode 100644 idea/resources/intentionDescriptions/ExtractDeclarationFromCurrentFileIntention/description.html delete mode 100644 idea/resources/intentionDescriptions/MoveDeclarationToSeparateFileIntention/description.html rename idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/{MoveDeclarationToSeparateFileIntention.kt => ExtractDeclarationFromCurrentFileIntention.kt} (76%) diff --git a/idea/resources/META-INF/plugin-common.xml b/idea/resources/META-INF/plugin-common.xml index 88fa2c92b5f..2a337f41a78 100644 --- a/idea/resources/META-INF/plugin-common.xml +++ b/idea/resources/META-INF/plugin-common.xml @@ -1217,7 +1217,7 @@ - org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.MoveDeclarationToSeparateFileIntention + org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ExtractDeclarationFromCurrentFileIntention Kotlin diff --git a/idea/resources/intentionDescriptions/MoveDeclarationToSeparateFileIntention/after.kt.template b/idea/resources/intentionDescriptions/ExtractDeclarationFromCurrentFileIntention/after.kt.template similarity index 100% rename from idea/resources/intentionDescriptions/MoveDeclarationToSeparateFileIntention/after.kt.template rename to idea/resources/intentionDescriptions/ExtractDeclarationFromCurrentFileIntention/after.kt.template diff --git a/idea/resources/intentionDescriptions/MoveDeclarationToSeparateFileIntention/before.kt.template b/idea/resources/intentionDescriptions/ExtractDeclarationFromCurrentFileIntention/before.kt.template similarity index 100% rename from idea/resources/intentionDescriptions/MoveDeclarationToSeparateFileIntention/before.kt.template rename to idea/resources/intentionDescriptions/ExtractDeclarationFromCurrentFileIntention/before.kt.template diff --git a/idea/resources/intentionDescriptions/ExtractDeclarationFromCurrentFileIntention/description.html b/idea/resources/intentionDescriptions/ExtractDeclarationFromCurrentFileIntention/description.html new file mode 100644 index 00000000000..03d94452d78 --- /dev/null +++ b/idea/resources/intentionDescriptions/ExtractDeclarationFromCurrentFileIntention/description.html @@ -0,0 +1,5 @@ + + +This intention extracts a top-level class or object from current file and places it in a separate one in the same package and directory. + + \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/MoveDeclarationToSeparateFileIntention/description.html b/idea/resources/intentionDescriptions/MoveDeclarationToSeparateFileIntention/description.html deleted file mode 100644 index f8a536ac78f..00000000000 --- a/idea/resources/intentionDescriptions/MoveDeclarationToSeparateFileIntention/description.html +++ /dev/null @@ -1,5 +0,0 @@ - - -This intention moves a top-level class or object to a separate file in the same package and directory. - - \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ExtractDeclarationFromCurrentFileIntention.kt similarity index 76% rename from idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt rename to idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ExtractDeclarationFromCurrentFileIntention.kt index fd9fe1caf49..83ad78f4fd6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ExtractDeclarationFromCurrentFileIntention.kt @@ -39,9 +39,9 @@ import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny -class MoveDeclarationToSeparateFileIntention : - SelfTargetingRangeIntention(KtClassOrObject::class.java, "Move declaration to separate file"), - LowPriorityAction { +class ExtractDeclarationFromCurrentFileIntention : + SelfTargetingRangeIntention(KtClassOrObject::class.java, "Extract declaration from current file"), + LowPriorityAction { override fun applicabilityRange(element: KtClassOrObject): TextRange? { if (element.name == null) return null if (element.parent !is KtFile) return null @@ -60,7 +60,7 @@ class MoveDeclarationToSeparateFileIntention : val startOffset = keyword?.startOffset ?: return null val endOffset = element.nameIdentifier?.endOffset ?: return null - text = "Move '${element.name}' to separate file" + text = "Extract '${element.name}' from current file" return TextRange(startOffset, endOffset) } @@ -84,15 +84,15 @@ class MoveDeclarationToSeparateFileIntention : // If automatic move is not possible, fall back to full-fledged Move Declarations refactoring ApplicationManager.getApplication().invokeLater { MoveKotlinTopLevelDeclarationsDialog( - project, - setOf(element), - packageName.asString(), - directory, - targetFile as? KtFile, - true, - true, - true, - null + project, + setOf(element), + packageName.asString(), + directory, + targetFile as? KtFile, + true, + true, + true, + null ).show() } return @@ -101,18 +101,18 @@ class MoveDeclarationToSeparateFileIntention : createKotlinFile(targetFileName, directory, packageName.asString()) } val descriptor = MoveDeclarationsDescriptor( - project = project, - moveSource = MoveSource(element), - moveTarget = moveTarget, - delegate = MoveDeclarationsDelegate.TopLevel, - searchInCommentsAndStrings = false, - searchInNonCode = false, - moveCallback = MoveCallback { - val newFile = directory.findFile(targetFileName) as KtFile - val newDeclaration = newFile.declarations.first() - NavigationUtil.activateFileWithPsiElement(newFile) - FileEditorManager.getInstance(project).selectedTextEditor?.moveCaret(newDeclaration.startOffset + originalOffset) - } + project = project, + moveSource = MoveSource(element), + moveTarget = moveTarget, + delegate = MoveDeclarationsDelegate.TopLevel, + searchInCommentsAndStrings = false, + searchInNonCode = false, + moveCallback = MoveCallback { + val newFile = directory.findFile(targetFileName) as KtFile + val newDeclaration = newFile.declarations.first() + NavigationUtil.activateFileWithPsiElement(newFile) + FileEditorManager.getInstance(project).selectedTextEditor?.moveCaret(newDeclaration.startOffset + originalOffset) + } ) MoveKotlinDeclarationsProcessor(descriptor).run() diff --git a/idea/testData/intentions/moveDeclarationToSeparateFile/.intention b/idea/testData/intentions/moveDeclarationToSeparateFile/.intention index 86161fabce1..8db10345705 100644 --- a/idea/testData/intentions/moveDeclarationToSeparateFile/.intention +++ b/idea/testData/intentions/moveDeclarationToSeparateFile/.intention @@ -1 +1 @@ -org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.MoveDeclarationToSeparateFileIntention \ No newline at end of file +org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ExtractDeclarationFromCurrentFileIntention \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToExistingFile/moveClassToExistingFile.test b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToExistingFile/moveClassToExistingFile.test index 64dceadea3f..fcde97abdde 100644 --- a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToExistingFile/moveClassToExistingFile.test +++ b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToExistingFile/moveClassToExistingFile.test @@ -1,4 +1,4 @@ { "mainFile": "source/test.kt", - "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.MoveDeclarationToSeparateFileIntention" + "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ExtractDeclarationFromCurrentFileIntention" } \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToFile/moveClassToFile.test b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToFile/moveClassToFile.test index 64dceadea3f..fcde97abdde 100644 --- a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToFile/moveClassToFile.test +++ b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToFile/moveClassToFile.test @@ -1,4 +1,4 @@ { "mainFile": "source/test.kt", - "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.MoveDeclarationToSeparateFileIntention" + "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ExtractDeclarationFromCurrentFileIntention" } \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToFileInDefaultPackage/moveClassToFileInDefaultPackage.test b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToFileInDefaultPackage/moveClassToFileInDefaultPackage.test index 8ec8abf567b..08d0b914bd3 100644 --- a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToFileInDefaultPackage/moveClassToFileInDefaultPackage.test +++ b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveClassToFileInDefaultPackage/moveClassToFileInDefaultPackage.test @@ -1,4 +1,4 @@ { "mainFile": "test.kt", - "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.MoveDeclarationToSeparateFileIntention" + "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ExtractDeclarationFromCurrentFileIntention" } \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveSingleToFile/moveSingleToFile.test b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveSingleToFile/moveSingleToFile.test index 0a55778dce5..9413b44b6c8 100644 --- a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveSingleToFile/moveSingleToFile.test +++ b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/moveSingleToFile/moveSingleToFile.test @@ -1,5 +1,5 @@ { "mainFile": "source/test.kt", - "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.MoveDeclarationToSeparateFileIntention", + "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ExtractDeclarationFromCurrentFileIntention", "isApplicable": "false" } \ No newline at end of file diff --git a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/optimizeImports.test b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/optimizeImports.test index bf16cae2672..170018cef9e 100644 --- a/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/optimizeImports.test +++ b/idea/testData/multiFileIntentions/moveDeclarationToSeparateFile/optimizeImports/optimizeImports.test @@ -1,5 +1,5 @@ { "mainFile": "test.kt", - "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.MoveDeclarationToSeparateFileIntention", + "intentionClass": "org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ExtractDeclarationFromCurrentFileIntention", "isApplicable": "true" } \ No newline at end of file diff --git a/idea/testData/quickfix/abstract/makeInlineClassAbstract.kt b/idea/testData/quickfix/abstract/makeInlineClassAbstract.kt index 2b982b3658f..43d03eb62bc 100644 --- a/idea/testData/quickfix/abstract/makeInlineClassAbstract.kt +++ b/idea/testData/quickfix/abstract/makeInlineClassAbstract.kt @@ -3,7 +3,7 @@ // ERROR: Primary constructor is required for inline class // ACTION: Create test // ACTION: Implement members -// ACTION: Move 'A' to separate file +// ACTION: Extract 'A' from current file // ACTION: Rename file to A.kt interface I { fun foo(): String diff --git a/idea/testData/quickfix/abstract/manyImpl.kt b/idea/testData/quickfix/abstract/manyImpl.kt index 7ff6935649e..4df489fa7e9 100644 --- a/idea/testData/quickfix/abstract/manyImpl.kt +++ b/idea/testData/quickfix/abstract/manyImpl.kt @@ -3,7 +3,7 @@ // ACTION: Create test // ACTION: Make internal // ACTION: Make private -// ACTION: Move 'X' to separate file +// ACTION: Extract 'X' from current file interface D { fun foo() diff --git a/idea/testData/quickfix/modifiers/noAbstractForObject.kt b/idea/testData/quickfix/modifiers/noAbstractForObject.kt index 10537eeab9e..9887ea6cca1 100644 --- a/idea/testData/quickfix/modifiers/noAbstractForObject.kt +++ b/idea/testData/quickfix/modifiers/noAbstractForObject.kt @@ -1,11 +1,11 @@ // "Make 'Some' abstract" "false" // ACTION: Create test // ACTION: Implement members -// ACTION: Move 'Some' to separate file +// ACTION: Extract 'Some' from current file // ACTION: Rename file to Some.kt // ERROR: Object 'Some' is not abstract and does not implement abstract member public abstract fun foo(): Unit defined in T interface T { fun foo() } -object Some : T \ No newline at end of file +object Some : T diff --git a/idea/testData/quickfix/override/dontOfferToImplementMembersForExpectedClass.kt b/idea/testData/quickfix/override/dontOfferToImplementMembersForExpectedClass.kt index a32638870a2..07140b298f7 100644 --- a/idea/testData/quickfix/override/dontOfferToImplementMembersForExpectedClass.kt +++ b/idea/testData/quickfix/override/dontOfferToImplementMembersForExpectedClass.kt @@ -1,7 +1,7 @@ // "Implement members" "false" // ACTION: Create test // ACTION: Make internal -// ACTION: Move 'A' to separate file +// ACTION: Extract 'A' from current file interface I { fun foo() diff --git a/idea/testData/quickfix/override/implemenAsConstructorParameterFunction.kt b/idea/testData/quickfix/override/implemenAsConstructorParameterFunction.kt index a2cd0aa01de..302402e6310 100644 --- a/idea/testData/quickfix/override/implemenAsConstructorParameterFunction.kt +++ b/idea/testData/quickfix/override/implemenAsConstructorParameterFunction.kt @@ -4,7 +4,7 @@ // ACTION: Make 'A' abstract // ACTION: Make internal // ACTION: Make private -// ACTION: Move 'A' to separate file +// ACTION: Extract 'A' from current file // ERROR: Class 'A' is not abstract and does not implement abstract member public abstract fun foo(): Int defined in I interface I { fun foo(): Int diff --git a/idea/testData/quickfix/override/implemenAsConstructorParameterInObject.kt b/idea/testData/quickfix/override/implemenAsConstructorParameterInObject.kt index b69abdc8c86..c46240ddda7 100644 --- a/idea/testData/quickfix/override/implemenAsConstructorParameterInObject.kt +++ b/idea/testData/quickfix/override/implemenAsConstructorParameterInObject.kt @@ -3,7 +3,7 @@ // ACTION: Implement members // ACTION: Make internal // ACTION: Make private -// ACTION: Move 'A' to separate file +// ACTION: Extract 'A' from current file // ERROR: Object 'A' is not abstract and does not implement abstract member public abstract val foo: Int defined in I interface I { val foo: Int diff --git a/idea/testData/quickfix/removeUnused/usedClassAsAlias.kt b/idea/testData/quickfix/removeUnused/usedClassAsAlias.kt index 6f602a11bb3..05a65346f07 100644 --- a/idea/testData/quickfix/removeUnused/usedClassAsAlias.kt +++ b/idea/testData/quickfix/removeUnused/usedClassAsAlias.kt @@ -1,6 +1,6 @@ // "Safe delete 'Imported'" "false" // ACTION: Create test -// ACTION: Move 'ImportedClass' to separate file +// ACTION: Extract 'ImportedClass' from current file // ACTION: Rename file to ImportedClass.kt import ImportedClass as ClassAlias diff --git a/idea/testData/quickfix/removeUnused/usedObjectAsAlias.kt b/idea/testData/quickfix/removeUnused/usedObjectAsAlias.kt index 14f43656234..8f50f5a116f 100644 --- a/idea/testData/quickfix/removeUnused/usedObjectAsAlias.kt +++ b/idea/testData/quickfix/removeUnused/usedObjectAsAlias.kt @@ -1,6 +1,6 @@ // "Safe delete 'Imported'" "false" // ACTION: Create test -// ACTION: Move 'Imported' to separate file +// ACTION: Extract 'Imported' from current file // ACTION: Rename file to Imported.kt import Imported as Alias diff --git a/idea/testData/quickfix/specifyOverrideExplicitly/notPossible.kt b/idea/testData/quickfix/specifyOverrideExplicitly/notPossible.kt index adcd5e4bbef..b73b4c26835 100644 --- a/idea/testData/quickfix/specifyOverrideExplicitly/notPossible.kt +++ b/idea/testData/quickfix/specifyOverrideExplicitly/notPossible.kt @@ -2,7 +2,7 @@ // ACTION: Create test // ACTION: Make primary constructor internal // ACTION: Make primary constructor private -// ACTION: Move 'C' to separate file +// ACTION: Extract 'C' from current file // ACTION: Rename file to C.kt interface A {