diff --git a/python/python-psi-impl/src/com/jetbrains/python/documentation/PyDocumentationBuilder.java b/python/python-psi-impl/src/com/jetbrains/python/documentation/PyDocumentationBuilder.java index e6f723c76426..5ea5961e0772 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/documentation/PyDocumentationBuilder.java +++ b/python/python-psi-impl/src/com/jetbrains/python/documentation/PyDocumentationBuilder.java @@ -569,7 +569,7 @@ public final class PyDocumentationBuilder { if (myElement instanceof PyTargetExpression && ((PyTargetExpression)myElement).getDocStringValue() == null) { final PyExpression assignedValue = ((PyTargetExpression)myElement).findAssignedValue(); if (assignedValue instanceof PyReferenceExpression) { - final PsiElement resolved = resolveWithoutImplicits((PyReferenceExpression)assignedValue); + final PsiElement resolved = resolve((PyReferenceExpression)assignedValue); if (resolved instanceof PyDocStringOwner) { String name = ((PyTargetExpression)myElement).getName(); if (name != null) { @@ -581,7 +581,7 @@ public final class PyDocumentationBuilder { } // Reference expression can be passed as the target element in Python console if (myElement instanceof PyReferenceExpression) { - final PsiElement resolved = resolveWithoutImplicits((PyReferenceExpression)myElement); + final PsiElement resolved = resolve((PyReferenceExpression)myElement); if (resolved != null) { return resolved; } @@ -599,10 +599,10 @@ public final class PyDocumentationBuilder { return myElement; } - private @Nullable PsiElement resolveWithoutImplicits(@NotNull PyReferenceExpression element) { - final PyResolveContext resolveContext = PyResolveContext.defaultContext(myContext); + private @Nullable PsiElement resolve(@NotNull PyReferenceExpression element) { + final PyResolveContext resolveContext = PyResolveContext.implicitContext(myContext); final QualifiedResolveResult resolveResult = element.followAssignmentsChain(resolveContext); - return resolveResult.isImplicit() ? null : resolveResult.getElement(); + return resolveResult.getElement(); } private @Nullable PyStringLiteralExpression addFunctionInheritedDocString(@NotNull PyFunction pyFunction, @NotNull PyClass pyClass) { diff --git a/python/testData/quickdoc/ImplicitResolve.html b/python/testData/quickdoc/ImplicitResolve.html new file mode 100644 index 000000000000..5a0e133cad61 --- /dev/null +++ b/python/testData/quickdoc/ImplicitResolve.html @@ -0,0 +1 @@ +
 ImplicitResolve.Proxy
def documented_method(self) -> None
method documentation
\ No newline at end of file diff --git a/python/testData/quickdoc/ImplicitResolve.py b/python/testData/quickdoc/ImplicitResolve.py new file mode 100644 index 000000000000..6cff94349a5e --- /dev/null +++ b/python/testData/quickdoc/ImplicitResolve.py @@ -0,0 +1,15 @@ +from typing import Any + +def my_func() -> Any: + return object() + +s = my_func() +s.documented_method() + +from openstack import proxy +class Proxy(proxy.Proxy): + def documented_method(self): + """ + method documentation + """ + return None diff --git a/python/testSrc/com/jetbrains/python/Py3QuickDocTest.java b/python/testSrc/com/jetbrains/python/Py3QuickDocTest.java index 1f478f90dda1..ad399d909c3e 100644 --- a/python/testSrc/com/jetbrains/python/Py3QuickDocTest.java +++ b/python/testSrc/com/jetbrains/python/Py3QuickDocTest.java @@ -860,6 +860,11 @@ public class Py3QuickDocTest extends LightMarkedTestCase { checkHTMLOnly(); } + // PY-77171 + public void testImplicitResolve() { + checkHTMLOnly(); + } + @Override protected String getTestDataPath() { return super.getTestDataPath() + "/quickdoc/";