diff --git a/python/src/META-INF/python-plugin-common.xml b/python/src/META-INF/python-plugin-common.xml index e38d2676a05c..faa3d13fe229 100644 --- a/python/src/META-INF/python-plugin-common.xml +++ b/python/src/META-INF/python-plugin-common.xml @@ -404,8 +404,6 @@ - - diff --git a/python/src/com/jetbrains/python/codeInsight/PySmartKeysOptions.java b/python/src/com/jetbrains/python/codeInsight/PySmartKeysOptions.java index 401a85a7c3c0..6ccaaf49923c 100644 --- a/python/src/com/jetbrains/python/codeInsight/PySmartKeysOptions.java +++ b/python/src/com/jetbrains/python/codeInsight/PySmartKeysOptions.java @@ -10,6 +10,7 @@ import com.intellij.openapi.options.UnnamedConfigurable; public class PySmartKeysOptions extends BeanConfigurable implements UnnamedConfigurable { public PySmartKeysOptions() { super(CodeInsightSettings.getInstance()); + CodeInsightSettings.getInstance().REFORMAT_ON_PASTE = CodeInsightSettings.NO_REFORMAT; //TODO: remove combobox from settings checkBox("INDENT_TO_CARET_ON_PASTE", "Smart indent pasted lines"); } } diff --git a/python/src/com/jetbrains/python/editor/PythonCopyPasteProcessor.java b/python/src/com/jetbrains/python/editor/PythonCopyPasteProcessor.java index 9e606f9b24f2..a730b19e076c 100644 --- a/python/src/com/jetbrains/python/editor/PythonCopyPasteProcessor.java +++ b/python/src/com/jetbrains/python/editor/PythonCopyPasteProcessor.java @@ -9,13 +9,15 @@ import com.intellij.openapi.util.text.CharFilter; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiWhiteSpace; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiUtilCore; import com.jetbrains.python.PythonFileType; -import com.jetbrains.python.psi.PyFile; -import com.jetbrains.python.psi.PyStringLiteralExpression; +import com.jetbrains.python.psi.PyClass; +import com.jetbrains.python.psi.PyFunction; +import com.jetbrains.python.psi.PyStatementList; +import com.jetbrains.python.psi.PyUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -24,6 +26,7 @@ import java.util.List; */ public class PythonCopyPasteProcessor implements CopyPastePreProcessor { + @Nullable @Override public String preprocessOnCopy(PsiFile file, int[] startOffsets, int[] endOffsets, String text) { return null; @@ -45,95 +48,103 @@ public class PythonCopyPasteProcessor implements CopyPastePreProcessor { return useTabs? ch != '\t' : ch != ' '; } }; + final CaretModel caretModel = editor.getCaretModel(); + final SelectionModel selectionModel = editor.getSelectionModel(); final Document document = editor.getDocument(); - String newText = text; + final int caretOffset = selectionModel.getSelectionStart() != selectionModel.getSelectionEnd() ? + selectionModel.getSelectionStart() : caretModel.getOffset(); + final int lineNumber = document.getLineNumber(caretOffset); + final int lineStartOffset = getLineStartSafeOffset(document, lineNumber); - if (file instanceof PyFile) { - final int caretOffset = caretModel.getOffset(); - final int lineNumber = document.getLineNumber(caretOffset); - final int lineStartOffset = getLineStartSafeOffset(document, lineNumber); + final String indentText = getIndentText(file, document, caretOffset, lineNumber); - final List strings = StringUtil.split(text, "\n"); - if (StringUtil.countChars(text, '\n') > 0 || StringUtil.startsWithWhitespace(text)) { //2, 3, 4 case from doc - final PsiElement element = PsiUtilCore.getElementAtOffset(file, caretOffset - 1); - if (PsiTreeUtil.getParentOfType(element, PyStringLiteralExpression.class) != null) return text; + int toRemove = calculateIndentToRemove(text, NOT_INDENT_FILTER); + if (StringUtil.isEmptyOrSpaces(indentText) && isApplicable(file, text, caretOffset)) { + caretModel.moveToOffset(lineStartOffset); + editor.getSelectionModel().setSelection(lineStartOffset, selectionModel.getSelectionEnd()); + } - final SelectionModel selectionModel = editor.getSelectionModel(); - if (selectionModel.getSelectionStart() != selectionModel.getSelectionEnd()) { - final int line = document.getLineNumber(selectionModel.getSelectionStart()); - final int lineOffset = getLineStartSafeOffset(document, line); - final PsiElement ws = file.findElementAt(lineOffset); - int offset = ws instanceof PsiWhiteSpace? ws.getTextRange().getEndOffset() : selectionModel.getSelectionStart(); - if (text.equals(selectionModel.getSelectedText())) return text; - caretModel.moveToOffset(offset); - selectionModel.setSelection(offset, selectionModel.getSelectionEnd()); - } - else { - if (isNotApplicable(document, caretOffset, lineStartOffset)) { - return text; - } - caretModel.moveToOffset(lineStartOffset); - } - String spaceString; - int indent = 0; - - //calculate indent to normalize text - if (strings.size() > 0) { - spaceString = strings.get(0); // insert single line - indent = StringUtil.findFirst(spaceString, NOT_INDENT_FILTER); - if (indent < 0) - indent = StringUtil.isEmptyOrSpaces(spaceString) ? spaceString.length() : 0; - - if (!StringUtil.startsWithWhitespace(spaceString) && strings.size() > 1) { // insert multi-line - spaceString = strings.get(1); - indent = StringUtil.findFirst(spaceString, NOT_INDENT_FILTER); - if (indent < 0) - indent = StringUtil.isEmptyOrSpaces(spaceString) ? spaceString.length() : 0; - - if (indent == CodeStyleSettingsManager.getSettings(project).getIndentSize(PythonFileType.INSTANCE)) { - indent = 0; - } - else { - final String trimmed = StringUtil.trimLeading(strings.get(0)); //decrease indent if needed - if (trimmed.startsWith("def ") || trimmed.startsWith("if ") || trimmed.startsWith("try:") || - trimmed.startsWith("class ") || trimmed.startsWith("for ") || trimmed.startsWith("elif ") || - trimmed.startsWith("else:") || trimmed.startsWith("except") || trimmed.startsWith("while ")) { - indent = StringUtil.findFirst(spaceString, NOT_INDENT_FILTER) / 2; - if (indent < 0) indent = 0; - } - } - } - } - - if (!StringUtil.isEmptyOrSpaces(text)) // do not process empty lines - text = StringUtil.trimTrailing(text); - - if (!StringUtil.startsWithWhitespace(text)) { // add missed whitespaces - if (indent > 0) { - final String indentSymbol = useTabs? "\t" :" "; - newText = StringUtil.repeat(indentSymbol, indent) + text; - } - else - newText = new String(text); - } - else { - newText = new String(text); // to indent correctly (see PasteHandler) - } - - if ((element instanceof PsiWhiteSpace || element.getTextOffset() == 0) && - (StringUtil.countChars(element.getText(), '\n') <= 2 && !StringUtil.isEmptyOrSpaces(text))) { - newText += "\n"; - } - else - newText = new String(newText); //user already prepared place to paste to and we just want to indent right + final List strings = StringUtil.split(text, "\n", false); + String newText = ""; + if (StringUtil.isEmptyOrSpaces(indentText)) { + for (String s : strings) { + newText += indentText + StringUtil.trimStart(s, StringUtil.repeat(useTabs? "\t" : " ", toRemove)); } } + else { + newText = text; + } + + String toString = document.getText(TextRange.create(lineStartOffset, document.getLineEndOffset(lineNumber))); + if (addLinebreak(text, toString, useTabs) && selectionModel.getSelectionStart() == selectionModel.getSelectionEnd()) + newText += "\n"; return newText; } - private boolean isNotApplicable(Document document, int caretOffset, int lineStartOffset) { - return !StringUtil.isEmptyOrSpaces(document.getText(TextRange.create(lineStartOffset, caretOffset))); + private static String getIndentText(@NotNull final PsiFile file, + @NotNull final Document document, + int caretOffset, + int lineNumber) { + + final PsiElement nonWS = PyUtil.findNextNonWhitespaceAtOffset(file, caretOffset); + int lineStartOffset = getLineStartSafeOffset(document, lineNumber); + String indentText = document.getText(TextRange.create(lineStartOffset, caretOffset)); + + if (nonWS != null && document.getLineNumber(nonWS.getTextOffset()) == lineNumber) { + indentText = document.getText(TextRange.create(lineStartOffset, nonWS.getTextOffset())); + } + else if (caretOffset == lineStartOffset) { + final PsiElement ws = file.findElementAt(lineStartOffset); + if (ws != null) { + final String wsText = ws.getText(); + final List strings = StringUtil.split(wsText, "\n"); + if (strings.size() >= 1) { + indentText = strings.get(0); + } + } + } + return indentText; + } + + private static int calculateIndentToRemove(@NotNull String text, @NotNull final CharFilter filter) { + final List strings = StringUtil.split(text, "\n", false); + int minIndent = StringUtil.findFirst(text, filter); + for (String s : strings) { + final int indent = StringUtil.findFirst(s, filter); + if (indent < minIndent) + minIndent = indent; + } + return minIndent; + } + + private static boolean isApplicable(@NotNull final PsiFile file, @NotNull String text, int caretOffset) { + final boolean useTabs = + CodeStyleSettingsManager.getSettings(file.getProject()).useTabCharacter(PythonFileType.INSTANCE); + final PsiElement nonWS = PyUtil.findNextNonWhitespaceAtOffset(file, caretOffset); + if (nonWS == null || text.endsWith("\n")) + return true; + if (inStatementList(file, caretOffset) && (text.startsWith(useTabs ? "\t" : " ") || StringUtil.split(text, "\n").size() > 1)) + return true; + return false; + } + + private static boolean inStatementList(@NotNull final PsiFile file, int caretOffset) { + final PsiElement element = file.findElementAt(caretOffset); + final PsiElement element1 = file.findElementAt(caretOffset); + return PsiTreeUtil.getParentOfType(element, PyStatementList.class) != null || + PsiTreeUtil.getParentOfType(element1, PyStatementList.class) != null || + PsiTreeUtil.getParentOfType(element, PyFunction.class) != null || + PsiTreeUtil.getParentOfType(element1, PyFunction.class) != null || + PsiTreeUtil.getParentOfType(element, PyClass.class) != null || + PsiTreeUtil.getParentOfType(element1, PyClass.class) != null; + } + + private static boolean addLinebreak(@NotNull String text, @NotNull String toString, boolean useTabs) { + if ((text.startsWith(useTabs ? "\t" : " ") || StringUtil.split(text, "\n").size() > 1) + && !text.endsWith("\n") && !StringUtil.isEmptyOrSpaces(toString)) + return true; + return false; } public static int getLineStartSafeOffset(final Document document, int line) { diff --git a/python/src/com/jetbrains/python/psi/PyUtil.java b/python/src/com/jetbrains/python/psi/PyUtil.java index c124e541e711..db4c4677f819 100644 --- a/python/src/com/jetbrains/python/psi/PyUtil.java +++ b/python/src/com/jetbrains/python/psi/PyUtil.java @@ -1181,5 +1181,26 @@ public class PyUtil { } return element instanceof PsiWhiteSpace ? null : element; } + + @Nullable + public static PsiElement findNextNonWhitespaceAtOffset(@NotNull final PsiFile psiFile, int caretOffset) { + PsiElement element = psiFile.findElementAt(caretOffset); + if (element == null) { + return null; + } + + final Document document = PsiDocumentManager.getInstance(psiFile.getProject()).getDocument(psiFile); + int lineEndOffset = 0; + if (document != null) { + int lineNumber = document.getLineNumber(caretOffset); + lineEndOffset = document.getLineEndOffset(lineNumber); + } + while (caretOffset <= lineEndOffset && element instanceof PsiWhiteSpace) { + caretOffset++; + element = psiFile.findElementAt(caretOffset); + } + return element instanceof PsiWhiteSpace ? null : element; + } + } diff --git a/python/testData/copyPaste/Empty.after.py b/python/testData/copyPaste/Empty.after.py new file mode 100644 index 000000000000..a654087890f0 --- /dev/null +++ b/python/testData/copyPaste/Empty.after.py @@ -0,0 +1,4 @@ +class A: + a = 1 + + b = 2 \ No newline at end of file diff --git a/python/testData/copyPaste/Empty.dst.py b/python/testData/copyPaste/Empty.dst.py new file mode 100644 index 000000000000..7d5389985119 --- /dev/null +++ b/python/testData/copyPaste/Empty.dst.py @@ -0,0 +1,3 @@ +class A: + a = 1 + b = 2 \ No newline at end of file diff --git a/python/testData/copyPaste/Empty.src.py b/python/testData/copyPaste/Empty.src.py new file mode 100644 index 000000000000..56a4f433a847 --- /dev/null +++ b/python/testData/copyPaste/Empty.src.py @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/python/testData/copyPaste/Indent2.after.py b/python/testData/copyPaste/Indent2.after.py index 3aacb75e0d46..88f0bed7cf48 100644 --- a/python/testData/copyPaste/Indent2.after.py +++ b/python/testData/copyPaste/Indent2.after.py @@ -1,6 +1,4 @@ def bar(): x = 1 y = 2 - - var = "string" \ No newline at end of file diff --git a/python/testData/copyPaste/Indent6994.after.py b/python/testData/copyPaste/Indent6994.after.py new file mode 100644 index 000000000000..3f787fa79b6e --- /dev/null +++ b/python/testData/copyPaste/Indent6994.after.py @@ -0,0 +1,7 @@ +def g(): + if True: + pass + else: + pass + + b = 1 \ No newline at end of file diff --git a/python/testData/copyPaste/Indent6994.dst.py b/python/testData/copyPaste/Indent6994.dst.py new file mode 100644 index 000000000000..6bc15aad63c0 --- /dev/null +++ b/python/testData/copyPaste/Indent6994.dst.py @@ -0,0 +1,3 @@ +def g(): + a = 1 + b = 1 \ No newline at end of file diff --git a/python/testData/copyPaste/Indent6994.src.py b/python/testData/copyPaste/Indent6994.src.py new file mode 100644 index 000000000000..9ba638386001 --- /dev/null +++ b/python/testData/copyPaste/Indent6994.src.py @@ -0,0 +1,5 @@ +if True: + pass +else: + pass + \ No newline at end of file diff --git a/python/testData/copyPaste/Indent7709.after.py b/python/testData/copyPaste/Indent7709.after.py new file mode 100644 index 000000000000..5d6db90bab35 --- /dev/null +++ b/python/testData/copyPaste/Indent7709.after.py @@ -0,0 +1,4 @@ +a = 1 +# some comment + +b = 2 diff --git a/python/testData/copyPaste/Indent7709.dst.py b/python/testData/copyPaste/Indent7709.dst.py new file mode 100644 index 000000000000..3080b8a3c10d --- /dev/null +++ b/python/testData/copyPaste/Indent7709.dst.py @@ -0,0 +1,4 @@ +a = 1 + + +b = 2 diff --git a/python/testData/copyPaste/Indent7709.src.py b/python/testData/copyPaste/Indent7709.src.py new file mode 100644 index 000000000000..2017f671b00b --- /dev/null +++ b/python/testData/copyPaste/Indent7709.src.py @@ -0,0 +1,4 @@ +a = 1 +# some comment + +b = 2 diff --git a/python/testData/copyPaste/Indent8982.after.py b/python/testData/copyPaste/Indent8982.after.py new file mode 100644 index 000000000000..cece39ca22aa --- /dev/null +++ b/python/testData/copyPaste/Indent8982.after.py @@ -0,0 +1,4 @@ +a = 1 +a = 1 +b = 1 +d = 1 \ No newline at end of file diff --git a/python/testData/copyPaste/Indent8982.dst.py b/python/testData/copyPaste/Indent8982.dst.py new file mode 100644 index 000000000000..f175a34bd20e --- /dev/null +++ b/python/testData/copyPaste/Indent8982.dst.py @@ -0,0 +1,4 @@ +a = 1 +b = 1 +c = 1 +d = 1 \ No newline at end of file diff --git a/python/testData/copyPaste/Indent8982.src.py b/python/testData/copyPaste/Indent8982.src.py new file mode 100644 index 000000000000..97254a421e6c --- /dev/null +++ b/python/testData/copyPaste/Indent8982.src.py @@ -0,0 +1,4 @@ +a = 1 +b = 1 +c = 1 +d = 1 \ No newline at end of file diff --git a/python/testData/copyPaste/IndentTab.after.py b/python/testData/copyPaste/IndentTab.after.py index 2a6985cdcd07..5e2203973faf 100644 --- a/python/testData/copyPaste/IndentTab.after.py +++ b/python/testData/copyPaste/IndentTab.after.py @@ -1,5 +1,5 @@ class Test: - def __init__(self): + def __init__(self): print "Line 1" - print "Line 1" + print "Line 1" diff --git a/python/testData/copyPaste/IndentTab.dst.py b/python/testData/copyPaste/IndentTab.dst.py index eea6b394d352..cde09e6cca28 100644 --- a/python/testData/copyPaste/IndentTab.dst.py +++ b/python/testData/copyPaste/IndentTab.dst.py @@ -1,4 +1,4 @@ class Test: - def __init__(self): - - print "Line 1" + def __init__(self): + + print "Line 1" diff --git a/python/testData/copyPaste/IndentTab.src.py b/python/testData/copyPaste/IndentTab.src.py index 3c6ea12c2cb2..f4574fa47995 100644 --- a/python/testData/copyPaste/IndentTab.src.py +++ b/python/testData/copyPaste/IndentTab.src.py @@ -1,4 +1,4 @@ class Test: - def __init__(self): - print "Line 1" + def __init__(self): + print "Line 1" \ No newline at end of file diff --git a/python/testData/copyPaste/NonRectangleTopLevel.after.py b/python/testData/copyPaste/NonRectangleTopLevel.after.py index 6394ce6566ac..8d646a826f6f 100644 --- a/python/testData/copyPaste/NonRectangleTopLevel.after.py +++ b/python/testData/copyPaste/NonRectangleTopLevel.after.py @@ -6,4 +6,3 @@ class A(object): def foo(self): pass - diff --git a/python/testData/copyPaste/Selection1.after.py b/python/testData/copyPaste/Selection1.after.py index 3db8d323445a..7c5d73080073 100644 --- a/python/testData/copyPaste/Selection1.after.py +++ b/python/testData/copyPaste/Selection1.after.py @@ -6,4 +6,4 @@ if True: def f(): if True: a = 1 - b = 2 \ No newline at end of file + b = 2 diff --git a/python/testData/copyPaste/Selection2.after.py b/python/testData/copyPaste/Selection2.after.py index 3db8d323445a..7c5d73080073 100644 --- a/python/testData/copyPaste/Selection2.after.py +++ b/python/testData/copyPaste/Selection2.after.py @@ -6,4 +6,4 @@ if True: def f(): if True: a = 1 - b = 2 \ No newline at end of file + b = 2 diff --git a/python/testData/copyPaste/TwoIndentedLines.after.py b/python/testData/copyPaste/TwoIndentedLines.after.py index 9ad23da9a1d1..5c51aeeb7f6a 100644 --- a/python/testData/copyPaste/TwoIndentedLines.after.py +++ b/python/testData/copyPaste/TwoIndentedLines.after.py @@ -3,5 +3,4 @@ filter(Q(myfield=123), Q(myanotherfield=321)) a = filter(Q(myfield=123), - Q(myanotherfield=321)) - + Q(myanotherfield=321)) diff --git a/python/testData/copyPaste/UnfinishedCompound.after.py b/python/testData/copyPaste/UnfinishedCompound.after.py index 473f5c3376ea..33c0e6f7ad08 100644 --- a/python/testData/copyPaste/UnfinishedCompound.after.py +++ b/python/testData/copyPaste/UnfinishedCompound.after.py @@ -2,4 +2,5 @@ def f(): if True: c = 1 + a = 1 \ No newline at end of file diff --git a/python/testData/copyPaste/multiLine/DecreaseIndent.after.py b/python/testData/copyPaste/multiLine/DecreaseIndent.after.py index 394279511fc5..a7065ada7fdc 100644 --- a/python/testData/copyPaste/multiLine/DecreaseIndent.after.py +++ b/python/testData/copyPaste/multiLine/DecreaseIndent.after.py @@ -2,6 +2,8 @@ class C: def foo(self): x = 1 y = 2 + + def foo(self): x = 1 y = 2 diff --git a/python/testData/copyPaste/multiLine/IndentFunction.after.py b/python/testData/copyPaste/multiLine/IndentFunction.after.py index f318de418c1f..8294e759b8a7 100644 --- a/python/testData/copyPaste/multiLine/IndentFunction.after.py +++ b/python/testData/copyPaste/multiLine/IndentFunction.after.py @@ -6,5 +6,6 @@ class C: x = 1 y = 2 + def bar(self): y = 2 \ No newline at end of file diff --git a/python/testData/copyPaste/multiLine/IndentInnerFunction1.after.py b/python/testData/copyPaste/multiLine/IndentInnerFunction1.after.py index 291a28f46f39..49521da959a8 100644 --- a/python/testData/copyPaste/multiLine/IndentInnerFunction1.after.py +++ b/python/testData/copyPaste/multiLine/IndentInnerFunction1.after.py @@ -1,6 +1,7 @@ def foo(self): x = 1 y = 2 + def foo(self): x = 1 y = 2 diff --git a/python/testData/copyPaste/multiLine/IndentInnerFunction2.after.py b/python/testData/copyPaste/multiLine/IndentInnerFunction2.after.py index b3d0376b4ecd..25a5f51f1df3 100644 --- a/python/testData/copyPaste/multiLine/IndentInnerFunction2.after.py +++ b/python/testData/copyPaste/multiLine/IndentInnerFunction2.after.py @@ -1,8 +1,10 @@ def foo(self): x = 1 y = 2 - def foo(self): - x = 1 - y = 2 + + def foo(self): + x = 1 + y = 2 + z = 3 \ No newline at end of file diff --git a/python/testData/copyPaste/singleLine/IndentInIfInDef.after.py b/python/testData/copyPaste/singleLine/IndentInIfInDef.after.py index eb362c158fe7..cc161779ec51 100644 --- a/python/testData/copyPaste/singleLine/IndentInIfInDef.after.py +++ b/python/testData/copyPaste/singleLine/IndentInIfInDef.after.py @@ -2,4 +2,4 @@ def f(self): x = 1 if True: b = 2 - x = 1 + x = 1 \ No newline at end of file diff --git a/python/testData/copyPaste/singleLine/IndentOnTopLevel.after.py b/python/testData/copyPaste/singleLine/IndentOnTopLevel.after.py index f2fc6c27984b..50ab099f253c 100644 --- a/python/testData/copyPaste/singleLine/IndentOnTopLevel.after.py +++ b/python/testData/copyPaste/singleLine/IndentOnTopLevel.after.py @@ -3,6 +3,7 @@ class C: x = 1 y = 2 + x = 1 def foo(): pass \ 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 7af162de0bda..a902d41568ef 100644 --- a/python/testSrc/com/jetbrains/python/PyCopyPasteTest.java +++ b/python/testSrc/com/jetbrains/python/PyCopyPasteTest.java @@ -277,10 +277,25 @@ public class PyCopyPasteTest extends PyTestCase { doTestTabs(); } + public void testIndent8982() { + doTest(); + } + + public void testIndent7709() { + doTest(); + } + + public void testIndent6994() { + doTest(); + } + + public void testEmpty() { + doTest(); + } + private void doTestTabs() { final CommonCodeStyleSettings.IndentOptions indentOptions = - CodeStyleSettingsManager.getSettings(myFixture.getProject()) - .getIndentOptions(PythonFileType.INSTANCE); + CodeStyleSettingsManager.getSettings(myFixture.getProject()).getIndentOptions(PythonFileType.INSTANCE); indentOptions.USE_TAB_CHARACTER = true; try { doTest(); @@ -294,33 +309,33 @@ public class PyCopyPasteTest extends PyTestCase { doTestTabs(); } - private void doTest() { - String name = getTestName(false); + private void doTest(String prefix) { + int oldReformat = CodeInsightSettings.getInstance().REFORMAT_ON_PASTE; + try { + CodeInsightSettings.getInstance().REFORMAT_ON_PASTE = CodeInsightSettings.NO_REFORMAT; + String name = getTestName(false); - myFixture.configureByFile("copyPaste/" + name + ".src.py"); - myFixture.performEditorAction(IdeActions.ACTION_EDITOR_COPY); - myFixture.configureByFile("copyPaste/" + name + ".dst.py"); - myFixture.performEditorAction(IdeActions.ACTION_EDITOR_PASTE); - myFixture.checkResultByFile("copyPaste/" + name + ".after.py", true); + myFixture.configureByFile("copyPaste/" + prefix + name + ".src.py"); + myFixture.performEditorAction(IdeActions.ACTION_EDITOR_COPY); + myFixture.configureByFile("copyPaste/" + prefix + name + ".dst.py"); + myFixture.performEditorAction(IdeActions.ACTION_EDITOR_PASTE); + myFixture.checkResultByFile("copyPaste/" + prefix + name + ".after.py", true); + } + finally { + CodeInsightSettings.getInstance().REFORMAT_ON_PASTE = oldReformat; + } + + } + + private void doTest() { + doTest(""); } private void doTestSingleLine() { - String name = getTestName(false); - - myFixture.configureByFile("copyPaste/singleLine/" + name + ".src.py"); - myFixture.performEditorAction(IdeActions.ACTION_EDITOR_COPY); - myFixture.configureByFile("copyPaste/singleLine/" + name + ".dst.py"); - myFixture.performEditorAction(IdeActions.ACTION_EDITOR_PASTE); - myFixture.checkResultByFile("copyPaste/singleLine/" + name + ".after.py", true); + doTest("singleLine/"); } private void doTestMultiLine() { - String name = getTestName(false); - - myFixture.configureByFile("copyPaste/multiLine/" + name + ".src.py"); - myFixture.performEditorAction(IdeActions.ACTION_EDITOR_COPY); - myFixture.configureByFile("copyPaste/multiLine/" + name + ".dst.py"); - myFixture.performEditorAction(IdeActions.ACTION_EDITOR_PASTE); - myFixture.checkResultByFile("copyPaste/multiLine/" + name + ".after.py", true); + doTest("multiLine/"); } }