From 31981b778cfb601f496b929f53573dfba54ae2c3 Mon Sep 17 00:00:00 2001 From: "alexey.ivanov" Date: Fri, 7 May 2010 16:57:20 +0400 Subject: [PATCH] fixed PY-950 Exception from Move Statement, more tests --- .../moveUpDown/StatementMover.java | 38 ++++++++++++------- python/testData/mover/py950.py | 7 ++++ python/testData/mover/py950_afterDown.py | 7 ++++ python/testData/mover/py950_afterUp.py | 7 ++++ python/testData/mover/simpleBlankLines.py | 9 +++++ .../mover/simpleBlankLines_afterDown.py | 9 +++++ .../mover/simpleBlankLines_afterUp.py | 9 +++++ .../python/PyStatementMoverTest.java | 8 ++++ 8 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 python/testData/mover/py950.py create mode 100644 python/testData/mover/py950_afterDown.py create mode 100644 python/testData/mover/py950_afterUp.py create mode 100644 python/testData/mover/simpleBlankLines.py create mode 100644 python/testData/mover/simpleBlankLines_afterDown.py create mode 100644 python/testData/mover/simpleBlankLines_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 fa3eed0b3f22..2c2a0aa0bd2f 100644 --- a/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/StatementMover.java +++ b/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/StatementMover.java @@ -106,7 +106,9 @@ public class StatementMover extends LineMover { } @Nullable - private static LineRange expandLineRange(LineRange range, Editor editor, PsiFile file) { + private static LineRange expandLineRange(@NotNull final LineRange range, + @NotNull final Editor editor, + @NotNull final PsiFile file) { final SelectionModel selectionModel = editor.getSelectionModel(); Pair psiRange; if (selectionModel.hasSelection()) { @@ -136,11 +138,14 @@ public class StatementMover extends LineMover { return null; } - if (elementRange.getFirst() == elementRange.getSecond() && elementRange.getFirst() instanceof PyPassStatement) { + final PsiElement first = elementRange.getFirst(); + final PsiElement second = elementRange.getSecond(); + if (first == second && first instanceof PyPassStatement) { return null; } - final int endOffset = elementRange.getSecond().getTextRange().getEndOffset(); + int startOffset = first.getTextOffset(); + int endOffset = second.getTextRange().getEndOffset(); final Document document = editor.getDocument(); if (endOffset > document.getTextLength()) { LOG.assertTrue(!PsiDocumentManager.getInstance(file.getProject()).isUncommited(document)); @@ -156,7 +161,7 @@ public class StatementMover extends LineMover { endLine = Math.min(endLine, document.getLineCount()); } endLine = Math.max(endLine, range.endLine); - final int startLine = Math.min(range.startLine, editor.offsetToLogicalPosition(elementRange.getFirst().getTextOffset()).line); + final int startLine = Math.min(range.startLine, editor.offsetToLogicalPosition(startOffset).line); return new LineRange(startLine, endLine); } @@ -257,22 +262,27 @@ public class StatementMover extends LineMover { } info.toMove2 = new LineRange(statement, statement, document); - final PyStatementPart[] statementParts = PsiTreeUtil.getChildrenOfType(statement, PyStatementPart.class); + // next/previous statement has a statement parts + // move inside statement part if (statementParts != null) { - // move inside statement part + int startLineNumber; + int endLineNumber; + PyStatementPart statementPart; if (down) { - final PyStatementPart statementPart = statementParts[0]; - final int lineNumber = document.getLineNumber(statementPart.getTextRange().getStartOffset()); - info.toMove2 = new LineRange(lineNumber, lineNumber + 1); - myStatementListToRemovePass = statementPart.getStatementList(); - myElementsToIncreaseIndent = statements; + statementPart = statementParts[0]; + startLineNumber = document.getLineNumber(statementPart.getTextRange().getStartOffset()); + endLineNumber = document.getLineNumber(statementPart.getTextRange().getEndOffset()); } else { - final PyStatementPart statementPart = statementParts[statementParts.length - 1]; - final int lineNumber = document.getLineNumber(statementPart.getTextRange().getEndOffset()); - info.toMove2 = new LineRange(lineNumber, lineNumber + 1); + statementPart = statementParts[statementParts.length - 1]; + startLineNumber = document.getLineNumber(statementPart.getTextRange().getEndOffset()); + endLineNumber = document.getLineNumber(statementPart.getTextRange().getStartOffset()); + } + + if (startLineNumber != endLineNumber) { + info.toMove2 = new LineRange(startLineNumber, startLineNumber + 1); myStatementListToRemovePass = statementPart.getStatementList(); myElementsToIncreaseIndent = statements; } diff --git a/python/testData/mover/py950.py b/python/testData/mover/py950.py new file mode 100644 index 000000000000..ca1a926e4f47 --- /dev/null +++ b/python/testData/mover/py950.py @@ -0,0 +1,7 @@ +class A: + def foo(self): + if a: pass + else: pass + a = 0 + if a: pass + else: pass \ No newline at end of file diff --git a/python/testData/mover/py950_afterDown.py b/python/testData/mover/py950_afterDown.py new file mode 100644 index 000000000000..7ef13131f14a --- /dev/null +++ b/python/testData/mover/py950_afterDown.py @@ -0,0 +1,7 @@ +class A: + def foo(self): + if a: pass + else: pass + if a: pass + else: pass + a = 0 diff --git a/python/testData/mover/py950_afterUp.py b/python/testData/mover/py950_afterUp.py new file mode 100644 index 000000000000..d6e3ed85ab57 --- /dev/null +++ b/python/testData/mover/py950_afterUp.py @@ -0,0 +1,7 @@ +class A: + def foo(self): + a = 0 + if a: pass + else: pass + if a: pass + else: pass \ No newline at end of file diff --git a/python/testData/mover/simpleBlankLines.py b/python/testData/mover/simpleBlankLines.py new file mode 100644 index 000000000000..f8deb51f225f --- /dev/null +++ b/python/testData/mover/simpleBlankLines.py @@ -0,0 +1,9 @@ +if a: + a = 1 + + + b = 2 + + + + c = 3 \ No newline at end of file diff --git a/python/testData/mover/simpleBlankLines_afterDown.py b/python/testData/mover/simpleBlankLines_afterDown.py new file mode 100644 index 000000000000..91b5334ed539 --- /dev/null +++ b/python/testData/mover/simpleBlankLines_afterDown.py @@ -0,0 +1,9 @@ +if a: + a = 1 + + + c = 3 + + + + b = 2 diff --git a/python/testData/mover/simpleBlankLines_afterUp.py b/python/testData/mover/simpleBlankLines_afterUp.py new file mode 100644 index 000000000000..fcfdc80996a5 --- /dev/null +++ b/python/testData/mover/simpleBlankLines_afterUp.py @@ -0,0 +1,9 @@ +if a: + b = 2 + + + a = 1 + + + + c = 3 \ 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 2fa8ead98a2c..7aa018ca6202 100644 --- a/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java +++ b/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java @@ -60,4 +60,12 @@ public class PyStatementMoverTest extends PyLightFixtureTestCase { public void testSelection() throws Exception { doTest(); } + + public void testSimpleBlankLines() throws Exception { + doTest(); + } + + public void testPY950() throws Exception { + doTest(); + } }