예제 #1
0
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
예제 #2
0
    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()
예제 #3
0
    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)))
        ])
예제 #4
0
 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)
     )
예제 #5
0
 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
예제 #6
0
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
예제 #7
0
 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
예제 #8
0
 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
예제 #9
0
    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})
예제 #10
0
파일: klass.py 프로젝트: h0t0sh0/jedi
 def with_generics(self, generics_tuple):
     from jedi.inference.gradual.base import GenericClass
     return GenericClass(
         self,
         TupleGenericManager(generics_tuple)
     )
예제 #11
0
 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)