B
    Z"                 @   s   d dl mZ d dlmZmZmZ G dd deZdd Zdd Z	G d	d
 d
eZ
G dd deZG dd deZG dd deZG dd deeZG dd dee
ZG dd deZG dd deeZG dd deZG dd deZG dd dejZdS )     )_decode_data)ast
exceptionsutilsc                   sx   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
 fddZdd ZdZdZedd Z  ZS )PyObjectc             C   s   |d kr| }|| _ d S )N)type)selfZtype_ r	   2lib/python3.7/site-packages/rope/base/pyobjects.py__init__   s    zPyObject.__init__c             C   s   | j | kri S | j  S )N)r   get_attributes)r   r	   r	   r
   r      s    
zPyObject.get_attributesc             C   s&   ||   krtd| |   | S )NzAttribute %s not found)r   r   AttributeNotFoundError)r   namer	   r	   r
   get_attribute   s    
zPyObject.get_attributec             C   s   | j S )N)r   )r   r	   r	   r
   get_type   s    zPyObject.get_typec             C   s
   |  |S )z"The same as ``get_attribute(key)``)r   )r   keyr	   r	   r
   __getitem__   s    zPyObject.__getitem__c             C   s   ||   kS )z,The same as ``key in self.get_attributes()``)r   )r   r   r	   r	   r
   __contains__   s    zPyObject.__contains__c             C   sF   | j |j krdS t| tkr>| | jk	r2| j|jkS | j|jkS | |kS )an  Check the equality of two `PyObject`\s

        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   objr	   r	   r
   __eq__"   s    

zPyObject.__eq__c             C   s   |  | S )N)r   )r   r   r	   r	   r
   __ne__5   s    zPyObject.__ne__c                s6   t | tkr$| | j kr$t| j d S tt|  S dS )zSee docs for `__eq__()` method   N)r   r   hashsuper__hash__)r   )r   r	   r
   r   8   s    zPyObject.__hash__c             C   s   t |  S )z+The same as ``iter(self.get_attributes())``)iterr   )r   r	   r	   r
   __iter__?   s    zPyObject.__iter__Nc             C   sV   t jd krLi 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   Z	base_typer	   r	   r
   _get_base_typeF   s    

zPyObject._get_base_type)__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r"   _unknownstaticmethodr#   __classcell__r	   r	   )r   r
   r      s   r   c             C   s
   t | 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   r	   r	   r
   get_base_typeR   s    r*   c               C   s   t jdkr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.

    Nr!   )r   r'   r*   r	   r	   r	   r
   get_unknownf   s    
r+   c                   s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	AbstractClassc                s   t t| td d S )Nr   )r   r,   r   r*   )r   )r   r	   r
   r   {   s    zAbstractClass.__init__c             C   s   d S )Nr	   )r   r	   r	   r
   get_name~   s    zAbstractClass.get_namec             C   s   d S )Nr	   )r   r	   r	   r
   get_doc   s    zAbstractClass.get_docc             C   s   g S )Nr	   )r   r	   r	   r
   get_superclasses   s    zAbstractClass.get_superclasses)r$   r%   r&   r   r-   r.   r/   r)   r	   r	   )r   r
   r,   y   s   r,   c                   s>   e Zd Z fddZdd Zdd Zddd	Zd
d Z  ZS )AbstractFunctionc                s   t t| td d S )Nr    )r   r0   r   r*   )r   )r   r	   r
   r      s    zAbstractFunction.__init__c             C   s   d S )Nr	   )r   r	   r	   r
   r-      s    zAbstractFunction.get_namec             C   s   d S )Nr	   )r   r	   r	   r
   r.      s    zAbstractFunction.get_docTc             C   s   g S )Nr	   )r   Zspecial_argsr	   r	   r
   get_param_names   s    z AbstractFunction.get_param_namesc             C   s   t  S )N)r+   )r   argsr	   r	   r
   get_returned_object   s    z$AbstractFunction.get_returned_object)T)	r$   r%   r&   r   r-   r.   r1   r3   r)   r	   r	   )r   r
   r0      s
   
r0   c                   s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	AbstractModuleNc                s   t t| td d S )Nr   )r   r4   r   r*   )r   doc)r   r	   r
   r      s    zAbstractModule.__init__c             C   s   d S )Nr	   )r   r	   r	   r
   r.      s    zAbstractModule.get_docc             C   s   d S )Nr	   )r   r	   r	   r
   get_resource   s    zAbstractModule.get_resource)N)r$   r%   r&   r   r.   r6   r)   r	   r	   )r   r
   r4      s   r4   c               @   s   e Zd ZdZdd ZdZedd dd Zed	d d
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS ) PyDefinedObjectz7Python defined names that rope can access their sourcesc             C   sD   || _ || _d | _|| _d | _|   | _|   | _d | _	d S )N)
pycoreast_nodescopeparentstructural_attributes
get_module_get_concluded_dataconcluded_attributes
attributesdefineds)r   r8   r9   r;   r	   r	   r
   r      s    zPyDefinedObject.__init__Nc               C   s   i S )Nr	   r	   r	   r	   r
   <lambda>   s    zPyDefinedObject.<lambda>c             C   s   | j d kr|  | _ | j S )N)r<   _create_structural_attributes)r   r	   r	   r
   _get_structural_attributes   s    

z*PyDefinedObject._get_structural_attributesc               C   s   i S )Nr	   r	   r	   r	   r
   rB      s    c             C   s0   | j  d kr&|   | j |   | j  S )N)r?   getrD   set_create_concluded_attributes)r   r	   r	   r
   _get_concluded_attributes   s    z)PyDefinedObject._get_concluded_attributesc             C   s>   | j  d kr4t|  }||   | j | | j  S )N)r@   rE   dictrH   updaterD   rF   )r   resultr	   r	   r
   r      s
    zPyDefinedObject.get_attributesc             C   sB   ||   kr|   | S ||  kr0|  | S td| d S )NzAttribute %s not found)rD   rH   r   r   )r   r   r	   r	   r
   r      s    zPyDefinedObject.get_attributec             C   s   | j d kr|  | _ | j S )N)r:   _create_scope)r   r	   r	   r
   	get_scope   s    

zPyDefinedObject.get_scopec             C   s   | }x|j d k	r|j }qW |S )N)r;   )r   Zcurrent_objectr	   r	   r
   r=      s    
zPyDefinedObject.get_modulec             C   sZ   t |  jdkrV|  jd }t|tjrVt|jtjrV|jj}| 	 j
}t||S d S )Nr   )lenget_astZbody
isinstancer   ZExprvalueZStrsr=   codingr   )r   exprZ	docstringrS   r	   r	   r
   r.      s    
zPyDefinedObject.get_docc             C   s   | j d kr|   | j S )N)rA   rD   )r   r	   r	   r
   _get_defined_objects   s    
z$PyDefinedObject._get_defined_objectsc             C   sL   | j d kri S |  | j| }x t| jD ]}t|| q*W |j| _|jS )N)visitor_classr8   r   Zget_child_nodesr9   walkrA   names)r   Znew_visitorZchildr	   r	   r
   rC      s    
z-PyDefinedObject._create_structural_attributesc             C   s   i S )Nr	   )r   r	   r	   r
   rG      s    z,PyDefinedObject._create_concluded_attributesc             C   s   | j S )N)r9   )r   r	   r	   r
   rO      s    zPyDefinedObject.get_astc             C   s   d S )Nr	   )r   r	   r	   r
   rL      s    zPyDefinedObject._create_scope)r$   r%   r&   __doc__r   rV   r   Zprevent_recursionrD   rH   r   r   rM   r=   r.   rU   rC   rG   rO   rL   r	   r	   r	   r
   r7      s   
		r7   c               @   s   e Zd ZdZdS )
PyFunctionzOnly a placeholderN)r$   r%   r&   rY   r	   r	   r	   r
   rZ      s   rZ   c               @   s   e Zd ZdZdS )PyClasszOnly a placeholderN)r$   r%   r&   rY   r	   r	   r	   r
   r[     s   r[   c               @   s>   e Zd Zdd Zdd Zdd ZeeeZdd Zd	d
 Z	dS )_ConcludedDatac             C   s
   d | _ d S )N)data_)r   r	   r	   r
   r     s    z_ConcludedData.__init__c             C   s
   || _ d S )N)r]   )r   datar	   r	   r
   rF   
  s    z_ConcludedData.setc             C   s   | j S )N)r]   )r   r	   r	   r
   rE     s    z_ConcludedData.getc             C   s
   d | _ d S )N)r^   )r   r	   r	   r
   _invalidate  s    z_ConcludedData._invalidatec             C   s   dt | j d S )N<>)strr^   )r   r	   r	   r
   __str__  s    z_ConcludedData.__str__N)
r$   r%   r&   r   rF   rE   propertyr^   r_   rc   r	   r	   r	   r
   r\     s   
r\   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
	_PyModulec             C   s*   || _ g | _t|  t| ||d  d S )N)resourceconcluded_datar4   r   r7   )r   r8   r9   rf   r	   r	   r
   r     s    
z_PyModule.__init__c             C   s   t  }| j| |S )N)r\   rg   append)r   Znew_datar	   r	   r
   r>   !  s    z_PyModule._get_concluded_datac             C   s   x| j D ]}|  qW d S )N)rg   r_   )r   r^   r	   r	   r
   _forget_concluded_data&  s    z _PyModule._forget_concluded_datac             C   s   | j S )N)rf   )r   r	   r	   r
   r6   *  s    z_PyModule.get_resourceN)r$   r%   r&   r   r>   ri   r6   r	   r	   r	   r
   re     s   re   c               @   s   e Zd ZdZdS )PyModulezOnly a placeholderN)r$   r%   r&   rY   r	   r	   r	   r
   rj   .  s   rj   c               @   s   e Zd ZdZdS )	PyPackagezOnly a placeholderN)r$   r%   r&   rY   r	   r	   r	   r
   rk   2  s   rk   c               @   s   e Zd ZdS )IsBeingInferredErrorN)r$   r%   r&   r	   r	   r	   r
   rl   6  s   rl   N)Zrope.base.fscommandsr   Z	rope.baser   r   r   objectr   r*   r+   r,   r0   r4   r7   rZ   r[   r\   re   rj   rk   Z	RopeErrorrl   r	   r	   r	   r
   <module>   s   MW