fixed PY-6886 Paste leads to syntactically incorrect code with caret beyond actual indent

This commit is contained in:
Ekaterina Tuzova
2012-07-06 18:29:35 +04:00
parent 84cf35f70e
commit ff1984c976
5 changed files with 51 additions and 1 deletions
@@ -12,7 +12,10 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.util.PsiUtilCore;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyFunction;
import com.jetbrains.python.psi.PyStatementList;
import java.util.List;
@@ -48,7 +51,32 @@ public class PythonCopyPasteProcessor implements CopyPastePreProcessor {
final int lineNumber = document.getLineNumber(caretOffset);
final int offset = getLineStartSafeOffset(document, lineNumber);
final PsiElement element1 = PsiUtilCore.getElementAtOffset(file, offset);
boolean moved = false;
if (element instanceof PsiWhiteSpace && element == element1) {
final PsiElement prevSibling = element.getPrevSibling();
PyStatementList statementList = null;
if (prevSibling instanceof PyFunction) {
statementList = ((PyFunction)prevSibling).getStatementList();
}
else if (prevSibling instanceof PyClass) {
statementList = ((PyClass)prevSibling).getStatementList();
}
// Caret beyond actual indent -- move to the actual offset
if (statementList != null) {
final PsiElement lastChild = statementList.getLastChild();
if (lastChild != null) {
final PsiElement whiteSpace = lastChild.getPrevSibling();
if (whiteSpace instanceof PsiWhiteSpace) {
int relatedOffset = whiteSpace.getTextRange().getEndOffset();
final int indent = relatedOffset - getLineStartSafeOffset(document, document.getLineNumber(relatedOffset));
if (caretOffset > indent) {
caretModel.moveToOffset(offset + indent);
moved = true;
}
}
}
}
final List<String> strings = StringUtil.split(element.getText(), "\n");
//user already prepared place to paste to and we just want to indent right
if (StringUtil.countChars(element.getText(), '\n') > 2) {
@@ -62,7 +90,7 @@ public class PythonCopyPasteProcessor implements CopyPastePreProcessor {
if (!strings.isEmpty())
newText += strings.get(strings.size()-1);
//pasted text'll be the only one statement in block
if (!element.getText().endsWith("\n"))
if (!element.getText().endsWith("\n") && !moved)
caretModel.moveToOffset(element.getTextRange().getEndOffset());
}
}
@@ -0,0 +1,9 @@
def foo(self):
x = 1
y = 2
def foo(self):
x = 1
y = 2
z = 3
@@ -0,0 +1,5 @@
def foo(self):
x = 1
y = 2
<caret>
z = 3
@@ -0,0 +1,4 @@
<selection>def foo(self):
x = 1
y = 2
</selection>
@@ -151,6 +151,10 @@ public class PyCopyPasteTest extends PyTestCase {
doTestMultiLine();
}
public void testIndentInnerFunction2() { //PY-6886
doTestMultiLine();
}
public void testIndentFunction() {
doTestMultiLine();
}