diff --git a/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java b/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java index 808c0ece808e..6a3e2b477008 100644 --- a/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java +++ b/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java @@ -27,33 +27,30 @@ public class PyStatementMover extends LineMover { if (!(file instanceof PyFile)) return false; final int offset = editor.getCaretModel().getOffset(); final SelectionModel selectionModel = editor.getSelectionModel(); + final Document document = editor.getDocument(); + final int lineNumber = document.getLineNumber(offset); + int start = getLineStartSafeOffset(document, lineNumber); + int end = document.getLineEndOffset(lineNumber) - 1; - if (!selectionModel.hasSelection()) { - PsiElement elementToMove = PyUtil.findNonWhitespaceAtOffset(file, offset); - if (elementToMove == null) return false; - elementToMove = getCommentOrStatement(editor.getDocument(), elementToMove); - info.toMove = new MyLineRange(elementToMove, elementToMove); - info.toMove2 = getDestinationScope(file, editor, elementToMove, down); + if (selectionModel.hasSelection()) { + start = selectionModel.getSelectionStart(); + end = selectionModel.getSelectionEnd() - 1; } - else { - final int start = selectionModel.getSelectionStart(); - final int end = selectionModel.getSelectionEnd() - 1; - PsiElement elementToMove1 = PyUtil.findNonWhitespaceAtOffset(file, start); - PsiElement elementToMove2 = PyUtil.findNonWhitespaceAtOffset(file, end); - if (elementToMove1 == null || elementToMove2 == null) return false; - elementToMove1 = getCommentOrStatement(editor.getDocument(), elementToMove1); - elementToMove2 = getCommentOrStatement(editor.getDocument(), elementToMove2); - - if (PsiTreeUtil.isAncestor(elementToMove1, elementToMove2, false)) { - elementToMove2 = elementToMove1; - } - else if (PsiTreeUtil.isAncestor(elementToMove2, elementToMove1, false)) { - elementToMove1 = elementToMove2; - } - info.toMove = new MyLineRange(elementToMove1, elementToMove2); - info.toMove2 = getDestinationScope(file, editor, down ? elementToMove2 : elementToMove1, down); + PsiElement elementToMove1 = PyUtil.findNonWhitespaceAtOffset(file, start); + PsiElement elementToMove2 = PyUtil.findNonWhitespaceAtOffset(file, end); + if (elementToMove1 == null || elementToMove2 == null) return false; + elementToMove1 = getCommentOrStatement(document, elementToMove1); + elementToMove2 = getCommentOrStatement(document, elementToMove2); + if (PsiTreeUtil.isAncestor(elementToMove1, elementToMove2, false)) { + elementToMove2 = elementToMove1; } + else if (PsiTreeUtil.isAncestor(elementToMove2, elementToMove1, false)) { + elementToMove1 = elementToMove2; + } + info.toMove = new MyLineRange(elementToMove1, elementToMove2); + info.toMove2 = getDestinationScope(file, editor, down ? elementToMove2 : elementToMove1, down); + info.indentTarget = false; info.indentSource = false; @@ -76,6 +73,12 @@ public class PyStatementMover extends LineMover { final PyStatementList statementList = getStatementList(elementToMove); final PsiElement destination = getDestinationElement(elementToMove, document, lineEndOffset, down); + + final int start = destination != null ? destination.getTextRange().getStartOffset() : lineNumber; + final int end = destination != null ? destination.getTextRange().getEndOffset() : lineNumber; + final int startLine = document.getLineNumber(start); + final int endLine = document.getLineNumber(end); + if (elementToMove instanceof PsiComment && destination instanceof PsiComment) { return new LineRange(lineNumber, lineNumber + 1); } @@ -95,7 +98,9 @@ public class PyStatementMover extends LineMover { if (scopeRange != null) return scopeRange; final PyElement scope = statementList == null ? (PyElement)elementToMove.getContainingFile() : statementList; - return new ScopeRange(scope, destination, !down, true); + if ((elementToMove instanceof PyClass) || (elementToMove instanceof PyFunction)) + return new ScopeRange(scope, null, !down, true); + return new LineRange(startLine, endLine + 1); } private static boolean moveOutsideFile(@NotNull final PsiElement elementToMove, @NotNull final Document document, int lineNumber) { diff --git a/python/testData/mover/commentOut_afterDown.py b/python/testData/mover/commentOut_afterDown.py index e6ff4e5ab6d6..279856eca063 100644 --- a/python/testData/mover/commentOut_afterDown.py +++ b/python/testData/mover/commentOut_afterDown.py @@ -2,4 +2,4 @@ if True: a = 1 else: a = 2 - #comment \ No newline at end of file + #comment diff --git a/python/testData/mover/sameLevelInIf_afterDown.py b/python/testData/mover/sameLevelInIf_afterDown.py index 881be10bfbb9..a342ac4babcc 100644 --- a/python/testData/mover/sameLevelInIf_afterDown.py +++ b/python/testData/mover/sameLevelInIf_afterDown.py @@ -3,4 +3,4 @@ if True: else: #comment a = 2 - a = 3 \ No newline at end of file + a = 3 diff --git a/python/testData/mover/theSameLevelMultiple.py b/python/testData/mover/theSameLevelMultiple.py new file mode 100644 index 000000000000..d66280af7944 --- /dev/null +++ b/python/testData/mover/theSameLevelMultiple.py @@ -0,0 +1,5 @@ +try: + a = 1 +except ImportError as A: + print xrange + import tmp2; import tmp1 diff --git a/python/testData/mover/theSameLevelMultiple_afterDown.py b/python/testData/mover/theSameLevelMultiple_afterDown.py new file mode 100644 index 000000000000..8dc36f7119a7 --- /dev/null +++ b/python/testData/mover/theSameLevelMultiple_afterDown.py @@ -0,0 +1,5 @@ +try: + a = 1 +except ImportError as A: + print xrange +import tmp2; import tmp1 diff --git a/python/testData/mover/theSameLevelMultiple_afterUp.py b/python/testData/mover/theSameLevelMultiple_afterUp.py new file mode 100644 index 000000000000..c6421530a162 --- /dev/null +++ b/python/testData/mover/theSameLevelMultiple_afterUp.py @@ -0,0 +1,5 @@ +try: + a = 1 +except ImportError as A: + import tmp2; import tmp1 + print xrange diff --git a/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java b/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java index 63bf2623195a..76c4b2f2de54 100644 --- a/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java +++ b/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java @@ -237,6 +237,10 @@ public class PyStatementMoverTest extends PyTestCase { doTest(); } + public void testTheSameLevelMultiple() { //PY-10947 + doTest(); + } + public void testWith() { // PY-5202 try { setLanguageLevel(LanguageLevel.PYTHON27);