mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Interpret tuple default parameter value as a weak type (PY-10967)
This commit is contained in:
@@ -239,7 +239,7 @@ public class PyNamedParameterImpl extends PyPresentableElementImpl<PyNamedParame
|
||||
final PyType type = context.getType(defaultValue);
|
||||
if (type != null && !(type instanceof PyNoneType)) {
|
||||
if (type instanceof PyTupleType) {
|
||||
return PyTypeParser.getTypeByName(this, "collections.Iterable");
|
||||
return PyUnionType.createWeakType(type);
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
@@ -208,7 +208,7 @@ public class PyTargetExpressionImpl extends PyPresentableElementImpl<PyTargetExp
|
||||
final PyAssignmentStatement assignment = (PyAssignmentStatement)nextParent;
|
||||
final PyExpression value = assignment.getAssignedValue();
|
||||
if (value != null) {
|
||||
final PyType assignedType = context.getType(value);
|
||||
final PyType assignedType = PyTypeChecker.toNonWeakType(context.getType(value), context);
|
||||
if (assignedType instanceof PyTupleType) {
|
||||
final PyType t = getTypeFromTupleAssignment((PyTupleExpression)parent, (PyTupleType)assignedType);
|
||||
if (t != null) {
|
||||
|
||||
@@ -215,6 +215,17 @@ public class PyTypeChecker {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static PyType toNonWeakType(@Nullable PyType type, @NotNull TypeEvalContext context) {
|
||||
if (type instanceof PyUnionType) {
|
||||
final PyUnionType unionType = (PyUnionType)type;
|
||||
if (unionType.isWeak()) {
|
||||
return unionType.excludeNull(context);
|
||||
}
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
public static boolean hasGenerics(@Nullable PyType type, @NotNull TypeEvalContext context) {
|
||||
final Set<PyGenericType> collected = new HashSet<PyGenericType>();
|
||||
collectGenerics(type, context, collected, new HashSet<PyType>());
|
||||
|
||||
@@ -805,6 +805,13 @@ public class PyTypeTest extends PyTestCase {
|
||||
"expr = iter(xs).next()\n");
|
||||
}
|
||||
|
||||
// PY-10967
|
||||
public void testDefaultTupleParameterMember() {
|
||||
doTest("int",
|
||||
"def foo(xs=(1, 2)):\n" +
|
||||
" expr, foo = xs\n");
|
||||
}
|
||||
|
||||
private static TypeEvalContext getTypeEvalContext(@NotNull PyExpression element) {
|
||||
return TypeEvalContext.userInitiated(element.getContainingFile()).withTracing();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user