From e13abf24448f28dc20ea4636db5bd6101ad99541 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 16 Dec 2013 16:04:57 +0400 Subject: [PATCH] KT-4274 #Fixed --- .../jet/lang/psi/psiUtil/jetPsiUtil.kt | 19 ++++++++++++ .../upDownMover/JetExpressionMover.java | 30 +++++++++++++++++-- .../expressions/insideExpression1.kt | 8 +++++ .../expressions/insideExpression1.kt.after | 8 +++++ .../expressions/insideExpression2.kt | 8 +++++ .../expressions/insideExpression2.kt.after | 8 +++++ .../expressions/insideExpression3.kt | 8 +++++ .../expressions/insideExpression3.kt.after | 8 +++++ .../expressions/insideExpression4.kt | 8 +++++ .../expressions/insideExpression4.kt.after | 8 +++++ .../moveUpDown/CodeMoverTestGenerated.java | 20 +++++++++++++ 11 files changed, 130 insertions(+), 3 deletions(-) create mode 100644 idea/testData/codeInsight/moveUpDown/expressions/insideExpression1.kt create mode 100644 idea/testData/codeInsight/moveUpDown/expressions/insideExpression1.kt.after create mode 100644 idea/testData/codeInsight/moveUpDown/expressions/insideExpression2.kt create mode 100644 idea/testData/codeInsight/moveUpDown/expressions/insideExpression2.kt.after create mode 100644 idea/testData/codeInsight/moveUpDown/expressions/insideExpression3.kt create mode 100644 idea/testData/codeInsight/moveUpDown/expressions/insideExpression3.kt.after create mode 100644 idea/testData/codeInsight/moveUpDown/expressions/insideExpression4.kt create mode 100644 idea/testData/codeInsight/moveUpDown/expressions/insideExpression4.kt.after diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt b/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt index 8d279946471..1b3bf3e28c3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt @@ -57,6 +57,25 @@ fun PsiElement.getParentByTypeAndPredicate( return null } +fun PsiElement.getParentByTypesAndPredicate( + strict : Boolean = false, vararg parentClasses : Class, 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(parentClass : Class, strict : Boolean = false) : T? { return PsiTreeUtil.getParentOfType(this, parentClass, strict) } diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java index f766e699b91..d3132cc729d 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java @@ -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 MOVABLE_ELEMENT_CONSTRAINT = new Function1() { + @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)) { diff --git a/idea/testData/codeInsight/moveUpDown/expressions/insideExpression1.kt b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression1.kt new file mode 100644 index 00000000000..46f52c9bc6e --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression1.kt @@ -0,0 +1,8 @@ +// MOVE: up +fun foo() { + fun bar1() {} + val x = 1 + + 2 + + 3 + fun bar2() {} +} \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/expressions/insideExpression1.kt.after b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression1.kt.after new file mode 100644 index 00000000000..779c2daf92a --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression1.kt.after @@ -0,0 +1,8 @@ +// MOVE: up +fun foo() { + val x = 1 + + 2 + + 3 + fun bar1() {} + fun bar2() {} +} \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/expressions/insideExpression2.kt b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression2.kt new file mode 100644 index 00000000000..9c508cf1e69 --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression2.kt @@ -0,0 +1,8 @@ +// MOVE: down +fun foo() { + fun bar1() {} + val x = 1 + + 2 + + 3 + fun bar2() {} +} \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/expressions/insideExpression2.kt.after b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression2.kt.after new file mode 100644 index 00000000000..3fd9e8dc25d --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression2.kt.after @@ -0,0 +1,8 @@ +// MOVE: down +fun foo() { + fun bar1() {} + fun bar2() {} + val x = 1 + + 2 + + 3 +} \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/expressions/insideExpression3.kt b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression3.kt new file mode 100644 index 00000000000..a9fb22d78c6 --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression3.kt @@ -0,0 +1,8 @@ +// MOVE: up +fun foo() { + fun bar1() {} + val x = 1 + + (2 + + 3) + fun bar2() {} +} \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/expressions/insideExpression3.kt.after b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression3.kt.after new file mode 100644 index 00000000000..43c1bc24136 --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression3.kt.after @@ -0,0 +1,8 @@ +// MOVE: up +fun foo() { + val x = 1 + + (2 + + 3) + fun bar1() {} + fun bar2() {} +} \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/expressions/insideExpression4.kt b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression4.kt new file mode 100644 index 00000000000..4d339e9e761 --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression4.kt @@ -0,0 +1,8 @@ +// MOVE: down +fun foo() { + fun bar1() {} + val x = 1 + + (2 + + 3) + fun bar2() {} +} \ No newline at end of file diff --git a/idea/testData/codeInsight/moveUpDown/expressions/insideExpression4.kt.after b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression4.kt.after new file mode 100644 index 00000000000..851f71d51d5 --- /dev/null +++ b/idea/testData/codeInsight/moveUpDown/expressions/insideExpression4.kt.after @@ -0,0 +1,8 @@ +// MOVE: down +fun foo() { + fun bar1() {} + fun bar2() {} + val x = 1 + + (2 + + 3) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/moveUpDown/CodeMoverTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/moveUpDown/CodeMoverTestGenerated.java index 9dfd432dc71..a15bc9c27f8 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/moveUpDown/CodeMoverTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/moveUpDown/CodeMoverTestGenerated.java @@ -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");