From 9cadfd01ae7c0c6d05384e136a6fa6c5642935d7 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 7 Dec 2016 15:21:48 +0300 Subject: [PATCH] Introduce Variable: Allow extraction to class body/file --- .../KotlinIntroduceVariableHandler.kt | 10 +++++--- .../CantIntroduceToClass.kt.conflicts | 1 - .../CantIntroduceToFile.kt.conflicts | 1 - ...ntroduceToClass.kt => introduceToClass.kt} | 0 .../introduceToClass.kt.after | 4 ++++ ...tIntroduceToFile.kt => introduceToFile.kt} | 0 .../introduceToFile.kt.after | 2 ++ .../script/NotExpression.kts.conflicts | 2 +- .../introduce/ExtractionTestGenerated.java | 24 +++++++++---------- 9 files changed, 26 insertions(+), 18 deletions(-) delete mode 100644 idea/testData/refactoring/introduceVariable/CantIntroduceToClass.kt.conflicts delete mode 100644 idea/testData/refactoring/introduceVariable/CantIntroduceToFile.kt.conflicts rename idea/testData/refactoring/introduceVariable/{CantIntroduceToClass.kt => introduceToClass.kt} (100%) create mode 100644 idea/testData/refactoring/introduceVariable/introduceToClass.kt.after rename idea/testData/refactoring/introduceVariable/{CantIntroduceToFile.kt => introduceToFile.kt} (100%) create mode 100644 idea/testData/refactoring/introduceVariable/introduceToFile.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.kt index ce16909abd0..56afffe4204 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.kt @@ -163,7 +163,7 @@ object KotlinIntroduceVariableHandler : RefactoringActionHandler { } var anchor = calculateAnchor(commonParent, commonContainer, allReplaces) ?: return - val needBraces = commonContainer !is KtBlockExpression + val needBraces = commonContainer !is KtBlockExpression && commonContainer !is KtClassBody && commonContainer !is KtFile if (!needBraces) { property = commonContainer.addBefore(property, anchor) as KtDeclaration commonContainer.addBefore(psiFactory.createNewLine(), anchor) @@ -355,6 +355,8 @@ object KotlinIntroduceVariableHandler : RefactoringActionHandler { is KtBlockExpression -> true is KtWhenEntry -> place == parent.expression is KtDeclarationWithBody -> parent.bodyExpression == place + is KtClassBody -> true + is KtFile -> true else -> false } }?.second as? KtElement @@ -375,7 +377,7 @@ object KotlinIntroduceVariableHandler : RefactoringActionHandler { for ((place, parent) in parentsWithSelf.zip(parents)) { when { parent is KtContainerNode && place !is KtBlockExpression && !parent.isBadContainerNode(place) -> result = parent - parent is KtClassBody || parent is KtFile -> return result + parent is KtClassBody || parent is KtFile -> return if (result == null) parent as KtElement else result parent is KtBlockExpression -> result = parent parent is KtWhenEntry && place !is KtBlockExpression -> result = parent parent is KtDeclarationWithBody && parent.bodyExpression == place && place !is KtBlockExpression -> result = parent @@ -480,7 +482,9 @@ object KotlinIntroduceVariableHandler : RefactoringActionHandler { PsiTreeUtil.getNonStrictParentOfType(physicalExpression, KtTypeReference::class.java, KtConstructorCalleeExpression::class.java, - KtSuperExpression::class.java)?.let { + KtSuperExpression::class.java, + KtConstructorDelegationReferenceExpression::class.java, + KtAnnotationEntry::class.java)?.let { return showErrorHint(project, editor, KotlinRefactoringBundle.message("cannot.refactor.no.container")) } diff --git a/idea/testData/refactoring/introduceVariable/CantIntroduceToClass.kt.conflicts b/idea/testData/refactoring/introduceVariable/CantIntroduceToClass.kt.conflicts deleted file mode 100644 index 1568c6aea62..00000000000 --- a/idea/testData/refactoring/introduceVariable/CantIntroduceToClass.kt.conflicts +++ /dev/null @@ -1 +0,0 @@ -Cannot refactor in this place diff --git a/idea/testData/refactoring/introduceVariable/CantIntroduceToFile.kt.conflicts b/idea/testData/refactoring/introduceVariable/CantIntroduceToFile.kt.conflicts deleted file mode 100644 index 1568c6aea62..00000000000 --- a/idea/testData/refactoring/introduceVariable/CantIntroduceToFile.kt.conflicts +++ /dev/null @@ -1 +0,0 @@ -Cannot refactor in this place diff --git a/idea/testData/refactoring/introduceVariable/CantIntroduceToClass.kt b/idea/testData/refactoring/introduceVariable/introduceToClass.kt similarity index 100% rename from idea/testData/refactoring/introduceVariable/CantIntroduceToClass.kt rename to idea/testData/refactoring/introduceVariable/introduceToClass.kt diff --git a/idea/testData/refactoring/introduceVariable/introduceToClass.kt.after b/idea/testData/refactoring/introduceVariable/introduceToClass.kt.after new file mode 100644 index 00000000000..b393e36ffe3 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/introduceToClass.kt.after @@ -0,0 +1,4 @@ +class X { + val i = 10 + val s = i.toString() +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/CantIntroduceToFile.kt b/idea/testData/refactoring/introduceVariable/introduceToFile.kt similarity index 100% rename from idea/testData/refactoring/introduceVariable/CantIntroduceToFile.kt rename to idea/testData/refactoring/introduceVariable/introduceToFile.kt diff --git a/idea/testData/refactoring/introduceVariable/introduceToFile.kt.after b/idea/testData/refactoring/introduceVariable/introduceToFile.kt.after new file mode 100644 index 00000000000..08dc84c4000 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/introduceToFile.kt.after @@ -0,0 +1,2 @@ +val i = 10 +val s = i.toString() \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/script/NotExpression.kts.conflicts b/idea/testData/refactoring/introduceVariable/script/NotExpression.kts.conflicts index 1568c6aea62..072400d731d 100644 --- a/idea/testData/refactoring/introduceVariable/script/NotExpression.kts.conflicts +++ b/idea/testData/refactoring/introduceVariable/script/NotExpression.kts.conflicts @@ -1 +1 @@ -Cannot refactor in this place +Cannot perform refactoring without an expression diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java index e5cf87c2026..35603547621 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java @@ -56,18 +56,6 @@ public class ExtractionTestGenerated extends AbstractExtractionTest { doIntroduceVariableTest(fileName); } - @TestMetadata("CantIntroduceToClass.kt") - public void testCantIntroduceToClass() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/CantIntroduceToClass.kt"); - doIntroduceVariableTest(fileName); - } - - @TestMetadata("CantIntroduceToFile.kt") - public void testCantIntroduceToFile() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/CantIntroduceToFile.kt"); - doIntroduceVariableTest(fileName); - } - @TestMetadata("commentSkipping.kt") public void testCommentSkipping() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/commentSkipping.kt"); @@ -224,6 +212,18 @@ public class ExtractionTestGenerated extends AbstractExtractionTest { doIntroduceVariableTest(fileName); } + @TestMetadata("introduceToClass.kt") + public void testIntroduceToClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/introduceToClass.kt"); + doIntroduceVariableTest(fileName); + } + + @TestMetadata("introduceToFile.kt") + public void testIntroduceToFile() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/introduceToFile.kt"); + doIntroduceVariableTest(fileName); + } + @TestMetadata("It.kt") public void testIt() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/It.kt");