def infer_param(function_value, param, ignore_stars=False): values = _infer_param(function_value, param) if ignore_stars: return values inference_state = function_value.inference_state if param.star_count == 1: tuple_ = builtin_from_name(inference_state, 'tuple') return ValueSet([ GenericClass( tuple_, TupleGenericManager((values, )), ) for c in values ]) elif param.star_count == 2: dct = builtin_from_name(inference_state, 'dict') generics = (ValueSet([builtin_from_name(inference_state, 'str')]), values) return ValueSet([ GenericClass( dct, TupleGenericManager(generics), ) for c in values ]) pass return values
def infer(self): """ Created to be used by inheritance. """ inference_state = self.inference_state is_coroutine = self.tree_node.parent.type in ('async_stmt', 'async_funcdef') from jedi.inference.gradual.base import GenericClass if is_coroutine: if self.is_generator(): async_generator_classes = inference_state.typing_module \ .py__getattribute__('AsyncGenerator') yield_values = self.merge_yield_values(is_async=True) # The contravariant doesn't seem to be defined. generics = (yield_values.py__class__(), NO_VALUES) return ValueSet( GenericClass(c, TupleGenericManager(generics)) for c in async_generator_classes ).execute_annotation() else: async_classes = inference_state.typing_module.py__getattribute__('Coroutine') return_values = self.get_return_values() # Only the first generic is relevant. generics = (return_values.py__class__(), NO_VALUES, NO_VALUES) return ValueSet( GenericClass(c, TupleGenericManager(generics)) for c in async_classes ).execute_annotation() else: if self.is_generator(): return ValueSet([iterable.Generator(inference_state, self)]) else: return self.get_return_values()
def define_generics(self, type_var_dict): from jedi.inference.gradual.type_var import TypeVar changed = False new_generics = [] for generic_set in self.get_generics(): values = NO_VALUES for generic in generic_set: if isinstance(generic, (DefineGenericBaseClass, TypeVar)): result = generic.define_generics(type_var_dict) values |= result if result != ValueSet({generic}): changed = True else: values |= ValueSet([generic]) new_generics.append(values) if not changed: # There might not be any type vars that change. In that case just # return itself, because it does not make sense to potentially lose # cached results. return ValueSet([self]) return ValueSet([ self._create_instance_with_generics( TupleGenericManager(tuple(new_generics))) ])
def with_generics(self, generics_tuple): return self.index_class.create_cached( self.inference_state, self.parent_context, self._tree_name, generics_manager=TupleGenericManager(generics_tuple) )
def _get_wrapped_value(self): from jedi.inference.gradual.base import GenericClass from jedi.inference.gradual.generics import TupleGenericManager klass = compiled.builtin_from_name(self.inference_state, self.array_type) c, = GenericClass(klass, TupleGenericManager( self._cached_generics())).execute_annotation() return c
def _create_manager_for(cls, manager_cls='BaseManager'): managers = cls.inference_state.import_module( ('django', 'db', 'models', 'manager')).py__getattribute__(manager_cls) for m in managers: if m.is_class_mixin(): generics_manager = TupleGenericManager((ValueSet([cls]), )) for c in GenericClass(m, generics_manager).execute_annotation(): return c return None
def infer(self): for base in self._lazy_base_class.infer(): if isinstance(base, GenericClass): # Here we have to recalculate the given types. yield GenericClass.create_cached( base.inference_state, base._wrapped_value, TupleGenericManager(tuple(self._remap_type_vars(base))), ) else: yield base
def infer(self): for base in self._lazy_base_class.infer(): if isinstance(base, GenericClass): # Here we have to recalculate the given types. yield GenericClass.create_cached( base.inference_state, base._wrapped_value, TupleGenericManager(tuple(self._remap_type_vars(base))), ) else: if base.is_class_mixin(): # This case basically allows classes like `class Foo(List)` # to be used like `Foo[int]`. The generics are not # necessary and can be used later. yield GenericClass.create_cached( base.inference_state, base, self._generics_manager, ) else: yield base
def define_generics(self, type_var_dict): from jedi.inference.gradual.base import GenericClass def remap_type_vars(): """ The TypeVars in the resulting classes have sometimes different names and we need to check for that, e.g. a signature can be: def iter(iterable: Iterable[_T]) -> Iterator[_T]: ... However, the iterator is defined as Iterator[_T_co], which means it has a different type var name. """ for type_var in self.list_type_vars(): yield type_var_dict.get(type_var.py__name__(), NO_VALUES) if type_var_dict: return ValueSet([ GenericClass(self, TupleGenericManager(tuple(remap_type_vars()))) ]) return ValueSet({self})
def with_generics(self, generics_tuple): from jedi.inference.gradual.base import GenericClass return GenericClass( self, TupleGenericManager(generics_tuple) )
def get_annotated_class_object(self): from jedi.inference.gradual.generics import TupleGenericManager gen_values = self.merge_types_of_iterate().py__class__() gm = TupleGenericManager((gen_values, NO_VALUES, NO_VALUES)) return self._get_cls().with_generics(gm)