diff --git a/python/src/com/jetbrains/python/codeInsight/completion/PyDocstringCompletionContributor.java b/python/src/com/jetbrains/python/codeInsight/completion/PyDocstringCompletionContributor.java index d5d386a622ad..f18e7debb496 100644 --- a/python/src/com/jetbrains/python/codeInsight/completion/PyDocstringCompletionContributor.java +++ b/python/src/com/jetbrains/python/codeInsight/completion/PyDocstringCompletionContributor.java @@ -24,6 +24,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiNamedElement; import com.intellij.psi.PsiReference; +import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ProcessingContext; import com.jetbrains.python.documentation.docstrings.DocStringParameterReference; @@ -78,7 +79,19 @@ public class PyDocstringCompletionContributor extends CompletionContributor { } } } - else if (reference instanceof DocStringParameterReference) { + // For reST declaration like ":param foo: int" "foo" is PsiMultiReference that combines DocStringParameterReference and DocStringTypeReference + else if (reference instanceof PsiMultiReference) { + for (PsiReference innerReference : ((PsiMultiReference)reference).getReferences()) { + addVariantsFromDocstringReference(innerReference, result); + } + } + else { + addVariantsFromDocstringReference(reference, result); + } + } + + private static void addVariantsFromDocstringReference(@NotNull PsiReference reference, @NotNull CompletionResultSet result) { + if (reference instanceof DocStringParameterReference) { for (PyNamedParameter param : ((DocStringParameterReference)reference).collectParameterVariants()) { result.addElement(LookupElementBuilder.createWithIcon(param)); } diff --git a/python/testData/completion/paramNameInTypeDeclarationInRestDocstring.py b/python/testData/completion/paramNameInTypeDeclarationInRestDocstring.py new file mode 100644 index 000000000000..0f53d53dc8fd --- /dev/null +++ b/python/testData/completion/paramNameInTypeDeclarationInRestDocstring.py @@ -0,0 +1,4 @@ +def f(foo, bar): + """ + :type f + """ \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index 57494571cd09..17d933cc9e06 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -509,6 +509,18 @@ public class PythonCompletionTest extends PyTestCase { }); } + // PY-17635 + public void testParamNameInTypeDeclarationInRestDocstring() { + runWithDocStringFormat(DocStringFormat.REST, new Runnable() { + @Override + public void run() { + final List variants = doTestByFile(); + assertNotNull(variants); + assertContainsElements(variants, "foo"); + } + }); + } + public void testPep328Completion() { // PY-3409 myFixture.copyDirectoryToProject("pep328", "pep328"); myFixture.configureByFile("pep328/package/subpackage1/moduleX.py");