From d14a19c5b8d7e667c3c653fd64f0896fa80d8585 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Sat, 5 May 2012 17:25:23 +0400 Subject: [PATCH] fixed item 3 of PY-5673 Incomplete/incorrect rendering of Sphinx/rst docstrings --- .../documentation/DocumentationBuilder.java | 15 +++++++++++++-- .../PythonDocumentationProvider.java | 12 ++++++++++++ python/testData/quickdoc/Param.html | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/python/src/com/jetbrains/python/documentation/DocumentationBuilder.java b/python/src/com/jetbrains/python/documentation/DocumentationBuilder.java index 4bb23ed40549..1bce5f1f9c99 100644 --- a/python/src/com/jetbrains/python/documentation/DocumentationBuilder.java +++ b/python/src/com/jetbrains/python/documentation/DocumentationBuilder.java @@ -20,9 +20,13 @@ import com.jetbrains.python.console.PyConsoleUtil; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.PyBuiltinCache; import com.jetbrains.python.psi.impl.PyCallExpressionHelper; -import com.jetbrains.python.psi.resolve.*; +import com.jetbrains.python.psi.resolve.PyResolveContext; +import com.jetbrains.python.psi.resolve.QualifiedResolveResult; +import com.jetbrains.python.psi.resolve.RootVisitor; +import com.jetbrains.python.psi.resolve.RootVisitorHost; 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.Maybe; @@ -356,7 +360,14 @@ class DocumentationBuilder { final String name = followed.getName(); final String type = structuredDocString.getParamType(name); if (type != null) { - myBody.addItem(": ").addItem(type); + final PyType pyType = PyTypeParser.getTypeByName(followed, type); + if (pyType instanceof PyClassType && ((PyClassType)pyType).getPyClass() != null) { + myBody.addItem(": "). + addWith(new DocumentationBuilderKit.LinkWrapper(PythonDocumentationProvider.LINK_TYPE_PARAM), + $(pyType.getName())); + } + else + myBody.addItem(": ").addItem(type); } final String desc = structuredDocString.getParamDescription(name); if (desc != null) { diff --git a/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java b/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java index 4c07e99fe0d3..4785b7fd8d8a 100644 --- a/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java +++ b/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java @@ -46,6 +46,7 @@ public class PythonDocumentationProvider extends AbstractDocumentationProvider i @NonNls static final String LINK_TYPE_CLASS = "#class#"; @NonNls static final String LINK_TYPE_PARENT = "#parent#"; + @NonNls static final String LINK_TYPE_PARAM = "#param#"; @NonNls private static final String RST_PREFIX = ":"; @NonNls private static final String EPYDOC_PREFIX = "@"; @@ -287,6 +288,9 @@ public class PythonDocumentationProvider extends AbstractDocumentationProvider i if (link.equals(LINK_TYPE_CLASS)) { return inferContainingClassOf(context); } + else if (link.equals(LINK_TYPE_PARAM)) { + return inferClassOfParameter(context); + } else if (link.startsWith(LINK_TYPE_PARENT)) { PyClass cls = inferContainingClassOf(context); if (cls != null) { @@ -439,6 +443,14 @@ public class PythonDocumentationProvider extends AbstractDocumentationProvider i else return PsiTreeUtil.getParentOfType(context, PyClass.class); } + @Nullable + private static PyClass inferClassOfParameter(PsiElement context) { + final PyType type = ((PyNamedParameter)context).getType(TypeEvalContext.fast()); + if (type instanceof PyClassType) + return ((PyClassType)type).getPyClass(); + return null; + } + public static final DocumentationBuilderKit.LinkWrapper LinkMyClass = new DocumentationBuilderKit.LinkWrapper(LINK_TYPE_CLASS); // link item to containing class public static String generateDocumentationContentStub(PyFunction element, String offset, boolean checkReturn) { diff --git a/python/testData/quickdoc/Param.html b/python/testData/quickdoc/Param.html index 59e2b6b79f10..616c0565c6f6 100644 --- a/python/testData/quickdoc/Param.html +++ b/python/testData/quickdoc/Param.html @@ -1 +1 @@ -name: str
The name to convert to a label. This must be a string which could be used as a Python identifier. Strings which do not take this form will result in unpredictable behavior. \ No newline at end of file +name: str
The name to convert to a label. This must be a string which could be used as a Python identifier. Strings which do not take this form will result in unpredictable behavior. \ No newline at end of file