fixed PY-10947 Moving lines splits multiple statements

This commit is contained in:
Ekaterina Tuzova
2013-10-09 15:53:43 +04:00
parent cd85b16e3d
commit 193659be87
7 changed files with 50 additions and 26 deletions
@@ -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) {
@@ -2,4 +2,4 @@ if True:
a = 1
else:
a = 2
#comment <caret>
#comment <caret>
@@ -3,4 +3,4 @@ if True:
else:
#comment
a = 2
a =<caret> 3
a =<caret> 3
@@ -0,0 +1,5 @@
try:
a = 1
except ImportError as A:
print xrange
import <caret>tmp2; import tmp1
@@ -0,0 +1,5 @@
try:
a = 1
except ImportError as A:
print xrange
import <caret>tmp2; import tmp1
@@ -0,0 +1,5 @@
try:
a = 1
except ImportError as A:
import <caret>tmp2; import tmp1
print xrange
@@ -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);