
V]c           @   s  d  Z  d d l Z d d l m Z d d l m Z m Z d d l m Z d d l m	 Z	 d d l
 m Z m Z m Z 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 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 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, d d l- m. Z. d d l/ m0 Z0 d   Z1 d   Z2 e j3 e1 d     Z4 d   Z5 d   Z6 e1 d d   Z8 e j3 d d    Z9 d!   Z: e d"    Z; d#   Z< d$   Z= d%   Z> d&   Z? d'   Z@ d(   ZA d)   ZB d*   ZC d+   ZD e0 jE   d,    ZF e(   d-    ZG d.   ZH d/   ZI d S(0   s'   
Functions evaluating the syntax tree.
iN(   t   tree(   t   force_unicodet   unicode(   t   debug(   t   parser_utils(   t
   ContextSett   NO_CONTEXTSt   ContextualizedNodet   ContextualizedNamet   iterator_to_context_sett   iterate_contexts(   t   LazyTreeContext(   t   compiled(   t	   recursion(   t   helpers(   t   analysis(   t   imports(   t	   arguments(   t   ClassContextt   FunctionContext(   t   iterable(   t   TreeInstance(   t
   NameFinder(   t	   is_stringt
   is_literalt	   is_number(   t   COMPARISON_OPERATORS(   t   evaluator_method_cache(   t   VersionInfo(   t
   annotation(   t	   Decoratee(   t   plugin_managerc            s     f d   } | S(   s{  
    This is for now the way how we limit type inference going wild. There are
    other ways to ensure recursion limits as well. This is mostly necessary
    because of instance (self) access that can be quite tricky to limit.

    I'm still not sure this is the way to go, but it looks okay for now and we
    can still go anther way in the future. Tests are there. ~ dave
    c            s   |  j  } |  j } y> | j | c d 7<| j | d k rO t j d |  t SWn t k
 rp d | j | <n X  |  | |  S(   Ni   i,  s-   In context %s there were too many inferences.(   t	   tree_nodet	   evaluatort   inferred_element_countsR   t   warningR   t   KeyError(   t   contextt   argst   kwargst   nR!   (   t   func(    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyt   wrapper*   s    		(    (   R)   R*   (    (   R)   s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyt   _limit_context_infers!   s    	c         C   sY   t  } xL |  D]D } y | j } Wn! t k
 rC t j d |  q X| |   O} q W| S(   Ns   %s is not actually a generator(   R   t   py__stop_iteration_returnst   AttributeErrorR   R#   (   t
   generatorst   resultst	   generatort   method(    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyt   _py__stop_iteration_returns9   s    c         C   s  t  j d | | j |   |  j } | j } | d% k rD t |  |  S| d	 k ri t t j |  |  g  S| d
 k r t	 |  |  S| d& k r{| j
 d } | j
 d } t } | j d k r | j d k r t } | j d  } n  |  j |  } xk t |  D]] \ } }	 |	 d k rK|  j | | d  }
 t | |  | |	 |
  } Pn  t |  | |	  } q W| rw| j   j   S| S| d' k rt t j | |  |  g  S| d( k r|  j | j
 d  } x$ | j
 d  D] } t | |  } qW| S| d k r$|  j | j
 d  |  j | j
 d  BS| d k r| j d) k rj| j } t d t | j  | f   n  t t j | d  g  S| d k rt |  | j
 d  } x3 | j
 d d  d  D] } | j | d |  } qW| S| d k rt |  | j
 d  S| d  k r(t j |  | j
 d  j    S| d! k rt! | j
  r| j
 d j d" k r| j
 d j
 d } |  j |  j d#  j"   } | j   St# S| d$ k rt |  | j
 d  St$ |  |  Sd  S(*   Ns   eval_node %s@%s in %st   namet   numbert   stringt   atomt   stringst   keywordt   fstringt   lambdeft	   expr_stmtt   powert	   atom_expri    i   t   awaits   **t   testlist_star_exprt   testlistt   not_testt   factorit   testt   operatort   .s   ...s   unhandled operator %s in %s u   Ellipsist   dotted_namei   t   name_contextt
   eval_inputt	   annassignt
   yield_exprt	   yield_argt   __iter__t   namedexpr_test(   R3   R4   R5   R6   R7   R8   R9   (   R<   R=   (   R?   R@   (   RA   RB   (   RE   s   ...(%   R   t   dbgt	   start_posR!   t   typet	   eval_atomR   R   t   from_contextt   eval_expr_stmtt   childrent   Falset   valuet   Truet   popt	   eval_nodet	   enumeratet   _eval_comparisont   eval_trailert   py__await__R,   R   t   SequenceLiteralContextt   eval_factort   parentt   AssertionErrort   reprR   t   builtin_from_namet   py__getattribute__R   t   eval_annotationt   execute_annotationt   lent   execute_evaluatedR   t   eval_or_test(   R%   t   elementR!   t   typt   first_childRT   t	   had_awaitt   context_sett   it   trailert   rightRD   t   origint	   next_nameR.   (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyRY   E   s    				"%
c         C   s   | j  d  \ } } | d k r( d  } n  | d k rn | j  \ } } } | j t |  j |  |  t |  |   St j d | |  | d k r | j d |  d |  S| d k s t	 d	 |   t
 j |  j |  | |  } | j |  Sd  S(
   Ni   t   )t   [s   eval_trailer: %s in %sRE   RG   t   name_or_strt   (s   trailer_op is actually %s(   RT   t   Nonet   get_itemt   eval_subscript_listR!   R   R   RN   Rd   Ra   R   t   TreeArgumentst   execute(   R%   t   atom_contextsRp   t
   trailer_opt   nodet   _R&   (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyR\      s     		c         C   s  | j  d k r | j d k r= t t j |  j | j  g  St j | d d  pU | } | j  d k rp | } n  | j } t	 |  r d } n  |  j d | d | d	 t  S| j  d
 k r&| j d k r t t j |  j | j  g  S| j d k r t S| j d k rt St st d |   ntt | t j  rl|  j j j | j  } t t j |  j |  g  S| j  d k rt |  | j d  } x? | j d D]0 } t |  |  } t |  j |  | d |  } qW| S| j  d k rt j |  j  S| j } | d d k r`t |  d k r`| d j  d k oKt | d j  d k r`|  j | d  Sy | d j d } Wn t t f k
 rng X| d k ry | d j d } Wqt k
 rqXn  | j  d  k rt t j |  j |  |  g  S| d }	 y |	 j }
 Wn t k
 r%g  }
 n X| d d k ru|	 d k sZd |
 k sZd |
 k rut j |  j |  |  }  n t j  |  j |  |  }  t |  g  Sd S(!   s   
    Basically to process ``atom`` nodes. The parser sometimes doesn't
    generate the node (because it has just one child). In that case an atom
    might be a name or a literal as well.
    R3   RW   RU   Rx   R;   R:   Rv   t   positiont   search_globalR8   t   printt   yields   Cannot evaluate the keyword %sR7   i    i   u   +R9   Rw   i   t   testlist_compt   :i   t   comp_fort   sync_comp_fort   {t   }s   **N(   RW   RU   Rx   (   RU   RW   Rx   (   R   R   (!   RP   RV   R   R   Rc   R!   R    t   search_ancestorRO   t   _is_annotation_nameRx   Rd   RW   R   RU   Ra   t
   isinstancet   Literalt   compiled_subprocesst   safe_literal_evalt   create_simple_objectRQ   RT   R[   t   get_string_context_setRg   RY   t
   IndexErrorR-   R   t   comprehension_from_atomt   DictLiteralContextR^   (   R%   R6   t   stmtR   R5   Rn   Rq   t   cR   t
   array_nodet   array_node_c(    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyRQ      sz    					#	

(c      	   C   s   t  j |  j |   } | r |  j   |  j j k r y |  j j } Wn t k
 rZ q X| j j	 d k r | j
   } | | k r t } q q n  | r t |  | |  SWd  QXt S(   Nt   listt   set(   R   R   (   R   t   execution_allowedR!   t   get_root_contextt   builtins_modulet   var_argst   instanceR-   R3   t   string_namet'   get_first_non_keyword_argument_contextsRW   t   _eval_expr_stmtR   (   R%   R   t	   seek_namet   allowedR   R   (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyRS     s    c         C   s  t  j d | |  | j   } |  j |  } | r[ t |  |  } t |  j | |  } n  t | j   d
  } | d k r| j
 d k rt j |  } | j d  | _ | j   d j } |  j | d | j d t }	 t j | d  }
 |
 d
 k	 r|
 j
 d k r| rt j |
  r|
 j   } t |  |  } t | j   j |   } xq | D]i } i | j   |
 j d	 j 6} t j |  |
 |  / |  j |  } t |  j |  |	 | |  }	 Wd
 QXqZW|	 } qt |  j |  |	 | |  } n  t  j d |  | S(   s  
    The starting point of the completion. A statement always owns a call
    list, which are the calls, that a statement does. In case multiple
    names are defined in the statement, `seek_name` returns the result for
    this name.

    :param stmt: A `tree.ExprStmt`.
    s   eval_expr_stmt %s (%s)t   =RD   ii    R   R   t   for_stmti   Ns   eval_expr_stmt result %s(   R   N(   R   RN   t   get_rhsRY   R   t   check_tuple_assignmentsR!   t   nextt   yield_operatorsRx   RP   t   copyRV   t   get_defined_namesRd   RO   RW   R    R   R   t   for_stmt_defines_one_namet   get_testlistR   R   t   infert   iterateRT   R   t   predefine_namesR[   (   R%   R   R   t   rhsRn   t   c_nodet   first_operatorRD   R3   t   leftR   R   t   cnt   orderedt   lazy_contextt   dctt   t(    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyR   %  s8    
!%	c         C   s,  t  | j  } |  j t |   } x | D] } t |  } | j d k rk d j d   | j D  } n  | d k r t d   | D  } | t h k r | d k r |  j |  } q q| t h k r| d k r |  j |  } q qq+ t	 |  j
 |  | | |  j |   } q+ Wt j d |  | S(	   Nt   comp_opt    c         s   s   |  ] } | j  Vq d  S(   N(   RV   (   t   .0R   (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pys	   <genexpr>\  s    t   andt   orc         s   s   |  ] } | j    Vq d  S(   N(   t
   py__bool__(   R   R   (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pys	   <genexpr>`  s    s   eval_or_test types %s(   R   R   (   t   iterRT   RY   R   RP   t   joinR   RW   RU   R[   R!   R   RN   (   R%   t   or_testt   iteratort   typesRD   Rq   t
   left_bools(    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyRi   V  s$    c         c   s   x| |  D]t } | d k r6 t  |  r{ | j   Vq{ q | d k rv | j   } | d k r^ d St j | j |  Vq | Vq Wd S(   s6   
    Calculates `+`, `-`, `~` and `not` prefixes.
    t   -t   notN(   R   t   negateR   Rx   R   R   R!   (   Rn   RD   R%   RV   (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyR_   o  s    c         C   se   t  } xX | D]P } t |  rJ t j |  | j j  } | | j   O} q | t | g  O} q W| S(   N(   R   R   R   Rc   R3   R   Rh   R   (   R!   t   resultt
   new_resultRk   t   cls(    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyt   _literals_to_types  s    c            s   | s  r1 | p t   p  t  B} t  |  St |  t   d k r^ t  |  B St j      f d   | D  Sd  S(   Ni   c         3   s4   |  ]* }  D] } t     |  |  Vq q d  S(   N(   t   _eval_comparison_part(   R   R   Rq   (   R%   R!   RD   t   right_contexts(    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pys	   <genexpr>  s   (   R   R   Rg   R   t	   from_sets(   R!   R%   t   left_contextsRD   R   R   (    (   R%   R!   RD   R   s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyR[     s    c         C   s   t  j |  d d d  } | d  k r( t S| j d k rp | j } | d  k	 r | j |  j k oj | j k  SSni | j d k r | j } t	 |  d k r | d j d k r | d j |  j k o | d j k  SSn  t S(   Nt   paramt   funcdefR;   i   RI   (   R   R   (
   R    R   Rx   RU   RP   R   RO   t   end_posRT   Rg   (   R3   t   ancestort   annR   (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyR     s    	$	%,c         C   s   t  |  t j  o |  j d k S(   Nt   tuple(   R   R   t   Sequencet
   array_type(   R%   (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyt	   _is_tuple  s    c         C   s   t  |  t j  o |  j d k S(   NR   (   R   R   R   R   (   R%   (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyt   _is_list  s    c         C   s   t  j |  t t |    S(   N(   R   Rc   R   t   str(   R!   t   bool_(    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyt   _bool_to_context  s    c         C   s   t  |  t j  s d  Sg  } xr |  j   D]d } t  | t  sB d  S| j } | j d k r^ d  Sy | j t	 | j
   Wq) t k
 r d  SXq) W| S(   NR4   (   R   R   R^   Rx   t
   py__iter__R   t   dataRP   t   appendt   intRV   t
   ValueError(   R%   t   numbersR   R   (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyt   _get_tuple_ints  s    		c         C   sH  t  |  } t  |  } t | t  r0 | } n t t | j   } | d k r t | t j  so t |  r| t	 | g  St | t j  s t |  rt	 | g  Sn| d k rE| r | s t |  r t |  r t	 | j
 | |  g  St |  rt |  s#t |  rt |  rt	 t j |  | | f  g  Snw| d k ry| r| rt	 | j
 | |  g  SnC| d k rt	 | g  S| t k r| j   r| j   ry t	 | j
 | |  g  SWqt k
 rqXn | d k r%t | } | | |  }	 t	 t |  |	  g  St | t  rt |  }
 |
 d  k	 rt j j | |  j j t |
   } t	 t |  |  g  Sn  t	 t |  t  t |  t  g  S| d	 k rt Sd
   } | d k r| | k r| |  p| |  rd } t j | d | | | | f  n  t	 | | g  } t j  d | |  | S(   Nt   *t   +R   t   %t   iss   !=s   ==s   is nott   inc         S   s   t  |  t  o |  j j d k S(   s4   Checks if a Jedi object is either a float or an int.R   t   float(   R   R   (   R   R   R3   R   (   t   obj(    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyt   check  s    s7   TypeError: unsupported operand type(s) for +: %s and %ss   type-error-operations    Used operator %s resulting in %s(   R   s   !=s   ==s   is not(   R   R   (!   R   R   R   R   R   RV   R   R   R   R   t   execute_operationR   R   t   MergedArrayR   t   is_compiledt	   TypeErrorR   R   R   Rx   R   t   accesst   environmentt   version_infoR   RW   RU   R   R   t   addR   RN   (   R!   R%   R   RD   Rq   t   l_is_numt   r_is_numt   str_operatort	   operationR   R   t   bool_resultR   t   messageR   (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyR     sb    	$0"
	"	c         C   s2   t  j | | |  } | r | St | | d | S(   s   
    This is the part where statements are being stripped.

    Due to lazy evaluation, statements like a = func; b = a; b() have to be
    evaluated.
    R   (   R   t"   find_type_from_comment_hint_assignRS   (   R!   R%   R   R3   t   pep0484_contexts(    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyt   _remove_statements  s    c         C   s  t  } | j   j } | d  k	 r | j   j | j g   } x | D] } | j } | j d k rC | j	 d j d k rC t
 j |  | j k } | r | t j | | j	 d j	 d  j   O} q qC qC W| r | Sn  g  }	 | j d t  }
 |
 d  k r| j }
 |
 j d k rp|  j | |  } t |  | | | j  } | j d t  } t |  g } | j | d t S|
 j d k r|  j | |  } t | |  Sn  |
 j } | d
 k rt j | |
 |  }	 |	 r|	 Sn  | d k rt j | |
 |  }	 |	 r|	 Sn  | d k ry | j |
 | j }	 Wqt k
 rt | |
 j	 d  } t | j   d | d |
 j j d k } t | |  } t  |  | |  }	 qXn | d k rt! |  | |
 |  }	 n | d k r| j" |
 j# |   } | j$ d  } | j%   S| d k r$t& j' | |  }	 n| | d k rBt( | |
  }	 n^ | d k rx| j" | j)   j)    } | j%   }	 n( |
 j d k rt  }	 n t* d |   |	 S(   NR;   i   RI   t   import_name_alwayst   global_stmtR   t   attribute_lookupt   import_fromt   import_nameR   t	   with_stmtR   R   i   t   contextualized_nodet   is_asynct
   async_stmtu	   __enter__R   t   classdeft   try_stmtR   s   Should not happen. type: %s(   R  R  (   R   R   R   (   R  R  (   R   R	  (+   R   R   R    Rx   t   get_used_namest   getRV   R`   RP   RT   R   t   get_parent_scopeR   Re   Rf   t   get_definitionRW   t   create_contextR   t   get_filtersR   t   findRU   RQ   t   find_type_from_comment_hint_fort    find_type_from_comment_hint_witht   predefined_namesR$   R   R
   R   R   R   R   RY   t   get_test_node_from_nameRd   Rh   R   t   infer_importt   _apply_decoratorst   get_previous_siblingR   (   R!   R%   t	   tree_nameRn   t   module_nodet   namesR3   R;   t   correct_scopeR   R   t   findert   filtersRk   R   t	   for_typesR   t   context_managerst   enter_methodst
   exceptions(    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyt   tree_name_to_contexts%  s~    	%	+		
	c      	   C   s  | j  d k r- t |  j d |  d | } n t j |  |  } t | g  } } x7t | j    D]#} t j	 d | | d d t j
    |  j | j d  } | j d d	 !} | r t j d
 |  } | | _ t |  | |  } n  t |  s1| j d t  }	 |	 d k r-t j d | |  n  | S| j t j | g   } t |  slt j d |  | SWd QXt j	 d | d d qe W| | k rt g  | D] }
 t |
 |  ^ q S| S(   s   
    Returns the function, that should to be executed in the end.
    This is also the places where the decorators are processed.
    R	  t   parent_contextR    s   decorator: %s %st   colort   MAGENTAi   i   iRp   t   include_prefixs	   @runtime
s   decorator not found: %s on %ss)   not possible to resolve wrappers found %sNs   decorator end %s(   RP   R   R!   R   RR   R   t   reversedt   get_decoratorsR   RN   t   increase_indent_cmRY   RT   R    t
   PythonNodeR`   R\   Rg   t   get_codeRU   R#   R|   R   t   ValuesArgumentsR   (   R%   R   t   decoratee_contextt   initialt   valuest   dect
   dec_valuest   trailer_nodesRp   t   codeR   (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyR  w  s:    		
&c   	      C   s   d } x | j   D] \ } } t | j |  } | j |  } t | t  rS t Sx= t | d  D]+ } y t	 |  } Wqd t
 k
 r t SXqd W| j   } q W| S(   s(   
    Checks if tuples are assigned.
    i   N(   Rx   t   assignment_indexesR   R%   R   R   t   sliceR   t   rangeR   t   StopIterationR   (	   R!   t   contextualized_nameRn   R   t   indexR   R   t   iteratedR   (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyR     s    	c         C   sD  | d k r+ t  t j | d
 d
 d
  g  S| j d k r| j d d k rg  } x | j D]v } | d k r | s | j d
  q q^ | j d k r t | j  d k r | j | j d  q q^ | j |  q^ W| d
 g d t |  7} t  t j | |  g  S| j d	 k r7t  t j |  | |  g  S| j	 |  S(   s,   
    Handles slices in subscript nodes.
    R   t	   subscripti    RE   t   sliceopi   i   i   t   subscriptlistN(
   R   R   t   SliceRx   RP   RT   R   Rg   R^   RY   (   R!   R%   R:  R   t   el(    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyRz     s"    #(J   t   __doc__R   t   parso.pythonR    t   jedi._compatibilityR   R   t   jediR   R   t   jedi.evaluate.base_contextR   R   R   R   R	   R
   t   jedi.evaluate.lazy_contextR   t   jedi.evaluateR   R   R   R   R   R   t   jedi.evaluate.contextR   R   R   R   t   jedi.evaluate.finderR   t   jedi.evaluate.helpersR   R   R   t   jedi.evaluate.compiled.accessR   t   jedi.evaluate.cacheR   t"   jedi.evaluate.gradual.stub_contextR   t   jedi.evaluate.gradualR   t   jedi.evaluate.context.decoratorR   t   jedi.pluginsR   R+   R2   t   increase_indentRY   R\   RQ   Rx   RS   R   Ri   R_   R   R[   R   R   R   R   R   R   R   t   decorateR#  R  R   Rz   (    (    (    s8   lib/python2.7/site-packages/jedi/evaluate/syntax_tree.pyt   <module>   sb   .		S		^0									F	R.	