fixed PY-6271 Move statement: breaks code in case of empty line between parts of compound statement

This commit is contained in:
Ekaterina Tuzova
2012-04-10 18:10:06 +04:00
parent dae69138cb
commit be137ab0d9
5 changed files with 27 additions and 5 deletions

View File

@@ -18,6 +18,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.PythonFileType;
import com.jetbrains.python.PythonLanguage;
import com.jetbrains.python.psi.*;
@@ -129,7 +130,8 @@ public class StatementMover extends LineMover {
PyElement statementPart = getStatementParts(info, editor, file, down).first;
if (statementPart instanceof PyStatementPart) {
PyStatementList statementList = ((PyStatementPart)statementPart).getStatementList();
if (statementList != null && statementList.getStatements().length == 1 && !(myStatementToMove instanceof PsiComment)) {
if (statementList != null && statementList.getStatements().length == 1 && !(myStatementToMove instanceof PsiComment) &&
!isMoveToEmptyLine(editor, info, down)) {
if (theSameLevel) {
myStatementListToAddPassAfter = statementList;
}
@@ -274,13 +276,13 @@ public class StatementMover extends LineMover {
PsiElement element2 = file.findElementAt(offset2-1);
if (element2 instanceof PsiWhiteSpace) {
if (down) {
PsiElement tmp = PyPsiUtils.getSignificantToTheRight(element2, false);
final PsiElement tmp = PyPsiUtils.getSignificantToTheRight(element2, false);
if (tmp != null &&
editor.offsetToLogicalPosition(tmp.getTextRange().getStartOffset()).line == info.toMove2.startLine)
(editor.offsetToLogicalPosition(tmp.getTextRange().getStartOffset()).line == info.toMove2.startLine ||
tmp.getNode().getElementType() == PyTokenTypes.ELSE_KEYWORD))
element2 = tmp;
} else {
PsiElement tmp = PyPsiUtils.getSignificantToTheRight(element2, false);
final PsiElement tmp = PyPsiUtils.getSignificantToTheRight(element2, false);
if (tmp != null) {
int start = editor.offsetToLogicalPosition(tmp.getParent().getTextRange().getStartOffset()).line;
int end = editor.offsetToLogicalPosition(tmp.getParent().getTextRange().getEndOffset()).line;

View File

@@ -0,0 +1,5 @@
if True:
a = 1<caret> # <- move statement down here
else:
b = 2

View File

@@ -0,0 +1,5 @@
if True:
a = 1<caret> # <- move statement down here
else:
b = 2

View File

@@ -0,0 +1,6 @@
a = 1<caret> # <- move statement down here
if True:
pass
else:
b = 2

View File

@@ -165,6 +165,10 @@ public class PyStatementMoverTest extends PyTestCase {
doTest();
}
public void testEmptyLineInIf() { // PY-6271
doTest();
}
public void testWith() { // PY-5202
try {
setLanguageLevel(LanguageLevel.PYTHON27);