ó
†Å•Zc           @   s  d  Z  d d l Z d d l Z d d l Z d d l m Z m Z m Z d d l	 m
 Z
 e j e j j j ƒ Z e d „  ƒ Z e d „  ƒ Z d „  Z e d „  ƒ Z d	 „  Z d
 „  Z d „  Z e d „  ƒ Z d „  Z e d d „ ƒ Z e d „  ƒ Z d „  Z d „  Z d S(   sg   A module for inferring objects

For more information see the documentation in `rope.base.oi`
package.

iÿÿÿÿN(   t   evaluatet   utilst	   arguments(   t   get_type_hinting_factoryc         C   s  |  j  j } | j |  | ƒ } | d k	 r. | St |  | ƒ } | d k	 rœ | r˜ |  j ƒ  j ƒ  d k	 r˜ | j |  j d t	 ƒ ƒ } | j
 |  | | ƒ n  | S| j |  | ƒ } | d k	 r¾ | St |  j  j ƒ j ƒ  } | |  ƒ } | d k	 rt j j j | ƒ Sd S(   s<   Infer the `PyObject` this `PyFunction` returns after callingt   special_argsN(   t   pycoret   object_infot   get_exact_returnedt   Nonet   _infer_returnedt
   get_modulet   get_resourcet   get_argumentst   get_param_namest   Falset   function_calledt   get_returnedR   t   projectt   make_return_providert   ropet   baset	   pyobjectst   PyObject(   t
   pyfunctiont   argsR   t   resultt   paramst   hint_returnt   type_(    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyt   infer_returned_object   s$    c         C   sG   |  j  j } | j |  ƒ } | d k r6 t |  ƒ } n  t |  | ƒ | S(   s9   Infer the `PyObject`\s of parameters of this `PyFunction`N(   R   R   t   get_parameter_objectsR   t   _parameter_objectst   _handle_first_parameter(   R   R   R   (    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyt   infer_parameter_objects)   s    c         C   sª   |  j  ƒ  } | d  k s' | d k r' n  | s_ |  j d t ƒ sC d  S| j t j j j ƒ  ƒ n  | d k rŠ t j j j	 |  j
 ƒ | d <n  | d k r¦ |  j
 | d <n  d  S(   Nt   methodt   classmethodR   i    (   R"   R#   (   t   get_kindR   R   R   t   appendR   R   R   t   get_unknownR   t   parent(   t   pyobjectt
   parameterst   kind(    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyR    4   s    c         C   sÝ   |  j  s d  Sxƒ t |  j  ƒ D]r } t | |  j ƒ } t | t j j j ƒ rc | j	 ƒ  d k rc Pq | t j j
 j ƒ  k r Pq | d  k	 r | Sq Wt |  j j j ƒ j ƒ  } | |  ƒ } | d  k	 rÙ t j j
 j | ƒ S| S(   Nt   NotImplementedType(   t   assignmentst   reversedt   _infer_assignmentt   modulet
   isinstanceR   R   t   builtinst   BuiltinUnknownt   get_nameR   R&   R   R   R   R   t   make_assignment_providerR   (   t   pynamet
   assignmentR   t   hint_assignmentt   hinting_result(    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyt   infer_assigned_objectB   s    	*c         C   s]   |  j  j } | j |  | ƒ } | sY t |  ƒ } t | ƒ | k rY | j | | ƒ qY n  | S(   N(   R   R   t   get_passed_objectsR   t   lenR%   (   R   t   parameter_indexR   R   t   statically_inferred(    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyR:   V   s    		c         C   s  | r; |  j  ƒ  j ƒ  |  j | j |  j d t ƒ ƒ ƒ n  |  j  ƒ  } | j ƒ  sW d  Sd } x± t | j ƒ  | ƒ D]˜ } yu t j	 | | ƒ } | d  k r¢ wu n  | j ƒ  }  |  t j j j ƒ  k rÌ wu n  | j ƒ  sÜ |  St j j j |  ƒ SWqu t j j j k
 rqu Xqu Wd  S(   NR   i   (   t	   get_scopet   invalidate_datat   _set_parameter_pyobjectsR   R   R   t   _get_returned_astsR-   R    t	   eval_nodeR   t
   get_objectR   R   R   R&   t   _is_generatorR1   t   get_generatort   IsBeingInferredError(   R(   R   t   scopet   maxtriest   returned_nodet   resulting_pyname(    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyR	   a   s*    c         C   s˜   g  } |  j  d t ƒ } t |  j j ƒ j ƒ  } xa | D]Y } | |  | ƒ } | d  k	 rw | j t j	 j
 j | ƒ ƒ q7 | j t j	 j
 j ƒ  ƒ q7 W| S(   NR   (   R   R   R   R   R   t   make_param_providerR   R%   R   R   R   R   R&   (   R(   R   R   t
   hint_paramt   nameR   (    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyR   }   s    c         C   sZ   t  |  | ƒ } | d  k r d  S| \ } } t |  | | ƒ } | d  k rM d  St |  | ƒ S(   N(   t   _follow_pynameR   t   _follow_evaluationst   _follow_levels(   R6   t   pymoduleR   R5   R(   (    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyR.   Œ   s    c         C   s½   x¶ |  j  D]« } t | j ƒ  t j j j ƒ ro | j ƒ  j ƒ  } | rf | t t	 | ƒ d | ƒ } q¥ d  } n6 t | j ƒ  t j j j ƒ rŸ | j ƒ  j } n d  } | d  k r
 Pq
 q
 W| S(   Ni   (   t   levelsR0   t   get_typeR   R   R1   t   Tuplet   get_holding_objectst   minR;   R   t   Listt   holding(   R6   R(   t   indext   holdings(    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyRP   ˜   s     	c         C   sí   |  j  } | d  k r$ t | ƒ } n  | j ƒ  j | ƒ } t j | | ƒ } | d  k	 ré | j ƒ  } t | j	 ƒ  t
 j j j ƒ rß | j ƒ  d k rß t
 j j j t
 j j j | j ƒ ƒ } | | j	 ƒ  j t j | g ƒ ƒ f S| | f Sd  S(   Nt   Class(   t   ast_nodeR   t   _get_lineno_for_nodeR>   t   get_inner_scope_for_lineR    RB   RC   R0   RS   R   R   R1   t   PropertyR$   t   pynamest   UnboundNameR   R   R(   t   get_property_objectR   t   ObjectArguments(   R6   RQ   t   linenot   assign_nodet   holding_scopeR5   R   t   arg(    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyRN   ©   s    	c         C   s  | } |  j  j d ƒ } xÐ | D]È } | j d ƒ } | rG | d  } n  | r€ | } t | | ƒ } | d  k	 r€ | j ƒ  } q€ n  | d  k	 r× | r× t | t j j	 j
 ƒ rÎ t j | g ƒ } | j | ƒ } q× d  } n  | d  k r Pq q W| d  k	 r|  j rt j j	 j | ƒ S| S(   Nt   .s   ()iþÿÿÿ(   t
   evaluationt   splitt   endswitht   _get_attributeR   RC   R0   R   R   R   t   AbstractFunctionR   Rc   t   get_returned_objectt   assign_typeR   (   R6   R5   R(   t
   new_pynamet   tokenst   tokent   callR   (    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyRO   »   s*    	c         C   s)   t  |  d ƒ r% |  j d  k	 r% |  j Sd S(   NRd   i   (   t   hasattrRd   R   (   Re   (    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyR]   Õ   s    c         C   s$   |  d  k	 r  | |  k r  |  | Sd  S(   N(   R   (   R(   RM   (    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyRl   Ü   s    (   t   __doc__t   rope.base.builtinsR   t   rope.base.pynamest   rope.base.pyobjectst	   rope.baseR    R   R   t!   rope.base.oi.type_hinting.factoryR   t   ignore_exceptionR   R   RF   t   _ignore_inferredR   R!   R    R9   R:   R	   R   R.   RP   R   RN   RO   R]   Rl   (    (    (    s/   lib/python2.7/site-packages/rope/base/oi/soi.pyt   <module>   s*   						