From b70a2112cccd8a78f51d7cded565f61be51ca420 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Thu, 28 Sep 2017 17:37:35 +0300 Subject: [PATCH] PY-15240 Surround "self" with spaces if code style settings require it --- .../codeInsight/PyMethodNameTypedHandler.java | 36 +++++++++++++++---- ...ParamSpacesInsideEmptyParentheses.after.py | 5 +++ .../firstParamSpacesInsideEmptyParentheses.py | 5 +++ ...firstParamSpacesInsideParentheses.after.py | 5 +++ .../firstParamSpacesInsideParentheses.py | 5 +++ .../com/jetbrains/python/PyEditingTest.java | 12 +++++++ 6 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 python/testData/editing/firstParamSpacesInsideEmptyParentheses.after.py create mode 100644 python/testData/editing/firstParamSpacesInsideEmptyParentheses.py create mode 100644 python/testData/editing/firstParamSpacesInsideParentheses.after.py create mode 100644 python/testData/editing/firstParamSpacesInsideParentheses.py diff --git a/python/src/com/jetbrains/python/codeInsight/PyMethodNameTypedHandler.java b/python/src/com/jetbrains/python/codeInsight/PyMethodNameTypedHandler.java index 661190c78c8e..01058d4a0805 100644 --- a/python/src/com/jetbrains/python/codeInsight/PyMethodNameTypedHandler.java +++ b/python/src/com/jetbrains/python/codeInsight/PyMethodNameTypedHandler.java @@ -27,9 +27,13 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.psi.codeStyle.CommonCodeStyleSettings; 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.PyFunction; import com.jetbrains.python.psi.PyUtil; import com.jetbrains.python.psi.impl.PyPsiUtils; @@ -79,23 +83,41 @@ public class PyMethodNameTypedHandler extends TypedHandlerDelegate { if (flags != null) { // we're in a method // TODO: all string constants go to Settings - String pname = flags.isClassMethod() || flags.isMetaclassMethod() ? "cls" : "self"; + String paramName = flags.isClassMethod() || flags.isMetaclassMethod() ? "cls" : "self"; final boolean isNew = PyNames.NEW.equals(func.getName()); if (flags.isMetaclassMethod() && isNew) { - pname = "typ"; + paramName = "typ"; } else if (flags.isClassMethod() || isNew) { - pname = "cls"; + paramName = "cls"; + } + else if (flags.isStaticMethod()) { + paramName = ""; } - else if (flags.isStaticMethod()) pname = ""; // TODO: only print the ")" if Settings require it + final CodeStyleSettings settingsManager = CodeStyleSettingsManager.getSettings(project); + final CommonCodeStyleSettings settings = settingsManager.getCommonSettings(PythonLanguage.getInstance()); + final StringBuilder textToType = new StringBuilder(); + textToType.append("("); + if (!paramName.isEmpty()) { + if (settings.SPACE_WITHIN_METHOD_PARENTHESES) { + textToType.append(" "); + } + textToType.append(paramName); + if (settings.SPACE_WITHIN_METHOD_PARENTHESES) { + textToType.append(" "); + } + } + else if (settings.SPACE_WITHIN_EMPTY_METHOD_PARENTHESES) { + textToType.append(" "); + } + textToType.append(")"); final int caretOffset = editor.getCaretModel().getOffset(); - String textToType = "(" + pname + ")"; final CharSequence chars = editor.getDocument().getCharsSequence(); if (caretOffset == chars.length() || chars.charAt(caretOffset) != ':') { - textToType += ':'; + textToType.append(':'); } - EditorModificationUtil.insertStringAtCaret(editor, textToType, true, 1 + pname.length()); // right after param name + EditorModificationUtil.insertStringAtCaret(editor, textToType.toString(), true, 1 + paramName.length()); // right after param name return Result.STOP; } } diff --git a/python/testData/editing/firstParamSpacesInsideEmptyParentheses.after.py b/python/testData/editing/firstParamSpacesInsideEmptyParentheses.after.py new file mode 100644 index 000000000000..9afa2fabd4e0 --- /dev/null +++ b/python/testData/editing/firstParamSpacesInsideEmptyParentheses.after.py @@ -0,0 +1,5 @@ +class C: + def method(self): + + @staticmethod + def static( ): \ No newline at end of file diff --git a/python/testData/editing/firstParamSpacesInsideEmptyParentheses.py b/python/testData/editing/firstParamSpacesInsideEmptyParentheses.py new file mode 100644 index 000000000000..c02021e79e5c --- /dev/null +++ b/python/testData/editing/firstParamSpacesInsideEmptyParentheses.py @@ -0,0 +1,5 @@ +class C: + def method + + @staticmethod + def static \ No newline at end of file diff --git a/python/testData/editing/firstParamSpacesInsideParentheses.after.py b/python/testData/editing/firstParamSpacesInsideParentheses.after.py new file mode 100644 index 000000000000..9a3b717b9716 --- /dev/null +++ b/python/testData/editing/firstParamSpacesInsideParentheses.after.py @@ -0,0 +1,5 @@ +class C: + def method( self ): + + @staticmethod + def static(): \ No newline at end of file diff --git a/python/testData/editing/firstParamSpacesInsideParentheses.py b/python/testData/editing/firstParamSpacesInsideParentheses.py new file mode 100644 index 000000000000..c02021e79e5c --- /dev/null +++ b/python/testData/editing/firstParamSpacesInsideParentheses.py @@ -0,0 +1,5 @@ +class C: + def method + + @staticmethod + def static \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyEditingTest.java b/python/testSrc/com/jetbrains/python/PyEditingTest.java index a6a1311bcf8c..979e634efe2b 100644 --- a/python/testSrc/com/jetbrains/python/PyEditingTest.java +++ b/python/testSrc/com/jetbrains/python/PyEditingTest.java @@ -552,6 +552,18 @@ public class PyEditingTest extends PyTestCase { doTypingTest('('); } + // PY-15240 + public void testFirstParamSpacesInsideParentheses() { + getCommonCodeStyleSettings().SPACE_WITHIN_METHOD_PARENTHESES = true; + doTypingTest('('); + } + + // PY-15240 + public void testFirstParamSpacesInsideEmptyParentheses() { + getCommonCodeStyleSettings().SPACE_WITHIN_EMPTY_METHOD_PARENTHESES = true; + doTypingTest('('); + } + // PY-21289 public void testPairedParenthesesMultipleCalls() { doTypingTest('(');