ó
’›V]c           @   s[  d  Z  d d l m Z d d l m Z d d l m Z d d l m Z m	 Z	 m
 Z
 d d l m Z d d l m Z d d l m Z d d	 l m Z m Z d d
 l m Z m Z d d l m Z m Z m Z d d l m Z d d l m Z d „  Z d e f d „  ƒ  YZ  d e f d „  ƒ  YZ! d e" f d „  ƒ  YZ# d e e	 e# e ƒ f d „  ƒ  YZ$ d S(   s  
Like described in the :mod:`parso.python.tree` module,
there's a need for an ast like module to represent the states of parsed
modules.

But now there are also structures in Python that need a little bit more than
that. An ``Instance`` for example is only a ``Class`` before it is
instantiated. This class represents these cases.

So, why is there also a ``Class`` class here? Well, there are decorators and
they change classes in Python 3.

Representation modules also define "magic methods". Those methods look like
``py__foo__`` and are typically mappable to the Python equivalents ``__call__``
and others. Here's a list:

====================================== ========================================
**Method**                             **Description**
-------------------------------------- ----------------------------------------
py__call__(arguments: Array)           On callable objects, returns types.
py__bool__()                           Returns True/False/None; None means that
                                       there's no certainty.
py__bases__()                          Returns a list of base classes.
py__iter__()                           Returns a generator of a set of types.
py__class__()                          Returns the class of an instance.
py__simple_getitem__(index: int/str)   Returns a a set of types of the index.
                                       Can raise an IndexError/KeyError.
py__getitem__(indexes: ContextSet)     Returns a a set of types of the index.
py__file__()                           Only on modules. Returns None if does
                                       not exist.
py__package__() -> List[str]           Only on modules. For the import system.
py__path__()                           Only on modules. For the import system.
py__get__(call_object)                 Only on instances. Simulates
                                       descriptors.
py__doc__()                            Returns the docstring for a context.
====================================== ========================================

iÿÿÿÿ(   t   debug(   t   use_metaclass(   t   get_cached_parent_scope(   t   evaluator_method_cachet   CachedMetaClasst    evaluator_method_generator_cache(   t   compiled(   t   LazyKnownContexts(   t   ParserTreeFilter(   t   TreeNameDefinitiont   ContextName(   t   unpack_arglistt   ValuesArguments(   t
   ContextSett   iterator_to_context_sett   NO_CONTEXTS(   t   FunctionAndClassBase(   t   plugin_managerc         c   sI   y |  j  } Wn t k
 r% |  Vn  Xx | | | ƒ D] } | Vq6 Wd  S(   N(   t	   py__get__t   AttributeError(   t   contextt   instancet   class_contextt   methodt   descriptor_context(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt   apply_py__get__7   s    	t	   ClassNamec           B   s    e  Z d  „  Z e d „  ƒ Z RS(   c         C   s/   t  t |  ƒ j | | ƒ | |  _ | |  _ d  S(   N(   t   superR   t   __init__t   _name_contextt   _apply_decorators(   t   selft   parent_contextt	   tree_namet   name_contextt   apply_decorators(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyR   B   s    	c         c   s   d d l  m } | |  j j |  j |  j ƒ } xJ | D]B } |  j rr x0 t | d d  d |  j ƒD] } | Vq` Wq5 | Vq5 Wd  S(   Niÿÿÿÿ(   t   tree_name_to_contextsR   R   (	   t   jedi.evaluate.syntax_treeR$   R    t	   evaluatorR   R!   R   R   t   None(   R   R$   t   inferredt   result_contextt   c(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt   inferG   s    	(   t   __name__t
   __module__R   R   R+   (    (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyR   A   s   	t   ClassFilterc           B   sA   e  Z e Z d  „  Z d „  Z d „  Z e d „ Z e d „ Z	 RS(   c         O   s/   | j  d ƒ |  _ t t |  ƒ j | | Ž  d  S(   Nt   is_instance(   t   popt   _is_instanceR   R.   R   (   R   t   argst   kwargs(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyR   [   s    c         C   s?   g  | D]4 } |  j  d |  j d | d |  j d |  j ƒ ^ q S(   NR    R!   R"   R#   (   t
   name_classR   t   _node_contextR1   (   R   t   namest   name(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt   _convert_names_   s    c         C   sT   |  j  } xD | d  k	 rO | |  j k s6 | |  j k r: t St |  j | ƒ } q Wt S(   N(   t   _origin_scopeR'   t   _parser_scopeR   t   TrueR   t   _used_namest   False(   R   t   node(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt   _equals_origin_scopei   s    	c         C   sž   | so | j  ƒ  } | d  k	 ro | j d k ro | j d } | j d k rl d | j d j ƒ  k ri t Sql qo n  | j j d ƒ p | j j d ƒ p |  j	 ƒ  S(   Nt	   expr_stmti   t	   annassignt   ClassVart   __(
   t   get_definitionR'   t   typet   childrent   get_codeR=   t   valuet
   startswitht   endswithR?   (   R   R7   t   from_instanceR@   RA   (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt   _access_possibleq   s    %c         C   sA   t  t |  ƒ j | ƒ } g  | D] } |  j | | ƒ r | ^ q S(   N(   R   R.   t   _filterRL   (   R   R6   RK   R7   (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyRM   ƒ   s    (
   R,   R-   R   R4   R   R8   R?   R=   RL   RM   (    (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyR.   X   s   		
	t
   ClassMixinc           B   s†   e  Z d  „  Z d
 d „ Z d „  Z e d „  ƒ Z d „  Z d „  Z	 e
 ƒ  d „  ƒ Z e d
 d
 e d „ Z d „  Z d
 d
 d	 „ Z RS(   c         C   s   t  S(   N(   R;   (   R   (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt   is_class‰   s    c         C   sM   d d l  m } | d  k r+ t g  ƒ } n  t | |  j |  j |  | ƒ g ƒ S(   Niÿÿÿÿ(   t   TreeInstance(   t   jedi.evaluate.contextRP   R'   R   R   R&   R    (   R   t	   argumentsRP   (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt
   py__call__Œ   s    c         C   s   t  j |  j d ƒ S(   Nu   type(   R   t   builtin_from_nameR&   (   R   (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt   py__class__’   s    c         C   s   t  |  |  j j ƒ S(   N(   R
   t	   tree_nodeR7   (   R   (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyR7   •   s    c         C   s
   |  j  j S(   N(   R7   t   string_name(   R   (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt
   py__name__™   s    c         C   s>   x7 |  j  d ƒ D]& } | j ƒ  r t | j ƒ  ƒ d Sq Wg  S(   Nu   __init__i   (   t   py__getattribute__t   is_functiont   listt   get_param_names(   R   t   context_(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyR\   œ   s    c         c   s©   |  g } |  Vx” |  j  ƒ  D]† } x} | j ƒ  D]o } y | j } Wn$ t k
 rg t j d |  | ƒ q. Xx2 | ƒ  D]' } | | k rr | j | ƒ | Vqr qr Wq. Wq Wd  S(   Ns$   Super class of %s is not a class: %s(   t   py__bases__R+   t	   py__mro__R   R    t   warningt   append(   R   t   mrot   lazy_clst   clst
   mro_methodt   cls_new(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyR_   ¢   s    	c      
   c   sT  |  j  ƒ  } | r4 x |  j | ƒ D] } | Vq" Wn  | rN |  j | | ƒ Vnq xn |  j ƒ  D]` } t | t j ƒ r˜ xE | j d | ƒ D] } | Vq† Wq[ t |  j	 |  d | d | d | ƒVq[ W| sPd d l
 m }	 |	 |  j	 d ƒ }
 t |
 t ƒ sü t ‚ |
 |  k rPxB |
 j ƒ  D]1 } | j ƒ  } t | ƒ t | ƒ t | ƒ VqWqPn  d  S(   NR/   t   node_contextt   origin_scopeiÿÿÿÿ(   RT   u   type(   t   get_metaclassest   get_metaclass_filterst   get_global_filterR_   t
   isinstanceR   t   CompiledObjectt   get_filtersR.   R&   t   jedi.evaluate.compiledRT   t   ClassContextt   AssertionErrorRS   t   next(   R   t   search_globalt   until_positionRh   R/   t   metaclassest   fRd   t   filterRT   t   type_R   t   instance_filters(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyRn   Ã   s0    

c         C   s;   |  j  ƒ  j d ƒ } g  | j ƒ  D] } | j |  ƒ ^ q" S(   NR   (   RS   RY   t   get_signaturest   bind(   R   t
   init_funcst   sig(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyRz   ã   s    c         C   s   t  |  j d |  d | d | ƒS(   NR   Rt   Rh   (   R   R&   (   R   Rt   Rh   (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyRk   ç   s
    	N(   R,   R-   RO   R'   RS   RU   t   propertyR7   RX   R\   R   R_   R=   Rn   Rz   Rk   (    (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyRN   ˆ   s   				!	Rp   c           B   s†   e  Z d  Z d Z e ƒ  d „  ƒ Z d „  Z e d d
 ƒ d „  ƒ Z d „  Z d „  Z	 e
 j ƒ  d „  ƒ Z e d e ƒ d	 „  ƒ Z RS(   sŸ   
    This class is not only important to extend `tree.Class`, it is also a
    important for descriptors (if the descriptor methods are evaluated or not).
    u   classc         C   s›   g  } |  j  j ƒ  } | d  k r% g  Sxo t | ƒ D]a \ } } | rJ q2 n  d d l m } x6 | |  j | ƒ D]" } | | k rm | j | ƒ qm qm Wq2 W| S(   Niÿÿÿÿ(   t   find_unknown_type_vars(   RV   t   get_super_arglistR'   R   t    jedi.evaluate.gradual.annotationR   R    Ra   (   R   t   foundt   arglistt   starsR>   R   t   type_var(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt   list_type_vars÷   s    c         C   sB   |  j  j ƒ  } | r> d d l m } | j |  j |  j | ƒ Sd  S(   Niÿÿÿÿ(   RR   (   RV   R€   t   jedi.evaluateRR   t   TreeArgumentsR&   R    R'   (   R   Rƒ   RR   (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt   _get_bases_arguments	  s
    t   defaultc         C   s   |  j  ƒ  } | d  k	 rV g  | j ƒ  D] \ } } | d  k r% | ^ q% } | rV | Sn  |  j ƒ  d k r |  j |  j j k r g  St |  j j j d ƒ ƒ g S(   Nt   object(	   R‰   R'   t   unpackRX   R    R&   t   builtins_moduleR   RY   (   R   R2   t   keyRH   t   lst(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyR^     s    1c            sC   d d l  m ‰  | s# t ˆ g ƒ St ‡  ‡ ‡ f d †  | Dƒ ƒ S(   Niÿÿÿÿ(   t   LazyGenericClassc         3   s'   |  ] } ˆ  ˆ | d  ˆ j  ƒVq d S(   t   context_of_indexN(   R   (   t   .0t   index_context(   R   t   contextualized_nodeR   (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pys	   <genexpr>$  s   (   t   jedi.evaluate.gradual.typingR   R   (   R   t   index_context_setR”   (    (   R   R”   R   s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt   py__getitem__  s    c            sW   d d l  m } ‡  ‡ f d †  } ˆ rJ t | ˆ  d t | ƒ  ƒ ƒg ƒ St ˆ  h ƒ S(   Niÿÿÿÿ(   t   GenericClassc          3   s2   x+ ˆ  j  ƒ  D] }  ˆ j |  j ƒ  t ƒ Vq Wd S(   sa  
            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.
            N(   R†   t   getRX   R   (   R…   (   R   t   type_var_dict(    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt   remap_type_vars/  s    
t   generics(   R•   R˜   R   t   tuple(   R   Rš   R˜   R›   (    (   R   Rš   s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt   define_generics,  s    c         C   s   t  j d | ƒ g  S(   Ns   Unprocessed metaclass %s(   R    t   dbg(   R   t	   metaclass(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyRj   C  s    c   	      C   sÜ   |  j  ƒ  } | d  k	 r… g  | j ƒ  D] \ } } | d k r% | ^ q% } t j d „  | Dƒ ƒ } t d „  | Dƒ ƒ } | r… | Sn  xP |  j ƒ  D]B } x9 | j ƒ  D]+ } | j ƒ  r¥ | j ƒ  } | rÐ | Sq¥ q¥ Wq’ Wt	 S(   NR    c         s   s   |  ] } | j  ƒ  Vq d  S(   N(   R+   (   R’   t   lazy_context(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pys	   <genexpr>M  s    c         s   s!   |  ] } | j  ƒ  r | Vq d  S(   N(   RO   (   R’   t   m(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pys	   <genexpr>N  s    (
   R‰   R'   RŒ   R   t	   from_setsR^   R+   RO   Ri   R   (	   R   R2   RŽ   RH   R¢   Ru   t	   lazy_baseR   t   contexts(    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyRi   H  s    1(    (   R,   R-   t   __doc__t   api_typeR   R†   R‰   R^   R—   Rž   R   t   decorateRj   R   Ri   (    (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyRp   ð   s   			N(%   R¦   t   jediR    t   jedi._compatibilityR   t   jedi.parser_utilsR   t   jedi.evaluate.cacheR   R   R   R‡   R   t   jedi.evaluate.lazy_contextR   t   jedi.evaluate.filtersR   t   jedi.evaluate.namesR	   R
   t   jedi.evaluate.argumentsR   R   t   jedi.evaluate.base_contextR   R   R   t   jedi.evaluate.context.functionR   t   jedi.pluginsR   R   R   R.   R‹   RN   Rp   (    (    (    s:   lib/python2.7/site-packages/jedi/evaluate/context/klass.pyt   <module>&   s"   	
0h