PY-17635 Complete parameter names in ":type" declaration of reST docstrings

This commit is contained in:
Mikhail Golubev
2015-11-16 14:32:04 +03:00
parent 4128424a5f
commit 0e887a6c6e
3 changed files with 30 additions and 1 deletions
@@ -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));
}
@@ -0,0 +1,4 @@
def f(foo, bar):
"""
:type f<caret>
"""
@@ -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<String> variants = doTestByFile();
assertNotNull(variants);
assertContainsElements(variants, "foo");
}
});
}
public void testPep328Completion() { // PY-3409
myFixture.copyDirectoryToProject("pep328", "pep328");
myFixture.configureByFile("pep328/package/subpackage1/moduleX.py");