
    ÆeN$                     d   d dl mZ d dlmZmZmZ  G d d      Zd Zd Z G d de      Z	 G d	 d
e      Z
 G d de      Z G d d      Z G d dee
      Z G d dee      Z G d dee	      Z G d d      Z G d dee      Z G d de      Z G d de      Z G d dej(                        Zy)     )Optional)ast
exceptionsutilsc                   r     e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Z fd
Zd ZdZdZed        Z xZS )PyObjectc                     || }|| _         y Ntype)selftype_s     5/usr/lib/python3/dist-packages/rope/base/pyobjects.py__init__zPyObject.__init__   s    =E	    c                 V    | j                   | u ri S | j                   j                         S r
   )r   get_attributesr   s    r   r   zPyObject.get_attributes   s&    99Iyy''))r   c                 |    || j                         vrt        j                  d|z        | j                         |   S NzAttribute %s not found)r   r   AttributeNotFoundErrorr   names     r   get_attributezPyObject.get_attribute   s>    t**,,334Lt4STT""$T**r   c                      y r
    r   s    r   
get_modulezPyObject.get_module       r   c                     | j                   S r
   r   r   s    r   get_typezPyObject.get_type   s    yyr   c                 $    | j                  |      S )z"The same as ``get_attribute(key)``)r   r   keys     r   __getitem__zPyObject.__getitem__   s    !!#&&r   c                 &    || j                         v S )z,The same as ``key in self.get_attributes()``)r   r"   s     r   __contains__zPyObject.__contains__    s    d))+++r   c                     | j                   |j                   k7  ryt        |       t        k(  r?| | j                  ur| j                  |j                  k(  S | j                  |j                  u S | |u S )al  Check the equality of two `PyObject`

        Currently it is assumed that instances (the direct instances
        of `PyObject`, not the instances of its subclasses) are equal
        if their types are equal.  For every other object like
        defineds or builtins rope assumes objects are reference
        objects and their identities should match.

        F)	__class__r   r   r   objs     r   __eq__zPyObject.__eq__$   s_     >>S]]*:!499$yyCHH,,yyCHH,,s{r   c                 &    | j                  |       S r
   )r+   r)   s     r   __ne__zPyObject.__ne__7   s    ;;s###r   c                     t        |       t        k(  r'| | j                   k7  rt        | j                         dz   S t        |          S )zSee docs for `__eq__()` method   )r   r   hashsuper__hash__r   r(   s    r   r2   zPyObject.__hash__:   s;    :!ddii&7		?Q&&7#%%r   c                 4    t        | j                               S )z+The same as ``iter(self.get_attributes())``)iterr   r   s    r   __iter__zPyObject.__iter__A   s    D'')**r   Nc                 B   t         j                  }i t         _        t        d       }|t         j                  d<   t        |      t         j                  d<   t        |      t         j                  d<   t        |      t         j                  d<   t         j                  |    S )NTypeModuleFunctionUnknown)r   _types)r   	base_types     r   _get_base_typezPyObject._get_base_typeH   sr    ??" HO I&/HOOF#(0(;HOOH%*29*=HOOJ')1))<HOOI&t$$r   )__name__
__module____qualname__r   r   r   r   r    r$   r&   r+   r-   r2   r6   r<   _unknownstaticmethodr>   __classcell__r(   s   @r   r   r      sX    
*
+
',&$&+ FH% %r   r   c                 ,    t         j                  |       S )a  Return the base type with name `name`.

    The base types are 'Type', 'Function', 'Module' and 'Unknown'.  It
    was used to check the type of a `PyObject` but currently its use
    is discouraged.  Use classes defined in this module instead.
    For example instead of
    ``pyobject.get_type() == get_base_type('Function')`` use
    ``isinstance(pyobject, AbstractFunction)``.

    You can use `AbstractClass` for classes, `AbstractFunction` for
    functions, and `AbstractModule` for modules.  You can also use
    `PyFunction` and `PyClass` for testing if an object is
    defined somewhere and rope can access its source.  These classes
    provide more methods.

    )r   r>   )r   s    r   get_base_typerG   T   s    " ""4((r   c                  |    t         j                  t        t        d            t         _        t         j                  S )a  Return a pyobject whose type is unknown

    Note that two unknown objects are equal.  So for example you can
    write::

      if pyname.get_object() == get_unknown():
          print('cannot determine what this pyname holds')

    Rope could have used `None` for indicating unknown objects but
    we had to check that in many places.  So actually this method
    returns a null object.

    r;   )r   rB   rG   r   r   r   get_unknownrI   h   s.      $]9%=>r   c                   0     e Zd Z fdZd Zd Zd Z xZS )AbstractClassc                 6    t         |   t        d             y )Nr8   r1   r   rG   r3   s    r   r   zAbstractClass.__init__|   s    v./r   c                      y r
   r   r   s    r   get_namezAbstractClass.get_name       r   c                      y r
   r   r   s    r   get_doczAbstractClass.get_doc   rP   r   c                     g S r
   r   r   s    r   get_superclasseszAbstractClass.get_superclasses       	r   )r?   r@   rA   r   rO   rR   rT   rD   rE   s   @r   rK   rK   {   s    0r   rK   c                   8     e Zd Z fdZd Zd ZddZd Z xZS )AbstractFunctionc                 6    t         |   t        d             y )Nr:   rM   r3   s    r   r   zAbstractFunction.__init__   s    z23r   c                      y r
   r   r   s    r   rO   zAbstractFunction.get_name   rP   r   c                      y r
   r   r   s    r   rR   zAbstractFunction.get_doc   rP   r   c                     g S r
   r   )r   special_argss     r   get_param_namesz AbstractFunction.get_param_names   rU   r   c                     t               S r
   )rI   )r   argss     r   get_returned_objectz$AbstractFunction.get_returned_object   s
    }r   )T)	r?   r@   rA   r   rO   rR   r]   r`   rD   rE   s   @r   rW   rW      s    4r   rW   c                   ,     e Zd Zd fd	Zd Zd Z xZS )AbstractModulec                 6    t         |   t        d             y )Nr9   rM   )r   docr(   s     r   r   zAbstractModule.__init__   s    x01r   c                      y r
   r   r   s    r   rR   zAbstractModule.get_doc   rP   r   c                      y r
   r   r   s    r   get_resourcezAbstractModule.get_resource   rP   r   r
   )r?   r@   rA   r   rR   rg   rD   rE   s   @r   rb   rb      s    2r   rb   c                       e Zd ZdZd Zd Zed        ZdZ e	j                  d       d        Z e	j                  d       d	        Zd
 Zd Zd Zd Zd Zdee   fdZd Zd Zd Zd Zd Zy)PyDefinedObjectz7Python defined names that rope can access their sourcesc                     || _         || _        d | _        || _        d | _        | j                         j                         | _        | j                         j                         | _        d | _	        y r
   )
pycoreast_nodescopeparentstructural_attributesr   _get_concluded_dataconcluded_attributes
attributesdefineds)r   rk   rl   rn   s       r   r   zPyDefinedObject.__init__   s\     
%)"$(OO$5$I$I$K!//+??Ar   c           
          dj                  | j                  j                  | j                  j                  | j                  t        t        |                   S )Nz<{}.{} "{}" at {}>)formatr(   r@   r?   absolute_namehexidr   s    r   __repr__zPyDefinedObject.__repr__   sC    #**NN%%NN##4M	
 	
r   c                 v    | j                         }| j                         j                         |rd|z   z   S dz   S )Nz:: )rO   r   )r   obj_names     r   rv   zPyDefinedObject.absolute_name   s7    ==? ))+(thSSPRSSr   Nc                      i S r
   r   r   r   r   <lambda>zPyDefinedObject.<lambda>       R r   c                 \    | j                   | j                         | _         | j                   S r
   )ro   _create_structural_attributesr   s    r   _get_structural_attributesz*PyDefinedObject._get_structural_attributes   s+    %%-)-)K)K)MD&)))r   c                      i S r
   r   r   r   r   r~   zPyDefinedObject.<lambda>   r   r   c                     | j                   j                         9| j                          | j                   j                  | j	                                | j                   j                         S r
   )rq   getr   set_create_concluded_attributesr   s    r   _get_concluded_attributesz)PyDefinedObject._get_concluded_attributes   sU    $$((*2++-%%))$*K*K*MN((,,..r   c                    | j                   j                         St        | j                               }|j	                  | j                                | j                   j                  |       | j                   j                         S r
   )rr   r   dictr   updater   r   )r   results     r   r   zPyDefinedObject.get_attributes   sb    ?? ($88:;FMM$99;<OO'""$$r   c                     || j                         v r| j                         |   S || j                         v r| j                         |   S t        j                  d|z        r   )r   r   r   r   r   s     r   r   zPyDefinedObject.get_attribute   sc    42244224T::41133113D99//0H40OPPr   c                 \    | j                   | j                         | _         | j                   S r
   )rm   _create_scoper   s    r   	get_scopezPyDefinedObject.get_scope   s&    ::++-DJzzr   c                 T    | }|j                   |j                   }|j                   |S r
   )rn   )r   current_objects     r   r   zPyDefinedObject.get_module   s2    ##/+22N ##/r   c                      y r
   r   r   s    r   rO   zPyDefinedObject.get_name   r   r   returnc                 z   t        | j                         j                        dkD  r| j                         j                  d   }t        |t        j
                        r^t        |j                  t        j                        r:t        |j                  j                  t              r|j                  j                  S y )Nr   )	lenget_astbody
isinstancer   ExprvalueConstantstr)r   exprs     r   rR   zPyDefinedObject.get_doc   sx    t||~""#a'<<>&&q)D4*tzz3<<8tzz//5zz'''r   c                 R    | j                   | j                          | j                   S r
   )rs   r   r   s    r   _get_defined_objectsz$PyDefinedObject._get_defined_objects   s"    == ++-}}r   c                     | j                   i S | j                  | j                  |       }t        j                  | j                        D ]  }|j                  |        |j                  | _        |j                  S r
   )visitor_classrk   r   iter_child_nodesrl   visitrs   names)r   new_visitorchilds      r   r   z-PyDefinedObject._create_structural_attributes   sn    %I((d;))$--8 	%Ee$	%#,,   r   c                     i S r
   r   r   s    r   r   z,PyDefinedObject._create_concluded_attributes  rU   r   c                     | j                   S r
   )rl   r   s    r   r   zPyDefinedObject.get_ast      }}r   c                      y r
   r   r   s    r   r   zPyDefinedObject._create_scope	  rP   r   )r?   r@   rA   __doc__r   ry   propertyrv   r   r   prevent_recursionr   r   r   r   r   r   rO   r   r   rR   r   r   r   r   r   r   r   r   ri   ri      s    A
 T T MUZ(* )*
 UZ(/ )/%Q
	# 	
!r   ri   c                       e Zd Zy)
PyFunctionNr?   r@   rA   r   r   r   r   r         r   r   c                       e Zd Z	 d Zy)PyComprehensionc                      y)Nz<comprehension>r   r   s    r   rO   zPyComprehension.get_name  s     r   N)r?   r@   rA   rO   r   r   r   r   r     s
    !r   r   c                       e Zd Zy)PyClassNr   r   r   r   r   r     r   r   r   c                   <    e Zd Zd Zd Zd Z eee      Zd Zd Z	y)_ConcludedDatac                     d | _         y r
   data_r   s    r   r   z_ConcludedData.__init__  	    
r   c                     || _         y r
   r   r   datas     r   r   z_ConcludedData.set   r   r   c                     | j                   S r
   r   r   s    r   r   z_ConcludedData.get#  s    zzr   c                     d | _         y r
   )r   r   s    r   _invalidatez_ConcludedData._invalidate(  s	    	r   c                 8    dt        | j                        z   dz   S )N<>)r   r   r   s    r   __str__z_ConcludedData.__str__+  s    S^#c))r   N)
r?   r@   rA   r   r   r   r   r   r   r   r   r   r   r   r     s)     CD*r   r   c                   :    e Zd Zd Zedefd       Zd Zd Zd Z	y)	_PyModulec                 z    || _         g | _        t        j                  |        t        j                  | ||d        y r
   )resourceconcluded_datarb   r   ri   )r   rk   rl   r   s       r   r   z_PyModule.__init__0  s3      %  vx>r   r   c                 "    | j                         S r
   )rO   r   s    r   rv   z_PyModule.absolute_name6  s    }}r   c                 P    t               }| j                  j                  |       |S r
   )r   r   append)r   new_datas     r   rp   z_PyModule._get_concluded_data:  s#    !#""8,r   c                 F    | j                   D ]  }|j                           y r
   )r   r   r   s     r   _forget_concluded_dataz _PyModule._forget_concluded_data?  s#    '' 	D	r   c                     | j                   S r
   )r   r   s    r   rg   z_PyModule.get_resourceC  r   r   N)
r?   r@   rA   r   r   r   rv   rp   r   rg   r   r   r   r   r   /  s1    ? s  
r   r   c                       e Zd Zy)PyModuleNr   r   r   r   r   r   G  r   r   r   c                       e Zd Zy)	PyPackageNr   r   r   r   r   r   K  r   r   r   c                       e Zd Zy)IsBeingInferredErrorNr   r   r   r   r   r   O  r   r   r   N)typingr   	rope.baser   r   r   r   rG   rI   rK   rW   rb   ri   r   r   r   r   r   r   r   	RopeErrorr   r   r   r   <module>r      s     , ,K% K%\)(&H x "X e eP	"2 	!ox !	o} 	* *& 0	y 			 		:// 	r   