From 1d39ac1d3e6d34e7341c8414127375c53bbb6eaf Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Sun, 4 Aug 2019 02:19:36 +0900 Subject: [PATCH] Move statement: do not move when function last parameter is on same line as right parenthesis #KT-14757 Fixed --- .../upDownMover/KotlinExpressionMover.kt | 24 ++++++++++++++----- .../parametersAndArguments/funParams10.kt | 6 +++++ .../parametersAndArguments/funParams9.kt | 6 +++++ .../MoveStatementTestGenerated.java | 10 ++++++++ 4 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams10.kt create mode 100644 idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams9.kt 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 5cb2f086981..81fdf300891 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/upDownMover/KotlinExpressionMover.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/upDownMover/KotlinExpressionMover.kt @@ -36,6 +36,13 @@ class KotlinExpressionMover : AbstractKotlinUpDownMover() { sibling } + if (next != null) { + val afterNext = firstNonWhiteSibling(next, true) + if (afterNext?.node?.elementType == KtTokens.RPAR && + getElementLine(afterNext, editor, true) == getElementLine(next, editor, false) + ) return null + } + return next?.takeIf { it is KtParameter || it is KtValueArgument }?.let { LineRange(it, it, editor.document) }?.also { parametersOrArgsToMove = elementToCheck to next } @@ -91,7 +98,7 @@ class KotlinExpressionMover : AbstractKotlinUpDownMover() { val psiRange = StatementUpDownMover.getElementRange(editor, file, oldRange) ?: return false val firstElement = getMovableElement(psiRange.getFirst(), false) ?: return false var lastElement = getMovableElement(psiRange.getSecond(), true) ?: return false - if (isForbiddenMove(firstElement, down) || isForbiddenMove(lastElement, down)) { + if (isForbiddenMove(editor, firstElement, down) || isForbiddenMove(editor, lastElement, down)) { info.toMove2 = null return true } @@ -512,11 +519,16 @@ class KotlinExpressionMover : AbstractKotlinUpDownMover() { private fun isLastOfItsKind(element: PsiElement, down: Boolean): Boolean = getSiblingOfType(element, down, element.javaClass) == null - private fun isForbiddenMove(element: PsiElement, down: Boolean): Boolean = - if (element is KtParameter || element is KtValueArgument) - isLastOfItsKind(element, down) - else - false + private fun isForbiddenMove(editor: Editor, element: PsiElement, down: Boolean): Boolean { + if (element is KtParameter || element is KtValueArgument) { + val next = firstNonWhiteSibling(element, true) + if (next?.node?.elementType == KtTokens.RPAR && + getElementLine(next, editor, true) == getElementLine(element, editor, false) + ) return true + return isLastOfItsKind(element, down) + } + return false + } private fun isBracelessBlock(element: PsiElement): Boolean = if (element !is KtBlockExpression) diff --git a/idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams10.kt b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams10.kt new file mode 100644 index 00000000000..9051e88534b --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams10.kt @@ -0,0 +1,6 @@ +// MOVE: down +// IS_APPLICABLE: false +fun test( + x: String, + y: Int) { +} \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams9.kt b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams9.kt new file mode 100644 index 00000000000..dd861034ac9 --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams9.kt @@ -0,0 +1,6 @@ +// MOVE: up +// IS_APPLICABLE: false +fun test( + x: String, + y: Int) { +} \ 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 5680aa2905f..e2de37fb846 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/moveUpDown/MoveStatementTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/moveUpDown/MoveStatementTestGenerated.java @@ -1436,6 +1436,11 @@ public class MoveStatementTestGenerated extends AbstractMoveStatementTest { runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams1.kt"); } + @TestMetadata("funParams10.kt") + public void testFunParams10() throws Exception { + runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams10.kt"); + } + @TestMetadata("funParams2.kt") public void testFunParams2() throws Exception { runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams2.kt"); @@ -1470,6 +1475,11 @@ public class MoveStatementTestGenerated extends AbstractMoveStatementTest { public void testFunParams8() throws Exception { runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams8.kt"); } + + @TestMetadata("funParams9.kt") + public void testFunParams9() throws Exception { + runTest("idea/testData/codeInsight/moveUpDown/parametersAndArguments/funParams9.kt"); + } } @TestMetadata("idea/testData/codeInsight/moveUpDown/trailingComma")