From 5c329b22893701376229946e9b54287cdd6bfb58 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Mon, 11 Mar 2013 15:39:11 +0400 Subject: [PATCH] fixed PY-9070 Indentation is broken when pasting code. --- .../python/editor/PythonCopyPasteProcessor.java | 13 ++++++++++++- python/testData/copyPaste/IndentBeforeElse.after.py | 7 +++++++ python/testData/copyPaste/IndentBeforeElse.dst.py | 6 ++++++ python/testData/copyPaste/IndentBeforeElse.src.py | 4 ++++ .../com/jetbrains/python/PyCopyPasteTest.java | 4 ++++ 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 python/testData/copyPaste/IndentBeforeElse.after.py create mode 100644 python/testData/copyPaste/IndentBeforeElse.dst.py create mode 100644 python/testData/copyPaste/IndentBeforeElse.src.py diff --git a/python/src/com/jetbrains/python/editor/PythonCopyPasteProcessor.java b/python/src/com/jetbrains/python/editor/PythonCopyPasteProcessor.java index a730b19e076c..c54a57aadbe5 100644 --- a/python/src/com/jetbrains/python/editor/PythonCopyPasteProcessor.java +++ b/python/src/com/jetbrains/python/editor/PythonCopyPasteProcessor.java @@ -10,7 +10,9 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; +import com.jetbrains.python.PyTokenTypes; import com.jetbrains.python.PythonFileType; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyFunction; @@ -87,7 +89,16 @@ public class PythonCopyPasteProcessor implements CopyPastePreProcessor { int caretOffset, int lineNumber) { - final PsiElement nonWS = PyUtil.findNextNonWhitespaceAtOffset(file, caretOffset); + PsiElement nonWS = PyUtil.findNextNonWhitespaceAtOffset(file, caretOffset); + if (nonWS != null) { + final IElementType nonWSType = nonWS.getNode().getElementType(); + if (nonWSType == PyTokenTypes.ELSE_KEYWORD || nonWSType == PyTokenTypes.ELIF_KEYWORD || + nonWSType == PyTokenTypes.EXCEPT_KEYWORD || nonWSType == PyTokenTypes.FINALLY_KEYWORD) { + lineNumber -= 1; + nonWS = PyUtil.findNextNonWhitespaceAtOffset(file, getLineStartSafeOffset(document, lineNumber)); + } + } + int lineStartOffset = getLineStartSafeOffset(document, lineNumber); String indentText = document.getText(TextRange.create(lineStartOffset, caretOffset)); diff --git a/python/testData/copyPaste/IndentBeforeElse.after.py b/python/testData/copyPaste/IndentBeforeElse.after.py new file mode 100644 index 000000000000..49df4e5903d2 --- /dev/null +++ b/python/testData/copyPaste/IndentBeforeElse.after.py @@ -0,0 +1,7 @@ +def fo(): + for i in range(): + if i == 1: + do() + a = 1 + else: + does() diff --git a/python/testData/copyPaste/IndentBeforeElse.dst.py b/python/testData/copyPaste/IndentBeforeElse.dst.py new file mode 100644 index 000000000000..8ec76a408d05 --- /dev/null +++ b/python/testData/copyPaste/IndentBeforeElse.dst.py @@ -0,0 +1,6 @@ +def fo(): + for i in range(): + if i == 1: + do() + else: + does() diff --git a/python/testData/copyPaste/IndentBeforeElse.src.py b/python/testData/copyPaste/IndentBeforeElse.src.py new file mode 100644 index 000000000000..1baa05e58dc7 --- /dev/null +++ b/python/testData/copyPaste/IndentBeforeElse.src.py @@ -0,0 +1,4 @@ +a = 1 +b = 1 +c = 1 +d = 1 \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyCopyPasteTest.java b/python/testSrc/com/jetbrains/python/PyCopyPasteTest.java index a902d41568ef..11cbd69fc84b 100644 --- a/python/testSrc/com/jetbrains/python/PyCopyPasteTest.java +++ b/python/testSrc/com/jetbrains/python/PyCopyPasteTest.java @@ -289,6 +289,10 @@ public class PyCopyPasteTest extends PyTestCase { doTest(); } + public void testIndentBeforeElse() { + doTest(); + } + public void testEmpty() { doTest(); }