Move statement: do not move when function last parameter is on same line as right parenthesis

#KT-14757 Fixed
This commit is contained in:
Toshiaki Kameyama
2019-08-04 02:19:36 +09:00
committed by klunnii
parent 615636ed55
commit 1d39ac1d3e
4 changed files with 40 additions and 6 deletions
@@ -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)
@@ -0,0 +1,6 @@
// MOVE: down
// IS_APPLICABLE: false
fun test(
<caret>x: String,
y: Int) {
}
@@ -0,0 +1,6 @@
// MOVE: up
// IS_APPLICABLE: false
fun test(
x: String,
<caret>y: Int) {
}
@@ -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")