KT-4274 #Fixed
This commit is contained in:
@@ -57,6 +57,25 @@ fun PsiElement.getParentByTypeAndPredicate<T: PsiElement>(
|
|||||||
return null
|
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? {
|
fun PsiElement.getParentByType<T: PsiElement>(parentClass : Class<T>, strict : Boolean = false) : T? {
|
||||||
return PsiTreeUtil.getParentOfType(this, parentClass, strict)
|
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.openapi.util.TextRange;
|
||||||
import com.intellij.psi.*;
|
import com.intellij.psi.*;
|
||||||
import com.intellij.psi.util.PsiTreeUtil;
|
import com.intellij.psi.util.PsiTreeUtil;
|
||||||
|
import jet.Function1;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
|
import org.jetbrains.jet.lang.psi.psiUtil.PsiUtilPackage;
|
||||||
import org.jetbrains.jet.lexer.JetTokens;
|
import org.jetbrains.jet.lexer.JetTokens;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -28,8 +30,24 @@ public class JetExpressionMover extends AbstractJetUpDownMover {
|
|||||||
public JetExpressionMover() {
|
public JetExpressionMover() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private final static Class[] MOVABLE_ELEMENT_CLASSES =
|
private final static Class[] MOVABLE_ELEMENT_CLASSES = {
|
||||||
{JetExpression.class, JetWhenEntry.class, JetValueArgument.class, PsiComment.class};
|
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 =
|
private final static Class[] BLOCKLIKE_ELEMENT_CLASSES =
|
||||||
{JetBlockExpression.class, JetWhenExpression.class, JetClassBody.class, JetFile.class};
|
{JetBlockExpression.class, JetWhenExpression.class, JetClassBody.class, JetFile.class};
|
||||||
@@ -352,7 +370,13 @@ public class JetExpressionMover extends AbstractJetUpDownMover {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static PsiElement getMovableElement(@NotNull PsiElement element, boolean lookRight) {
|
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 (movableElement == null) return null;
|
||||||
|
|
||||||
if (isBracelessBlock(movableElement)) {
|
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");
|
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")
|
@TestMetadata("intoClosure1.kt")
|
||||||
public void testIntoClosure1() throws Exception {
|
public void testIntoClosure1() throws Exception {
|
||||||
doTestExpression("idea/testData/codeInsight/moveUpDown/expressions/intoClosure1.kt");
|
doTestExpression("idea/testData/codeInsight/moveUpDown/expressions/intoClosure1.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user