diff --git a/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/StatementMover.java b/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/StatementMover.java index 60d3d5d09952..508397082a83 100644 --- a/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/StatementMover.java +++ b/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/StatementMover.java @@ -118,7 +118,7 @@ public class StatementMover extends LineMover { } if (isMoveToCompound(info, editor, file, down) && !moveToEmptyLine) { myStatementToIncreaseIndent = myStatementToMove; - if (!down) + if (!down && !theSameLevel) info.toMove2 = new LineRange(myStatementToMove); } @@ -281,6 +281,17 @@ public class StatementMover extends LineMover { statementPart2 = PsiTreeUtil.getParentOfType(statementPart2, PyStatementPart.class); } else { + final PsiElement parent2 = statementPart2.getParent(); + if (parent2 instanceof PyTryExceptStatement && statementPart1 != null && parent2 != statementPart1.getParent() && !down) { + if (parent2.getParent() instanceof PyStatementList) { + final PyStatementList stList = (PyStatementList)parent2.getParent(); + final PyStatement[] statements = stList.getStatements(); + if (statements[statements.length-1] == parent2) { + statementPart2 = PsiTreeUtil.getParentOfType(stList, PyStatementPart.class); + } + } + } + PyStatementList stList = ((PyStatementPart)statementPart2).getStatementList(); if (stList != null && stList.getStatements().length > 0) { if (down && stList.getStatements()[stList.getStatements().length-1] == element2) { @@ -297,23 +308,23 @@ public class StatementMover extends LineMover { } } } - return new Pair(statementPart1, statementPart2); } private boolean isMoveToCompound(MoveInfo info, Editor editor, PsiFile file, boolean down) { - Pair statementParts = getStatementParts(info, editor, file, down); - PyElement statementPart1 = statementParts.first; - PyElement statementPart2 = statementParts.second; + final Pair statementParts = getStatementParts(info, editor, file, down); + final PyElement statementPart1 = statementParts.first; + final PyElement statementPart2 = statementParts.second; if (statementPart2 != null) { if (statementPart2 instanceof PyStatementPart) prepareToStatement((PyStatementPart)statementPart2, editor.getDocument()); if (statementPart1 == null) return true; if (statementPart1.getParent() != statementPart2.getParent()) { - PsiElement commonParent = PsiTreeUtil.findCommonParent(statementPart1, statementPart2); + final PsiElement commonParent = PsiTreeUtil.findCommonParent(statementPart1, statementPart2); if (PsiTreeUtil.isAncestor(statementPart2, statementPart1, false)) return false; if ((commonParent instanceof PyIfStatement) || (commonParent instanceof PyLoopStatement) || - (commonParent instanceof PyStatementPart) || (commonParent instanceof PyWithStatement)) + (commonParent instanceof PyStatementPart) || (commonParent instanceof PyWithStatement) || + (commonParent instanceof PyTryExceptStatement)) return true; } } diff --git a/python/testData/mover/upInNested.py b/python/testData/mover/upInNested.py new file mode 100644 index 000000000000..4e170cc17d02 --- /dev/null +++ b/python/testData/mover/upInNested.py @@ -0,0 +1,7 @@ +try: + try: + print(zoo(1).foo(2)) + except: + print(zoo(0).foo(2)) +except: + zoo(3) \ No newline at end of file diff --git a/python/testData/mover/upInNested_afterDown.py b/python/testData/mover/upInNested_afterDown.py new file mode 100644 index 000000000000..4e170cc17d02 --- /dev/null +++ b/python/testData/mover/upInNested_afterDown.py @@ -0,0 +1,7 @@ +try: + try: + print(zoo(1).foo(2)) + except: + print(zoo(0).foo(2)) +except: + zoo(3) \ No newline at end of file diff --git a/python/testData/mover/upInNested_afterUp.py b/python/testData/mover/upInNested_afterUp.py new file mode 100644 index 000000000000..9b20d8ec3308 --- /dev/null +++ b/python/testData/mover/upInNested_afterUp.py @@ -0,0 +1,8 @@ +try: + try: + print(zoo(1).foo(2)) + except: + print(zoo(0).foo(2)) + zoo(3) +except: + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java b/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java index ce1f7dfda6e2..86703abe215f 100644 --- a/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java +++ b/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java @@ -121,6 +121,10 @@ public class PyStatementMoverTest extends PyTestCase { doTest(); } + public void testUpInNested() { // PY-5192 + doTest(); + } + public void testClass() { // PY-5196 doTest(); }