diff --git a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInDocstringIntention.java b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInDocstringIntention.java index 29b21b3b8032..f0afdde19979 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInDocstringIntention.java +++ b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInDocstringIntention.java @@ -8,6 +8,7 @@ import com.intellij.codeInsight.template.TemplateBuilderFactory; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; @@ -17,12 +18,16 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.ObjectUtils; import com.jetbrains.python.PyNames; import com.jetbrains.python.PyPsiBundle; +import com.jetbrains.python.codeInsight.intentions.PyTypeHintGenerationUtil.AnnotationInfo; +import com.jetbrains.python.codeInsight.typing.PyTypingTypeProvider; import com.jetbrains.python.debugger.PySignature; import com.jetbrains.python.debugger.PySignatureCacheManager; import com.jetbrains.python.documentation.docstrings.DocStringFormat; import com.jetbrains.python.documentation.docstrings.DocStringUtil; import com.jetbrains.python.documentation.docstrings.PyDocstringGenerator; import com.jetbrains.python.psi.*; +import com.jetbrains.python.psi.types.PyType; +import com.jetbrains.python.psi.types.TypeEvalContext; import com.jetbrains.python.toolbox.Substring; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -67,21 +72,14 @@ public final class SpecifyTypeInDocstringIntention extends TypeIntention { if (!PyGenerateDocstringIntention.ensureNotPlainDocstringFormat(pyFunction)) return; final PyDocstringGenerator docstringGenerator = PyDocstringGenerator.forDocStringOwner(pyFunction); - String type = PyNames.OBJECT; + if (param != null) { - final String paramName = StringUtil.notNullize(param.getName()); - final PySignature signature = PySignatureCacheManager.getInstance(pyFunction.getProject()).findSignature(pyFunction); - if (signature != null) { - type = ObjectUtils.chooseNotNull(signature.getArgTypeQualifiedName(paramName), type); - } + String type = SpecifyTypeInPy3AnnotationsIntention.parameterType(param); docstringGenerator.withParamTypedByName(param, type); } else { - final PySignature signature = PySignatureCacheManager.getInstance(pyFunction.getProject()).findSignature(pyFunction); - if (signature != null) { - type = ObjectUtils.chooseNotNull(signature.getReturnTypeQualifiedName(), type); - } - docstringGenerator.withReturnValue(type); + AnnotationInfo info = SpecifyTypeInPy3AnnotationsIntention.returnType(pyFunction); + docstringGenerator.withReturnValue(info.getAnnotationText()); } WriteAction.run(() -> { diff --git a/python/testData/intentions/googleReturnSectionAfterKeywords_after.py b/python/testData/intentions/googleReturnSectionAfterKeywords_after.py index bba8fc3449b4..22929fe31dcc 100644 --- a/python/testData/intentions/googleReturnSectionAfterKeywords_after.py +++ b/python/testData/intentions/googleReturnSectionAfterKeywords_after.py @@ -4,5 +4,5 @@ def f(**kwargs): foo: bar Returns: - object: + None: """ \ No newline at end of file diff --git a/python/testData/intentions/googleReturnSectionAfterYields_after.py b/python/testData/intentions/googleReturnSectionAfterYields_after.py index b3302e3af1a7..b426227db426 100644 --- a/python/testData/intentions/googleReturnSectionAfterYields_after.py +++ b/python/testData/intentions/googleReturnSectionAfterYields_after.py @@ -4,7 +4,7 @@ def f(): int: meaning of life, universe and everything Returns: - object: + Generator[int, Any, None]: Example: print(next(f)) diff --git a/python/testData/intentions/googleReturnSectionBeforeRaises_after.py b/python/testData/intentions/googleReturnSectionBeforeRaises_after.py index b0a73d8f3201..3b4bc2176842 100644 --- a/python/testData/intentions/googleReturnSectionBeforeRaises_after.py +++ b/python/testData/intentions/googleReturnSectionBeforeRaises_after.py @@ -1,7 +1,7 @@ def f(): """ Returns: - object: + Any: Raises: RuntimeException diff --git a/python/testData/intentions/returnTypeInDocStringDifferentIndentationSize_after.py b/python/testData/intentions/returnTypeInDocStringDifferentIndentationSize_after.py index ff44cdfc808d..abc17af51051 100644 --- a/python/testData/intentions/returnTypeInDocStringDifferentIndentationSize_after.py +++ b/python/testData/intentions/returnTypeInDocStringDifferentIndentationSize_after.py @@ -1,7 +1,7 @@ def func(x): """ - :rtype: object + :rtype: int """ print(x) return 1 \ No newline at end of file diff --git a/python/testData/intentions/returnTypeInDocstring_after.py b/python/testData/intentions/returnTypeInDocstring_after.py index fc8523db607f..405f995a4d74 100644 --- a/python/testData/intentions/returnTypeInDocstring_after.py +++ b/python/testData/intentions/returnTypeInDocstring_after.py @@ -1,7 +1,7 @@ def f(x): """ - :rtype: object + :rtype: None """ pass diff --git a/python/testData/intentions/returnTypeInEmptyGoogleDocString_after.py b/python/testData/intentions/returnTypeInEmptyGoogleDocString_after.py index 96bc72c1c6b6..035b5ca67edc 100644 --- a/python/testData/intentions/returnTypeInEmptyGoogleDocString_after.py +++ b/python/testData/intentions/returnTypeInEmptyGoogleDocString_after.py @@ -1,5 +1,5 @@ def f(x, y): """ Returns: - object: + None: """ \ No newline at end of file diff --git a/python/testData/intentions/returnTypeInEmptyNumpyDocString_after.py b/python/testData/intentions/returnTypeInEmptyNumpyDocString_after.py index cb8435f9ce7b..b2a131bcba98 100644 --- a/python/testData/intentions/returnTypeInEmptyNumpyDocString_after.py +++ b/python/testData/intentions/returnTypeInEmptyNumpyDocString_after.py @@ -2,5 +2,5 @@ def f(x, y): """ Returns ------- - object + None """ \ No newline at end of file diff --git a/python/testData/intentions/returnTypeInGoogleDocStringEmptyReturnSection_after.py b/python/testData/intentions/returnTypeInGoogleDocStringEmptyReturnSection_after.py index e5a8056258f9..17856e81a130 100644 --- a/python/testData/intentions/returnTypeInGoogleDocStringEmptyReturnSection_after.py +++ b/python/testData/intentions/returnTypeInGoogleDocStringEmptyReturnSection_after.py @@ -3,5 +3,5 @@ def f(x, y): Summary. Returns: - object: + None: """ \ No newline at end of file diff --git a/python/testData/intentions/returnTypeInNewGoogleDocString_after.py b/python/testData/intentions/returnTypeInNewGoogleDocString_after.py index cccff17f2f14..37fd167b9cc9 100644 --- a/python/testData/intentions/returnTypeInNewGoogleDocString_after.py +++ b/python/testData/intentions/returnTypeInNewGoogleDocString_after.py @@ -2,6 +2,6 @@ def f(x): """ Returns: - object: + int: """ return 42 \ No newline at end of file diff --git a/python/testData/intentions/returnTypeInNewNumpyDocString_after.py b/python/testData/intentions/returnTypeInNewNumpyDocString_after.py index 1b319961bc6a..698cd39b5211 100644 --- a/python/testData/intentions/returnTypeInNewNumpyDocString_after.py +++ b/python/testData/intentions/returnTypeInNewNumpyDocString_after.py @@ -3,6 +3,6 @@ def f(x): Returns ------- - object + int """ return 42 \ No newline at end of file diff --git a/python/testData/intentions/returnTypeInNumpyDocStringEmptyReturnSection_after.py b/python/testData/intentions/returnTypeInNumpyDocStringEmptyReturnSection_after.py index 7eba3a19355d..af7688600b3f 100644 --- a/python/testData/intentions/returnTypeInNumpyDocStringEmptyReturnSection_after.py +++ b/python/testData/intentions/returnTypeInNumpyDocStringEmptyReturnSection_after.py @@ -4,5 +4,5 @@ def f(x, y): Returns ------- - object + None """ \ No newline at end of file diff --git a/python/testData/intentions/typeInDocstring1_after.py b/python/testData/intentions/typeInDocstring1_after.py index 4a465ea6027a..ac861d54cb43 100644 --- a/python/testData/intentions/typeInDocstring1_after.py +++ b/python/testData/intentions/typeInDocstring1_after.py @@ -1,6 +1,6 @@ def foo(a, b): """ - :rtype: object + :rtype: None """ b = 1 \ No newline at end of file diff --git a/python/testData/intentions/typeInDocstring2_after.py b/python/testData/intentions/typeInDocstring2_after.py index b5206f537937..7c28219927e1 100644 --- a/python/testData/intentions/typeInDocstring2_after.py +++ b/python/testData/intentions/typeInDocstring2_after.py @@ -1,7 +1,7 @@ def func1(x): """ - :rtype: object + :rtype: Any """ return x diff --git a/python/testData/intentions/typeInDocstringAtTheEndOfFunction_after.py b/python/testData/intentions/typeInDocstringAtTheEndOfFunction_after.py index 5c7430399cdd..81b70815781a 100644 --- a/python/testData/intentions/typeInDocstringAtTheEndOfFunction_after.py +++ b/python/testData/intentions/typeInDocstringAtTheEndOfFunction_after.py @@ -1,7 +1,7 @@ def func2(x): """ - :rtype: object + :rtype: Any """ y = func1(x.keys()) return y.startswith('foo') \ No newline at end of file