Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/jedi/inference/gradual/type_var.py: 23%
90 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-04-20 06:09 +0000
« prev ^ index » next coverage.py v7.4.4, created at 2024-04-20 06:09 +0000
1from jedi import debug
2from jedi.inference.base_value import ValueSet, NO_VALUES, ValueWrapper
3from jedi.inference.gradual.base import BaseTypingValue
6class TypeVarClass(ValueWrapper):
7 def py__call__(self, arguments):
8 unpacked = arguments.unpack()
10 key, lazy_value = next(unpacked, (None, None))
11 var_name = self._find_string_name(lazy_value)
12 # The name must be given, otherwise it's useless.
13 if var_name is None or key is not None:
14 debug.warning('Found a variable without a name %s', arguments)
15 return NO_VALUES
17 return ValueSet([TypeVar.create_cached(
18 self.inference_state,
19 self.parent_context,
20 tree_name=self.tree_node.name,
21 var_name=var_name,
22 unpacked_args=unpacked,
23 )])
25 def _find_string_name(self, lazy_value):
26 if lazy_value is None:
27 return None
29 value_set = lazy_value.infer()
30 if not value_set:
31 return None
32 if len(value_set) > 1:
33 debug.warning('Found multiple values for a type variable: %s', value_set)
35 name_value = next(iter(value_set))
36 try:
37 method = name_value.get_safe_value
38 except AttributeError:
39 return None
40 else:
41 safe_value = method(default=None)
42 if isinstance(safe_value, str):
43 return safe_value
44 return None
47class TypeVar(BaseTypingValue):
48 def __init__(self, parent_context, tree_name, var_name, unpacked_args):
49 super().__init__(parent_context, tree_name)
50 self._var_name = var_name
52 self._constraints_lazy_values = []
53 self._bound_lazy_value = None
54 self._covariant_lazy_value = None
55 self._contravariant_lazy_value = None
56 for key, lazy_value in unpacked_args:
57 if key is None:
58 self._constraints_lazy_values.append(lazy_value)
59 else:
60 if key == 'bound':
61 self._bound_lazy_value = lazy_value
62 elif key == 'covariant':
63 self._covariant_lazy_value = lazy_value
64 elif key == 'contravariant':
65 self._contra_variant_lazy_value = lazy_value
66 else:
67 debug.warning('Invalid TypeVar param name %s', key)
69 def py__name__(self):
70 return self._var_name
72 def get_filters(self, *args, **kwargs):
73 return iter([])
75 def _get_classes(self):
76 if self._bound_lazy_value is not None:
77 return self._bound_lazy_value.infer()
78 if self._constraints_lazy_values:
79 return self.constraints
80 debug.warning('Tried to infer the TypeVar %s without a given type', self._var_name)
81 return NO_VALUES
83 def is_same_class(self, other):
84 # Everything can match an undefined type var.
85 return True
87 @property
88 def constraints(self):
89 return ValueSet.from_sets(
90 lazy.infer() for lazy in self._constraints_lazy_values
91 )
93 def define_generics(self, type_var_dict):
94 try:
95 found = type_var_dict[self.py__name__()]
96 except KeyError:
97 pass
98 else:
99 if found:
100 return found
101 return ValueSet({self})
103 def execute_annotation(self):
104 return self._get_classes().execute_annotation()
106 def infer_type_vars(self, value_set):
107 def iterate():
108 for v in value_set:
109 cls = v.py__class__()
110 if v.is_function() or v.is_class():
111 cls = TypeWrapper(cls, v)
112 yield cls
114 annotation_name = self.py__name__()
115 return {annotation_name: ValueSet(iterate())}
117 def __repr__(self):
118 return '<%s: %s>' % (self.__class__.__name__, self.py__name__())
121class TypeWrapper(ValueWrapper):
122 def __init__(self, wrapped_value, original_value):
123 super().__init__(wrapped_value)
124 self._original_value = original_value
126 def execute_annotation(self):
127 return ValueSet({self._original_value})