diff --git a/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java b/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java index 92f3c9319120..01491ac9604e 100644 --- a/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java +++ b/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java @@ -13,7 +13,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; @@ -25,7 +24,10 @@ import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.PyBuiltinCache; import com.jetbrains.python.psi.impl.PyQualifiedName; import com.jetbrains.python.psi.resolve.QualifiedNameFinder; -import com.jetbrains.python.psi.types.*; +import com.jetbrains.python.psi.types.PyClassType; +import com.jetbrains.python.psi.types.PyType; +import com.jetbrains.python.psi.types.PyTypeParser; +import com.jetbrains.python.psi.types.TypeEvalContext; import com.jetbrains.python.toolbox.ChainIterable; import com.jetbrains.python.toolbox.FP; import org.apache.commons.httpclient.HttpClient; @@ -36,7 +38,8 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; -import java.util.*; +import java.util.Collections; +import java.util.List; import static com.jetbrains.python.documentation.DocumentationBuilderKit.*; @@ -548,7 +551,7 @@ public class PythonDocumentationProvider extends AbstractDocumentationProvider i PyParameter[] list = element.getParameterList().getParameters(); StringBuilder builder = new StringBuilder(offset); for (PyParameter p : list) { - if (p.getText().equals(PyNames.CANONICAL_SELF)) { + if (p.getText().equals(PyNames.CANONICAL_SELF) || p.getName() == null) { continue; } builder.append(prefix); diff --git a/python/testData/intentions/afterDocStubKeywordOnly.py b/python/testData/intentions/afterDocStubKeywordOnly.py new file mode 100644 index 000000000000..c65f5e99a856 --- /dev/null +++ b/python/testData/intentions/afterDocStubKeywordOnly.py @@ -0,0 +1,8 @@ +def f(my, *, param, **args): + """ + + :param my: + :param param: + :param args: + """ + pass \ No newline at end of file diff --git a/python/testData/intentions/beforeDocStubKeywordOnly.py b/python/testData/intentions/beforeDocStubKeywordOnly.py new file mode 100644 index 000000000000..b87a414f3a74 --- /dev/null +++ b/python/testData/intentions/beforeDocStubKeywordOnly.py @@ -0,0 +1,2 @@ +def f(my, *, param, **args): + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyIntentionTest.java b/python/testSrc/com/jetbrains/python/PyIntentionTest.java index c638cf936583..8d9b82e994e1 100644 --- a/python/testSrc/com/jetbrains/python/PyIntentionTest.java +++ b/python/testSrc/com/jetbrains/python/PyIntentionTest.java @@ -335,6 +335,10 @@ public class PyIntentionTest extends PyTestCase { doDocStubTest(); } + public void testDocStubKeywordOnly() { + doDocStubTest(LanguageLevel.PYTHON32); + } + // PY-7383 public void testYieldFrom() { doTest(PyBundle.message("INTN.yield.from"), LanguageLevel.PYTHON33); @@ -344,6 +348,16 @@ public class PyIntentionTest extends PyTestCase { doTest(PyBundle.message("INTN.replace.plus.with.format.operator")); } + private void doDocStubTest(LanguageLevel languageLevel) { + PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), languageLevel); + try { + doDocStubTest(); + } + finally { + PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), null); + } + } + private void doDocStubTest() { CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance(); codeInsightSettings.JAVADOC_STUB_ON_ENTER = true;