ó
’›V]c           @   so  d  Z  d d l 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 d d l m Z e d d d d g ƒ Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d „  Z d „  Z d „  Z d e  f d „  ƒ  YZ! d „  Z" d „  Z# d „  Z$ d „  Z% e d ƒ d  „  ƒ Z& d S(!   s   
Helpers for the API
iÿÿÿÿN(   t
   namedtuple(   t   dedent(   t   Parser(   t   tree(   t   ut	   Parameter(   t   NO_CONTEXTS(   t	   eval_atom(   t   evaluate_call_of_leaf(   t   get_string_context_set(   t   call_signature_time_cachet   CompletionPartst   patht   has_dott   namec         C   s   t  |  d d „  ƒS(   Nt   keyc         S   s.   |  j  p d |  j p d |  j p$ d |  j f S(   Nt    i    (   t   module_patht   linet   columnR   (   t   x(    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   <lambda>   R   (   t   sorted(   t   defs(    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   sorted_definitions   s    c         C   sŠ   |  j  | ƒ } | d  k s* | j d	 k r] | | d d } t j d | | d  ƒ j d ƒ S| j d
 k rp d S| j | d | j d  S(   Nt   stringt
   error_leafi    i   s   (?!\d)\w+$|$R   t   keywordR   (   R   R   (   R   R   (   t   get_leaf_for_positiont   Nonet   typet   ret   searcht   groupt   valuet	   start_pos(   t   module_nodet   linest   positiont   leafR   (    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   get_on_completion_name   s    !c         C   sR   |  | d d | d !} | d | d  | d <| d | d | d <d j  | ƒ S(   Ni    i   iÿÿÿÿR   (   t   join(   t
   code_linesR#   t   end_posR%   (    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt	   _get_code)   s    t   OnErrorLeafc           B   s   e  Z e d  „  ƒ Z RS(   c         C   s   |  j  d S(   Ni    (   t   args(   t   self(    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyR   4   s    (   t   __name__t
   __module__t   propertyR   (    (    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyR-   3   s   c         C   s?  | j  | k r4 | j ƒ  } | d  k r4 t d ƒ Sn  | j d k } x5 | j d k rz | j ƒ  } | d  k rF t d ƒ SqF W| j d k s™ | j d k rÉ | j  d | d k  rº t d ƒ St | ƒ ‚ nr | } x) t rú | j j d
 k rî Pn  | j } qÒ W| r%| j  d	 | d	 k r%t d ƒ Sn  t |  | j	 ƒ  | ƒ Sd  S(   NR   t   newlineR   R   i    t
   file_inputt   suitet   simple_stmti   (   R4   R5   R6   (
   R#   t   get_previous_leafR   R   R   R-   t   Truet   parentR,   t   get_start_pos_of_prefix(   R*   R'   R&   t   is_after_newlinet	   user_stmt(    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   _get_code_for_stack9   s,    
	c            s¾   d t  f d „  ƒ  Y‰  ‡  ‡ ‡ f d †  } t t | | | ƒ ƒ } d ‰ | d ˆ } t ˆ j d t ƒ} y | j d | | ƒ ƒ Wn ˆ  k
 r | j SXt d t	 | | ƒ ƒ ƒ ‚ d	 S(
   sU   
    Returns the possible node names (e.g. import_from, xor_test or yield_stmt).
    t   EndMarkerReachedc           B   s   e  Z RS(    (   R0   R1   (    (    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyR>   e   s   c         3   s…   ˆ j  |  ƒ } xo | D]g } | j ˆ k r7 ˆ  ƒ  ‚ q | j j ˆ ƒ rU ˆ  ƒ  ‚ q | j j ˆ ƒ rx | Vˆ  ƒ  ‚ q | Vq Wd  S(   N(   t	   _tokenizeR   t   prefixt   endswith(   t   codet   tokenst   token(   R>   t   grammart   safeword(    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   tokenize_without_endmarkerh   s    t)   ZZZ_USER_WANTS_TO_COMPLETE_HERE_WITH_JEDIt    t   error_recoveryRC   s7   This really shouldn't happen. There's a bug in Jedi:
%sN(
   t	   ExceptionR   R=   R   t   _pgen_grammarR8   t   parset   stackt   SystemErrort   list(   RE   R*   R'   t   posRG   RB   t   p(    (   R>   RE   RF   s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   get_stack_at_positiona   s    c         C   s¯   | j  d k r |  j | | ƒ S| j } t } | j  d k rR | j | j ƒ } nY | j  d k rs t | | ƒ } n8 t | t j ƒ r’ t	 | | ƒ S| j  d k r« t
 |  ƒ S| S(   NR   t   atomt   trailert   fstring_stringt   fstring_startt   fstring_end(   RV   RW   RX   (   R   t   goto_definitionsR9   R   t	   eval_nodeR   t
   isinstanceR   t   LiteralR   R	   (   t	   evaluatort   contextR'   R9   t   definitions(    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   evaluate_goto_definition‹   s    	
t   CallDetailsc           B   s8   e  Z d  „  Z e d „  ƒ Z e d „  ƒ Z d „  Z RS(   c         C   s,   d d d g | |  _  | |  _ | |  _ d  S(   Nt   bracket_leaft
   call_indext   keyword_name_str(   Rb   t	   _childrent	   _position(   R/   Rb   t   childrenR&   (    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   __init__¢   s    		c         C   s   t  |  j |  j ƒ d S(   Ni    (   t   _get_index_and_keyRe   Rf   (   R/   (    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   index¨   s    c         C   s   t  |  j |  j ƒ d S(   Ni   (   Ri   Re   Rf   (   R/   (    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyRd   ¬   s    c         C   sð  d } t  ƒ  } d } t t |  j |  j ƒ ƒ } | sG | r@ d Sd  Sn  t } xy t | ƒ D]k \ } \ } } }	 | |	 | d k BO} | rŒ qZ | d t | ƒ k rZ |	 r¸ | j	 | ƒ qÅ | d 7} qZ qZ Wx t | ƒ D]\ } }
 |
 j
 ƒ  } | s5| t j k r| S| t j t j f k r5| | k r2| Sq5n  | d  k	 rN| d k sZ| d k rÖ |
 j | k rÒ| t j k s“| t j k rÒ| | k rÒ| r| S|	 r¹|
 j | k rÏ| SqÒ|
 j j | ƒ rÒ| Sn  | t j k rè| SqÖ qÖ Wd  S(   Ni    iÿÿÿÿi   i   (   t   setRP   t   _iter_argumentsRe   Rf   R   t   Falset	   enumeratet   lent   addt   get_kindR   t   VAR_POSITIONALt   POSITIONAL_OR_KEYWORDt   POSITIONAL_ONLYt   string_namet   KEYWORD_ONLYt
   startswitht   VAR_KEYWORD(   R/   t   param_namest   positional_countt
   used_namest
   star_countR.   t   is_kwargt   it	   key_startt	   had_equalt
   param_namet   kind(    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   calculate_index°   sP    	"
%(   R0   R1   Rh   R2   Rj   Rd   Rƒ   (    (    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyRa   ¡   s   	c         #   sH  ‡  f d †  } g  |  D] } | j  ˆ  k  r | ^ q } | d j d k rt x# t | d j ˆ  ƒ D] } | Vqa Wd  St } d } x|t | ƒ D]n\ } }	 |	 j d k r’t } |	 j d }
 |	 j d } | d k r| j  ˆ  k  r÷ d |
 j t f Vq‰d | |
 ƒ t f Vn{ |
 d k r:t |
 j ƒ | | ƒ t f VnO |	 j	 ƒ  } | j d
 k r{| j  ˆ  k r{d | | ƒ t f Vn d d  t f Vd } q |	 j d k rx] |	 j d  d  d … D]E } | j d k rãd } | j d } n  | | | ƒ t f Vd } q¸Wt t |	 j ƒ d ƒ } q t |	 t j ƒ rd|	 j d k rd| s[| d t f Vd } n  t } q t |	 t j ƒ r—|	 j d k r—t |	 j ƒ } q |	 d k r | d r t } | | d } | j d
 k räd | j t f Vn d d  t f Vd } q q W| sD| d j d
 k r3| | | d ƒ t f VqD| d t f Vn  d  S(   Nc            s-   |  j  d k r d  S|  j ˆ  d |  j d  S(   NR   i   (   R   R   R"   R#   (   R   (   R&   (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   remove_after_poså   s    iÿÿÿÿt   arglisti    t   argumenti   t   =t   *s   **R   t   testlistt   testlist_star_expri   t	   star_exprt   ,R   (   Rˆ   s   **(   R‰   RŠ   (   Rˆ   s   **(   R#   R   Rl   Rg   Rm   Rn   R8   R"   Ro   t   get_first_leafR   t   boolR[   R   t
   PythonLeaf(   t   nodesR&   R„   t   ct   nodes_beforeR   t   previous_node_yieldedt
   stars_seenR~   t   nodet   firstt   secondt
   first_leaft   nt   before(    (   R&   s/   lib/python2.7/site-packages/jedi/api/helpers.pyRl   ä   sd    (	 	
!		!c         C   sÙ   g  |  D] } | j  | k  r | ^ q } | d j d k rO t | d j | ƒ Sd	 } | d } | j d k rª | j d d k rª | j d j | k rª | j d j } n | d k rÆ | d j } n  | j d ƒ | f S(
   sG   
    Returns the amount of commas and the keyword argument string.
    iÿÿÿÿR…   R†   i   R‡   i    iþÿÿÿRŒ   N(   R#   R   Ri   Rg   R   R+   R"   t   count(   R   R&   R‘   R’   t   key_strt   last(    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyRi   (  s    (
"c         C   sº   x³ t  t t |  j ƒ ƒ ƒ D]– \ } } | d k r | j | k r | d k r |  j | } | j ƒ  } | d  k rz q n  | j d k s› | j j d k r² t	 | | | | ƒ Sq q Wd  S(   Nt   (i    R   RU   RT   (   RU   RT   (
   t   reversedRP   Rn   Rg   R+   R7   R   R   R9   Ra   (   R•   t   additional_childrenR&   Rj   t   elementRg   R   (    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt+   _get_call_signature_details_from_error_node=  s    ('!c         C   s  |  j  | d t ƒ} | j | k rC | j ƒ  } | d  k rC d  Sn  | d k rp | j | k rp | j ƒ  } qp n  | j } x| d  k	 rˆ| j d	 k r› d  Sg  } x€ t	 | j
 ƒ D]o } | j | k  r± | j d k rt | | | ƒ } | d  k	 r÷ | S| j
 | d d +q± n  | j d | ƒ q± q± W| j d k r|| j
 d d k r|| j ƒ  } | d  k rbd  St | j
 d | j
 | ƒ S| j } q| Wd  S(
   Nt   include_prefixest   )t   funcdeft   classdeft
   error_nodei    RU   Rž   (   R¥   R¦   (   R   R8   R#   R7   R   R+   t   get_next_leafR9   R   RŸ   Rg   R¢   t   insertRa   (   t   moduleR&   R'   R•   R    R™   t   result(    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   get_call_signature_detailsK  s<    	"t   call_signatures_validityc         c   s´   | d d } | | | d  } | | j  d | !} d j | | g ƒ } t j d | t j ƒ }	 | j ƒ  j ƒ  }
 |
 d k rˆ d Vn |
 |	 | j  f Vt |  | | j	 ƒ  ƒ Vd S(   s'   This function calculates the cache key.i    i   R   s   .*\(N(
   R#   R)   R   t   matcht   DOTALLt   get_root_contextt
   py__file__R   R`   R7   (   R]   R^   Rb   R*   t   user_post
   line_indext   before_cursort   other_linest   wholet   before_bracketR   (    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   cache_call_signaturesz  s    ('   t   __doc__R   t   collectionsR    t   textwrapR   t   parso.python.parserR   t   parso.pythonR   t   jedi._compatibilityR   R   t   jedi.evaluate.base_contextR   t   jedi.evaluate.syntax_treeR   t   jedi.evaluate.helpersR   t   jedi.evaluate.compiledR	   t
   jedi.cacheR
   R   R   R(   R,   RK   R-   R=   RS   R`   t   objectRa   Rl   Ri   R¢   R¬   R¸   (    (    (    s/   lib/python2.7/site-packages/jedi/api/helpers.pyt   <module>   s2   			
	(	*	C	D			/