KT-4274 #Fixed
This commit is contained in:
@@ -57,6 +57,25 @@ fun PsiElement.getParentByTypeAndPredicate<T: PsiElement>(
|
||||
return null
|
||||
}
|
||||
|
||||
fun PsiElement.getParentByTypesAndPredicate<T: PsiElement>(
|
||||
strict : Boolean = false, vararg parentClasses : Class<T>, predicate: (T) -> Boolean
|
||||
) : T? {
|
||||
var element = if (strict) getParent() else this
|
||||
while (element != null) {
|
||||
[suppress("UNCHECKED_CAST")]
|
||||
when {
|
||||
parentClasses.any {parentClass -> parentClass.isInstance(element)} && predicate(element!! as T) ->
|
||||
return element as T
|
||||
element is PsiFile ->
|
||||
return null
|
||||
else ->
|
||||
element = element!!.getParent()
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
fun PsiElement.getParentByType<T: PsiElement>(parentClass : Class<T>, strict : Boolean = false) : T? {
|
||||
return PsiTreeUtil.getParentOfType(this, parentClass, strict)
|
||||
}
|
||||
|
||||
@@ -9,9 +9,11 @@ import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import jet.Function1;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.psi.*;
|
||||
import org.jetbrains.jet.lang.psi.psiUtil.PsiUtilPackage;
|
||||
import org.jetbrains.jet.lexer.JetTokens;
|
||||
|
||||
import java.util.List;
|
||||
@@ -28,8 +30,24 @@ public class JetExpressionMover extends AbstractJetUpDownMover {
|
||||
public JetExpressionMover() {
|
||||
}
|
||||
|
||||
private final static Class[] MOVABLE_ELEMENT_CLASSES =
|
||||
{JetExpression.class, JetWhenEntry.class, JetValueArgument.class, PsiComment.class};
|
||||
private final static Class[] MOVABLE_ELEMENT_CLASSES = {
|
||||
JetDeclaration.class,
|
||||
JetBlockExpression.class,
|
||||
// Only assignments
|
||||
JetBinaryExpression.class,
|
||||
JetCallExpression.class,
|
||||
JetWhenEntry.class,
|
||||
JetValueArgument.class,
|
||||
PsiComment.class
|
||||
};
|
||||
|
||||
private static final Function1<PsiElement, Boolean> MOVABLE_ELEMENT_CONSTRAINT = new Function1<PsiElement, Boolean>() {
|
||||
@NotNull
|
||||
@Override
|
||||
public Boolean invoke(PsiElement element) {
|
||||
return (!(element instanceof JetBinaryExpression) || JetPsiUtil.isAssignment(element));
|
||||
}
|
||||
};
|
||||
|
||||
private final static Class[] BLOCKLIKE_ELEMENT_CLASSES =
|
||||
{JetBlockExpression.class, JetWhenExpression.class, JetClassBody.class, JetFile.class};
|
||||
@@ -352,7 +370,13 @@ public class JetExpressionMover extends AbstractJetUpDownMover {
|
||||
|
||||
@Nullable
|
||||
private static PsiElement getMovableElement(@NotNull PsiElement element, boolean lookRight) {
|
||||
PsiElement movableElement = PsiTreeUtil.getNonStrictParentOfType(element, MOVABLE_ELEMENT_CLASSES);
|
||||
//noinspection unchecked
|
||||
PsiElement movableElement = PsiUtilPackage.getParentByTypesAndPredicate(
|
||||
element,
|
||||
false,
|
||||
MOVABLE_ELEMENT_CLASSES,
|
||||
MOVABLE_ELEMENT_CONSTRAINT
|
||||
);
|
||||
if (movableElement == null) return null;
|
||||
|
||||
if (isBracelessBlock(movableElement)) {
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
// MOVE: up
|
||||
fun foo() {
|
||||
fun bar1() {}
|
||||
val x = 1 +
|
||||
<caret>2 +
|
||||
3
|
||||
fun bar2() {}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
// MOVE: up
|
||||
fun foo() {
|
||||
val x = 1 +
|
||||
<caret>2 +
|
||||
3
|
||||
fun bar1() {}
|
||||
fun bar2() {}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
// MOVE: down
|
||||
fun foo() {
|
||||
fun bar1() {}
|
||||
val x = 1 +
|
||||
<caret>2 +
|
||||
3
|
||||
fun bar2() {}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
// MOVE: down
|
||||
fun foo() {
|
||||
fun bar1() {}
|
||||
fun bar2() {}
|
||||
val x = 1 +
|
||||
<caret>2 +
|
||||
3
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
// MOVE: up
|
||||
fun foo() {
|
||||
fun bar1() {}
|
||||
val x = 1 +
|
||||
(2 +
|
||||
<caret>3)
|
||||
fun bar2() {}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
// MOVE: up
|
||||
fun foo() {
|
||||
val x = 1 +
|
||||
(2 +
|
||||
<caret>3)
|
||||
fun bar1() {}
|
||||
fun bar2() {}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
// MOVE: down
|
||||
fun foo() {
|
||||
fun bar1() {}
|
||||
val x = 1 +
|
||||
(2 +
|
||||
<caret>3)
|
||||
fun bar2() {}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
// MOVE: down
|
||||
fun foo() {
|
||||
fun bar1() {}
|
||||
fun bar2() {}
|
||||
val x = 1 +
|
||||
(2 +
|
||||
<caret>3)
|
||||
}
|
||||
+20
@@ -867,6 +867,26 @@ public class CodeMoverTestGenerated extends AbstractCodeMoverTest {
|
||||
doTestExpression("idea/testData/codeInsight/moveUpDown/expressions/if4.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("insideExpression1.kt")
|
||||
public void testInsideExpression1() throws Exception {
|
||||
doTestExpression("idea/testData/codeInsight/moveUpDown/expressions/insideExpression1.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("insideExpression2.kt")
|
||||
public void testInsideExpression2() throws Exception {
|
||||
doTestExpression("idea/testData/codeInsight/moveUpDown/expressions/insideExpression2.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("insideExpression3.kt")
|
||||
public void testInsideExpression3() throws Exception {
|
||||
doTestExpression("idea/testData/codeInsight/moveUpDown/expressions/insideExpression3.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("insideExpression4.kt")
|
||||
public void testInsideExpression4() throws Exception {
|
||||
doTestExpression("idea/testData/codeInsight/moveUpDown/expressions/insideExpression4.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("intoClosure1.kt")
|
||||
public void testIntoClosure1() throws Exception {
|
||||
doTestExpression("idea/testData/codeInsight/moveUpDown/expressions/intoClosure1.kt");
|
||||
|
||||
Reference in New Issue
Block a user