diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/upDownMover/KotlinExpressionMover.kt b/idea/src/org/jetbrains/kotlin/idea/codeInsight/upDownMover/KotlinExpressionMover.kt index 5e8129c8ab9..8f89fcae16e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/upDownMover/KotlinExpressionMover.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/upDownMover/KotlinExpressionMover.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.idea.util.isComma import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypesAndPredicate +import org.jetbrains.kotlin.psi.psiUtil.getPrevSiblingIgnoringWhitespaceAndComments import org.jetbrains.kotlin.utils.addToStdlib.safeAs import java.util.function.Predicate @@ -31,7 +32,7 @@ class KotlinExpressionMover : AbstractKotlinUpDownMover() { sibling: PsiElement, down: Boolean ): LineRange? { - val next = if (sibling.node.elementType === KtTokens.COMMA) { + val next = if (sibling.node.elementType === KtTokens.COMMA || sibling is PsiComment) { firstNonWhiteSibling(sibling, down) } else { sibling @@ -544,7 +545,17 @@ class KotlinExpressionMover : AbstractKotlinUpDownMover() { down: Boolean ): PsiElement? { val element = if (down) sourceRange.lastElement else sourceRange.firstElement - var sibling = if (down) element.nextSibling else element.prevSibling + var sibling = if (down) { + val elementToCheck = sourceRange.firstElement + if (element is PsiComment && (elementToCheck is KtParameter || elementToCheck is KtValueArgument)) { + element.getPrevSiblingIgnoringWhitespaceAndComments() + } else { + element.nextSibling + } + } else { + element.prevSibling + } + val whiteSpaceTestSubject = sibling ?: kotlin.run { val parent = element.parent if (parent == null || !isBracelessBlock(parent)) return@run null @@ -589,8 +600,9 @@ class KotlinExpressionMover : AbstractKotlinUpDownMover() { if (willBeLast && comma != null && !withTrailingComma) { comma.delete() } else if (!willBeLast && comma == null) { - val parent = element.parent - parent.addAfter(KtPsiFactory(parent.project).createComma(), element) + element.children.lastOrNull()?.let { + element.addAfter(KtPsiFactory(element.project).createComma(), it) + } } } diff --git a/idea/testData/codeInsight/moveUpDown/parametersAndArguments/callArgsWithComment1.kt b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/callArgsWithComment1.kt new file mode 100644 index 00000000000..88b1b07c745 --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/callArgsWithComment1.kt @@ -0,0 +1,6 @@ +// MOVE: down +val x = foo( + a, // a + b, // b + c // c +) diff --git a/idea/testData/codeInsight/moveUpDown/parametersAndArguments/callArgsWithComment1.kt.after b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/callArgsWithComment1.kt.after new file mode 100644 index 00000000000..39cd04fd5eb --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/callArgsWithComment1.kt.after @@ -0,0 +1,6 @@ +// MOVE: down +val x = foo( + b, // b + a, // a + c // c +) diff --git a/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment1.kt b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment1.kt new file mode 100644 index 00000000000..445d3dbc500 --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment1.kt @@ -0,0 +1,6 @@ +// MOVE: down +class A( + val a: Int, // a + val b: Int, // b + val c: Int // c +) \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment1.kt.after b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment1.kt.after new file mode 100644 index 00000000000..c1f72ae66b4 --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment1.kt.after @@ -0,0 +1,6 @@ +// MOVE: down +class A( + val b: Int, // b + val a: Int, // a + val c: Int // c +) \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment2.kt b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment2.kt new file mode 100644 index 00000000000..c1f72ae66b4 --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment2.kt @@ -0,0 +1,6 @@ +// MOVE: down +class A( + val b: Int, // b + val a: Int, // a + val c: Int // c +) \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment2.kt.after b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment2.kt.after new file mode 100644 index 00000000000..c329379abdd --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment2.kt.after @@ -0,0 +1,6 @@ +// MOVE: down +class A( + val b: Int, // b + val c: Int, // c + val a: Int // a +) \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment3.kt b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment3.kt new file mode 100644 index 00000000000..2c791523e8b --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment3.kt @@ -0,0 +1,6 @@ +// MOVE: up +class A( + val b: Int, // b + val c: Int, // c + val a: Int // a +) \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment3.kt.after b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment3.kt.after new file mode 100644 index 00000000000..3a0c9e5491b --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment3.kt.after @@ -0,0 +1,6 @@ +// MOVE: up +class A( + val b: Int, // b + val a: Int, // a + val c: Int // c +) \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment4.kt b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment4.kt new file mode 100644 index 00000000000..3a0c9e5491b --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment4.kt @@ -0,0 +1,6 @@ +// MOVE: up +class A( + val b: Int, // b + val a: Int, // a + val c: Int // c +) \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment4.kt.after b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment4.kt.after new file mode 100644 index 00000000000..449b4632308 --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment4.kt.after @@ -0,0 +1,6 @@ +// MOVE: up +class A( + val a: Int, // a + val b: Int, // b + val c: Int // c +) \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/moveUpDown/MoveStatementTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/moveUpDown/MoveStatementTestGenerated.java index e2de37fb846..a5f62cfd174 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/moveUpDown/MoveStatementTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/moveUpDown/MoveStatementTestGenerated.java @@ -1391,6 +1391,11 @@ public class MoveStatementTestGenerated extends AbstractMoveStatementTest { runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/callArgs8.kt"); } + @TestMetadata("callArgsWithComment1.kt") + public void testCallArgsWithComment1() throws Exception { + runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/callArgsWithComment1.kt"); + } + @TestMetadata("classParams1.kt") public void testClassParams1() throws Exception { runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParams1.kt"); @@ -1431,6 +1436,26 @@ public class MoveStatementTestGenerated extends AbstractMoveStatementTest { runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParams8.kt"); } + @TestMetadata("classParamsWithComment1.kt") + public void testClassParamsWithComment1() throws Exception { + runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment1.kt"); + } + + @TestMetadata("classParamsWithComment2.kt") + public void testClassParamsWithComment2() throws Exception { + runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment2.kt"); + } + + @TestMetadata("classParamsWithComment3.kt") + public void testClassParamsWithComment3() throws Exception { + runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment3.kt"); + } + + @TestMetadata("classParamsWithComment4.kt") + public void testClassParamsWithComment4() throws Exception { + runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/classParamsWithComment4.kt"); + } + @TestMetadata("funParams1.kt") public void testFunParams1() throws Exception { runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams1.kt");