KT-4274 #Fixed

This commit is contained in:
Alexey Sedunov
2013-12-16 16:04:57 +04:00
parent 59569f23cf
commit e13abf2444
11 changed files with 130 additions and 3 deletions
@@ -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)
}
@@ -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");