From adf43519d65671f5b85d37ed7a7f01f590f73cf4 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 6 Aug 2015 14:33:07 +0300 Subject: [PATCH] Code mover fix: correct commas / semicolons after enum entries, relevant test fixes, extra tests --- .../upDownMover/JetDeclarationMover.java | 50 ++++++++++++++++--- .../classBodyDeclarations/enums/enum1.kt | 2 +- .../enums/enum1.kt.after | 2 +- .../classBodyDeclarations/enums/enum2.kt | 2 +- .../classBodyDeclarations/enums/enum3.kt | 2 +- .../classBodyDeclarations/enums/enum4.kt | 2 +- .../enums/enum4.kt.after | 2 +- .../classBodyDeclarations/enums/enum5.kt | 7 +-- .../enums/enum5.kt.after | 16 ------ .../classBodyDeclarations/enums/enum6.kt | 7 +-- .../enums/enum6.kt.after | 16 ------ .../classBodyDeclarations/enums/enum7.kt | 10 ++++ .../enums/enum7.kt.after | 10 ++++ .../classBodyDeclarations/enums/enum8.kt | 10 ++++ .../enums/enum8.kt.after | 10 ++++ .../moveUpDown/CodeMoverTestGenerated.java | 12 +++++ 16 files changed, 108 insertions(+), 52 deletions(-) delete mode 100644 idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum5.kt.after delete mode 100644 idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum6.kt.after create mode 100644 idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum7.kt create mode 100644 idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum7.kt.after create mode 100644 idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum8.kt create mode 100644 idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum8.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/upDownMover/JetDeclarationMover.java b/idea/src/org/jetbrains/kotlin/idea/codeInsight/upDownMover/JetDeclarationMover.java index a4ea736a420..c15a0714738 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/upDownMover/JetDeclarationMover.java +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/upDownMover/JetDeclarationMover.java @@ -21,9 +21,7 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; -import com.intellij.psi.PsiComment; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; +import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -34,7 +32,44 @@ import java.util.ArrayList; import java.util.List; public class JetDeclarationMover extends AbstractJetUpDownMover { - public JetDeclarationMover() { + + private boolean moveEnumConstant = false; + + private static int findNearestNonWhitespace(@NotNull CharSequence sequence, int index) { + char ch = sequence.charAt(--index); + while (Character.isWhitespace(ch)) { + ch = sequence.charAt(--index); + } + return index; + } + + @Override + public void afterMove(@NotNull Editor editor, @NotNull PsiFile file, @NotNull MoveInfo info, boolean down) { + super.afterMove(editor, file, info, down); + if (moveEnumConstant) { + Document document = editor.getDocument(); + CharSequence cs = document.getCharsSequence(); + int end1 = findNearestNonWhitespace(cs, info.range1.getEndOffset()); + char c1 = cs.charAt(end1); + int end2 = findNearestNonWhitespace(cs, info.range2.getEndOffset()); + char c2 = cs.charAt(end2); + if (c1 == c2 || (c1 != ',' && c2 != ',')) return; + if (c1 == ';' || c2 == ';') { + // Replace comma with semicolon and vice versa + document.replaceString(end1, end1 + 1, String.valueOf(c2)); + document.replaceString(end2, end2 + 1, String.valueOf(c1)); + } + else if (c1 == ',') { + // Move comma from the end of range1 to the end of range2 + document.deleteString(end1, end1 + 1); + document.insertString(end2 + 1, ","); + } + else { + // Move comma from the end of range2 to the end of range1 + document.deleteString(end2, end2 + 1); + document.insertString(end1 + 1, ","); + } + } } @NotNull @@ -180,6 +215,7 @@ public class JetDeclarationMover extends AbstractJetUpDownMover { // elements which aren't immediately placed in class body can't leave the block PsiElement parent = sibling.getParent(); if (!(parent instanceof JetClassBody)) return null; + if (target instanceof JetEnumEntry) return null; JetClassOrObject jetClassOrObject = (JetClassOrObject) parent.getParent(); assert jetClassOrObject != null; @@ -226,10 +262,6 @@ public class JetDeclarationMover extends AbstractJetUpDownMover { return start != null && end != null ? new LineRange(start, end, editor.getDocument()) : null; } - private static boolean isEmptyPackageDirective(PsiElement adjustedSibling) { - return adjustedSibling instanceof JetPackageDirective && adjustedSibling.getTextLength() == 0; - } - @Override public boolean checkAvailable(@NotNull Editor editor, @NotNull PsiFile file, @NotNull MoveInfo info, boolean down) { if (!super.checkAvailable(editor, file, info, down)) return false; @@ -242,6 +274,8 @@ public class JetDeclarationMover extends AbstractJetUpDownMover { JetDeclaration firstDecl = getMovableDeclaration(psiRange.getFirst()); if (firstDecl == null) return false; + moveEnumConstant = firstDecl instanceof JetEnumEntry; + JetDeclaration lastDecl = getMovableDeclaration(psiRange.getSecond()); if (lastDecl == null) return false; diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum1.kt b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum1.kt index da019879c03..5ba723921bd 100644 --- a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum1.kt +++ b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum1.kt @@ -4,7 +4,7 @@ class A { // class B enum class B { // X - X + X, // Y Y } diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum1.kt.after b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum1.kt.after index b3ec6e2eaf4..08518556c52 100644 --- a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum1.kt.after +++ b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum1.kt.after @@ -4,7 +4,7 @@ class A { // class B enum class B { // Y - Y + Y, // X X } diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum2.kt b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum2.kt index 94405206aaa..0bb6b15c9b7 100644 --- a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum2.kt +++ b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum2.kt @@ -5,7 +5,7 @@ class A { // class B enum class B { // X - X + X, // Y Y } diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum3.kt b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum3.kt index 31664b32d0c..172cf27f0b3 100644 --- a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum3.kt +++ b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum3.kt @@ -5,7 +5,7 @@ class A { // class B enum class B { // X - X + X, // Y Y } diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum4.kt b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum4.kt index a25271ce9d2..3ef4b4b93ec 100644 --- a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum4.kt +++ b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum4.kt @@ -4,7 +4,7 @@ class A { // class B enum class B { // X - X + X, // Y Y } diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum4.kt.after b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum4.kt.after index fe839dcc2a6..78ca05c3481 100644 --- a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum4.kt.after +++ b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum4.kt.after @@ -4,7 +4,7 @@ class A { // class B enum class B { // Y - Y + Y, // X X } diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum5.kt b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum5.kt index 3f84d8772bb..0791fa6da4b 100644 --- a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum5.kt +++ b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum5.kt @@ -1,15 +1,16 @@ // MOVE: up +// IS_APPLICABLE: false // class A enum class A { // U - U + U, // V - V + V; // class B enum class B { // X - X + X, // Y Y } diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum5.kt.after b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum5.kt.after deleted file mode 100644 index 06c495fd2ce..00000000000 --- a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum5.kt.after +++ /dev/null @@ -1,16 +0,0 @@ -// MOVE: up -// class A -enum class A { - // U - U - // V - V - - // X - X - // class B - enum class B { - // Y - Y - } -} \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum6.kt b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum6.kt index c2f51c05e25..8b42c1d6bc2 100644 --- a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum6.kt +++ b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum6.kt @@ -1,15 +1,16 @@ // MOVE: down +// IS_APPLICABLE: false // class A enum class A { // U - U + U, // V - V + V; // class B enum class B { // X - X + X, // Y Y } diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum6.kt.after b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum6.kt.after deleted file mode 100644 index 3ae5db60683..00000000000 --- a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum6.kt.after +++ /dev/null @@ -1,16 +0,0 @@ -// MOVE: down -// class A -enum class A { - // U - U - // V - V - - // class B - enum class B { - // X - X - } - // Y - Y -} \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum7.kt b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum7.kt new file mode 100644 index 00000000000..f299996dd19 --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum7.kt @@ -0,0 +1,10 @@ +// MOVE: down +// class My +enum class My { + // first + FIRST, + // second + SECOND, + // last + LAST; +} diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum7.kt.after b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum7.kt.after new file mode 100644 index 00000000000..dd6c52eec5a --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum7.kt.after @@ -0,0 +1,10 @@ +// MOVE: down +// class My +enum class My { + // first + FIRST, + // last + LAST, + // second + SECOND; +} diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum8.kt b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum8.kt new file mode 100644 index 00000000000..2279cc8b4cf --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum8.kt @@ -0,0 +1,10 @@ +// MOVE: up +// class My +enum class My { + // first + FIRST, + // second + SECOND, + // last + LAST; +} diff --git a/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum8.kt.after b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum8.kt.after new file mode 100644 index 00000000000..d46584c8f9f --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum8.kt.after @@ -0,0 +1,10 @@ +// MOVE: up +// class My +enum class My { + // first + FIRST, + // last + LAST, + // second + SECOND; +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/moveUpDown/CodeMoverTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/moveUpDown/CodeMoverTestGenerated.java index 6464a3919c6..eaae7ea8601 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/moveUpDown/CodeMoverTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/moveUpDown/CodeMoverTestGenerated.java @@ -323,6 +323,18 @@ public class CodeMoverTestGenerated extends AbstractCodeMoverTest { String fileName = JetTestUtils.navigationMetadata("idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum6.kt"); doTestClassBodyDeclaration(fileName); } + + @TestMetadata("enum7.kt") + public void testEnum7() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum7.kt"); + doTestClassBodyDeclaration(fileName); + } + + @TestMetadata("enum8.kt") + public void testEnum8() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/codeInsight/moveUpDown/classBodyDeclarations/enums/enum8.kt"); + doTestClassBodyDeclaration(fileName); + } } @TestMetadata("idea/testData/codeInsight/moveUpDown/classBodyDeclarations/function")