PY-17052 Keyword arguments provided for unions with callables

This commit is contained in:
Ilya.Kazakevich
2015-10-05 21:19:56 +03:00
parent 48b857b106
commit 65f44ea522
3 changed files with 28 additions and 2 deletions

View File

@@ -26,7 +26,7 @@ import com.jetbrains.python.psi.impl.PyKeywordArgumentProvider;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import com.jetbrains.python.psi.resolve.QualifiedResolveResult;
import com.jetbrains.python.psi.search.PySuperMethodsSearch;
import com.jetbrains.python.psi.types.TypeEvalContext;
import com.jetbrains.python.psi.types.*;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
@@ -51,6 +51,27 @@ public class KeywordArgumentCompletionUtil {
addKeywordArgumentVariants(init, callExpr, ret);
}
}
final PyUnionType unionType = PyUtil.as(context.getType(callee), PyUnionType.class);
if (unionType != null) {
fetchCallablesFromUnion(ret, callExpr, unionType);
}
}
}
}
private static void fetchCallablesFromUnion(@NotNull final List<LookupElement> ret,
@NotNull final PyCallExpression callExpr,
@NotNull final PyUnionType unionType) {
for (final PyType memberType : unionType.getMembers()) {
if (memberType instanceof PyUnionType) {
fetchCallablesFromUnion(ret, callExpr, (PyUnionType)memberType);
}
if (memberType instanceof PyFunctionType) {
final PyFunctionType type = (PyFunctionType)memberType;
if (type.isCallable()) {
addKeywordArgumentVariants(type.getCallable(), callExpr, ret);
}
}
}
}
@@ -75,7 +96,6 @@ public class KeywordArgumentCompletionUtil {
else {
addKeywordArgumentVariantsForCallable(callExpr, ret, parameters);
}
}
private static void addKeywordArgumentVariantsForCallable(@NotNull final PyCallExpression callExpr,

View File

@@ -1,3 +1,6 @@
spam = lambda eggs: eggs
spam_union = 1 if 42 != 42 else spam
spam(eggs=)
spam_union(eggs=)

View File

@@ -1,3 +1,6 @@
spam = lambda eggs: eggs
spam_union = 1 if 42 != 42 else spam
spam(egg<caret>)
spam_union(egg<caret>)