From 7e1917023dc8947a5cba0da3167c9a3e38d70ec2 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Thu, 22 Mar 2012 14:44:10 +0400 Subject: [PATCH] fixed PY-5192 Move Statement: breaks code in case moving down to nested try statement --- .../moveUpDown/StatementMover.java | 25 +++++++++++++------ python/testData/mover/upInNested.py | 7 ++++++ python/testData/mover/upInNested_afterDown.py | 7 ++++++ python/testData/mover/upInNested_afterUp.py | 8 ++++++ .../python/PyStatementMoverTest.java | 4 +++ 5 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 python/testData/mover/upInNested.py create mode 100644 python/testData/mover/upInNested_afterDown.py create mode 100644 python/testData/mover/upInNested_afterUp.py 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(); }