diff --git a/python/src/com/jetbrains/python/psi/impl/references/KeywordArgumentCompletionUtil.java b/python/src/com/jetbrains/python/psi/impl/references/KeywordArgumentCompletionUtil.java index b31817cdf636..1723d0c523a3 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/KeywordArgumentCompletionUtil.java +++ b/python/src/com/jetbrains/python/psi/impl/references/KeywordArgumentCompletionUtil.java @@ -28,6 +28,7 @@ import com.jetbrains.python.psi.resolve.QualifiedResolveResult; import com.jetbrains.python.psi.search.PySuperMethodsSearch; import com.jetbrains.python.psi.types.*; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -40,9 +41,13 @@ public class KeywordArgumentCompletionUtil { if (callExpr != null) { PyExpression callee = callExpr.getCallee(); if (callee instanceof PyReferenceExpression && element.getParent() == callExpr.getArgumentList()) { - final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context); - final QualifiedResolveResult result = ((PyReferenceExpression)callee).followAssignmentsChain(resolveContext); - PsiElement def = result.getElement(); + + PsiElement def = getElementByType(context, callee); + if (def == null) { + def = getElementByChain(context, (PyReferenceExpression)callee); + } + + if (def instanceof PyCallable) { addKeywordArgumentVariants((PyCallable)def, callExpr, ret); } @@ -61,6 +66,24 @@ public class KeywordArgumentCompletionUtil { } } + @Nullable + private static PyElement getElementByType(@NotNull final TypeEvalContext context, @NotNull final PyExpression callee) { + final PyType pyType = context.getType(callee); + if (pyType instanceof PyFunctionType) { + return ((PyFunctionType)pyType).getCallable(); + } + if (pyType instanceof PyClassType) { + return ((PyClassType)pyType).getPyClass(); + } + return null; + } + + private static PsiElement getElementByChain(@NotNull TypeEvalContext context, PyReferenceExpression callee) { + final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context); + final QualifiedResolveResult result = callee.followAssignmentsChain(resolveContext); + return result.getElement(); + } + private static void fetchCallablesFromUnion(@NotNull final List ret, @NotNull final PyCallExpression callExpr, @NotNull final PyUnionType unionType,