///|
/// Typing helpers for generic aliases and unions.
///|
fn is_generic_alias_origin_name(name : String) -> Bool {
match name {
"list" | "dict" | "tuple" | "set" | "frozenset" | "type" => true
_ => false
}
}
///|
fn union_args_from_value(
value : Value,
builtins : Array[(String, Value)],
) -> Array[Value]? {
match value {
Value::Class(_) => Some([value])
Value::Function(func) =>
if func.body.length() == 0 && is_builtin_class_name(func.name) {
Some([Value::Class(builtin_class_from_name(func.name, builtins))])
} else {
None
}
Value::Instance(inst) =>
if inst.class.name == "UnionType" {
match get_named_value(inst.dict, "__args__") {
Some(Value::Tuple(values)) => Some(values)
_ => Some([value])
}
} else if inst.class.name == "GenericAlias" {
Some([value])
} else {
None
}
Value::None =>
Some([
Value::Class(ClassValue::{ name: "NoneType", bases: [], dict: [], }),
])
_ => None
}
}