PY-3999 : Context passed to Keyword Argument Completion to allow better completion

This commit is contained in:
Ilya.Kazakevich
2015-08-10 23:06:40 +03:00
parent 243970dcb7
commit 326d440c13
3 changed files with 6 additions and 4 deletions
@@ -219,7 +219,7 @@ public class PyNamedParameterImpl extends PyBaseElementImpl<PyNamedParameterStub
final PyClass containingClass = func.getContainingClass();
if (containingClass != null) {
PyType initType = null;
final PyFunction init = containingClass.findInitOrNew(true, null);
final PyFunction init = containingClass.findInitOrNew(true, context);
if (init != null && init != func) {
initType = context.getReturnType(init);
if (init.getContainingClass() != containingClass) {
@@ -34,12 +34,13 @@ import java.util.HashSet;
import java.util.List;
public class KeywordArgumentCompletionUtil {
public static void collectFunctionArgNames(PyElement element, List<LookupElement> ret) {
public static void collectFunctionArgNames(PyElement element, List<LookupElement> ret, final @NotNull TypeEvalContext context) {
PyCallExpression callExpr = PsiTreeUtil.getParentOfType(element, PyCallExpression.class);
if (callExpr != null) {
PyExpression callee = callExpr.getCallee();
if (callee instanceof PyReferenceExpression && element.getParent() == callExpr.getArgumentList()) {
final QualifiedResolveResult result = ((PyReferenceExpression)callee).followAssignmentsChain(PyResolveContext.defaultContext());
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
final QualifiedResolveResult result = ((PyReferenceExpression)callee).followAssignmentsChain(resolveContext);
PsiElement def = result.getElement();
if (def instanceof PyFunction) {
addKeywordArgumentVariants((PyFunction)def, callExpr, ret);
@@ -578,8 +578,9 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference
PyResolveUtil.scopeCrawlUp(processor, owner, null, null);
}
// This method is probably called for completion, so use appropriate context here
// in a call, include function's arg names
KeywordArgumentCompletionUtil.collectFunctionArgNames(element, ret);
KeywordArgumentCompletionUtil.collectFunctionArgNames(element, ret, TypeEvalContext.codeCompletion(element.getProject(), element.getContainingFile()));
// include builtin names
final PyFile builtinsFile = PyBuiltinCache.getInstance(element).getBuiltinsFile();