From a1e5d2ea44475ce65489a914e33e8833f025c8d2 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Wed, 14 Dec 2011 16:32:20 +0400 Subject: [PATCH] fixed PY-5200 Move statement: ineffective moving of nested if block --- .../editorActions/moveUpDown/StatementMover.java | 13 ++++++++++--- python/testData/mover/nestedIfUp.py | 6 ++++++ python/testData/mover/nestedIfUp_afterDown.py | 7 +++++++ python/testData/mover/nestedIfUp_afterUp.py | 5 +++++ .../com/jetbrains/python/PyStatementMoverTest.java | 4 ++++ 5 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 python/testData/mover/nestedIfUp.py create mode 100644 python/testData/mover/nestedIfUp_afterDown.py create mode 100644 python/testData/mover/nestedIfUp_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 61f9dc4f9def..774c034b9521 100644 --- a/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/StatementMover.java +++ b/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/StatementMover.java @@ -349,9 +349,13 @@ public class StatementMover extends LineMover { Pair statementParts = getStatementParts(info, editor, file, down); PyElement statementPart1 = statementParts.first; PyElement statementPart2 = statementParts.second; - if (statementPart2 instanceof PyStatementPart) - myStatementPartToRemovePass = (PyStatementPart)statementParts.second; - + if (statementPart2 instanceof PyStatementPart) { + PyStatementList stList = ((PyStatementPart)statementParts.second).getStatementList(); + if (stList != null && stList.getStatements().length == 1 && stList.getStatements()[0] instanceof PyPassStatement || + moveToEmptyLine) { + myStatementPartToRemovePass = (PyStatementPart)statementParts.second; + } + } if (statementPart2 != null && statementPart1 != null && statementPart1.getParent() == statementPart2.getParent() || statementPart2 == statementPart1) return true; return false; @@ -415,6 +419,9 @@ public class StatementMover extends LineMover { CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(myStatementListToAddPass); } if (myStatementToIncreaseIndent != null) { + if (!down && myStatementPartToRemovePass != null && myStatementToAddLinebreak == null) { + info.toMove2 = new LineRange(info.toMove2.startLine-1, info.toMove2.endLine); + } increaseIndent(editor); } if (myStatementToDecreaseIndent != null) { diff --git a/python/testData/mover/nestedIfUp.py b/python/testData/mover/nestedIfUp.py new file mode 100644 index 000000000000..0db477d14024 --- /dev/null +++ b/python/testData/mover/nestedIfUp.py @@ -0,0 +1,6 @@ +if condition: + pass +elif other_condition: + pass +if another_one: # <- move up here + a=1 diff --git a/python/testData/mover/nestedIfUp_afterDown.py b/python/testData/mover/nestedIfUp_afterDown.py new file mode 100644 index 000000000000..b39ec2a92028 --- /dev/null +++ b/python/testData/mover/nestedIfUp_afterDown.py @@ -0,0 +1,7 @@ +if condition: + pass +elif other_condition: + pass + +if another_one: # <- move up here + a=1 diff --git a/python/testData/mover/nestedIfUp_afterUp.py b/python/testData/mover/nestedIfUp_afterUp.py new file mode 100644 index 000000000000..037b12e063d8 --- /dev/null +++ b/python/testData/mover/nestedIfUp_afterUp.py @@ -0,0 +1,5 @@ +if condition: + pass +elif other_condition: + if another_one: # <- move up here + a=1 diff --git a/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java b/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java index 836308574e33..7b6e63aad258 100644 --- a/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java +++ b/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java @@ -29,6 +29,10 @@ public class PyStatementMoverTest extends PyTestCase { doTest(); } + public void testNestedIfUp() { + doTest(); + } + public void testMoveDownOut() { doTest(); }