B
    A!p\^                 @   s   d Z ddlmZ ddlZddlZddlZdZdd Zdd Ze	d	Z
e	d
Ze	dZdd Ze	dZe	dZdd Zdd Zdd Zdd ZdZdZdZdZdee e eee dZeeeddZG dd dZG d d! d!ZG d"d# d#eZdS )$z9
generic classes/functions for pyreverse core/extensions
    )print_functionNz.pyreversercc              C   sR   g } t jdd}|rNt j|t}yt|  } W n t	k
rL   Y nX | S )z5
    Read config file and return list of options
    HOME )
osenvirongetpathjoinRCFILEopenreadsplitIOError)optionshomeZrcfile r   5lib/python3.7/site-packages/pylint/pyreverse/utils.pyget_default_options   s    r   c              C   s.   t  } |   x| D ]}tjd| qW dS )z'insert default options to sys.argv
       N)r   reversesysargvinsert)r   argr   r   r   insert_default_options*   s    
r   z^__[A-Za-z0-9]+[A-Za-z0-9_]*__$z^__[_A-Za-z0-9]*[A-Za-z0-9]+_?$z^_[_A-Za-z0-9]*$c             C   s8   t | rd}n$t| r d}nt| r0d}nd}|S )zMreturn the visibility from a name: public, protected, private or special
    specialprivate	protectedpublic)SPECIALmatchPRIVATE	PROTECTED)name
visibilityr   r   r   get_visibility:   s    


r%   z^.*Abstract.*z	^[A-Z_]*$c             C   s   t | jS )zWreturn true if the given class node correspond to an abstract class
    definition
    )ABSTRACTr    r#   )noder   r   r   is_abstractM   s    r(   c             C   s   t | jS )zTreturn true if the given class/function node correspond to final
    definition
    )FINALr    r#   )r'   r   r   r   is_finalT   s    r*   c             C   s
   | j dkS )NZ	interface)type)r'   r   r   r   is_interface[   s    r,   c             C   s
   | j dkS )NZ	exception)r+   )r'   r   r   r   is_exception`   s    r-   r            )ZALLZPUB_ONLYr   ZOTHER)r   r   r   r   c               @   s    e Zd ZdZdd Zdd ZdS )FilterMixInz;filter nodes according to a mode and nodes' visibility
    c             C   sh   d}xX| dD ]J}y|t| 7 }W q tk
rX } ztd| tjd W dd}~X Y qX qW || _dS )zinit filter modesr   +zUnknown filter mode %s)fileN)r   MODESKeyErrorprintr   stderr_FilterMixIn__mode)selfmoder8   Znummodexr   r   r   __init__}   s    (zFilterMixIn.__init__c             C   s    t t|d|}| jt| @  S )z2return true if the node should be treated
        r#   )r%   getattrr8   VIS_MOD)r9   r'   r$   r   r   r   	show_attr   s    zFilterMixIn.show_attrN)__name__
__module____qualname____doc__r<   r?   r   r   r   r   r1   y   s   
r1   c               @   s:   e Zd ZdZdd ZdddZdd Zd	d
 Zdd ZdS )	ASTWalkera  a walker visiting a tree in preorder, calling on the handler:

    * visit_<class name> on entering a node, where class name is the class of
    the node in lower case

    * leave_<class name> on leaving a node, where class name is the class of
    the node in lower case
    c             C   s   || _ i | _d S )N)handler_cache)r9   rE   r   r   r   r<      s    zASTWalker.__init__Nc             C   s   |dkrt  }||kr*tt|||jf|| | | x(| D ]}||k	sXt| || qHW | | |j|k	stdS )z<walk on the tree from <node>, getting callbacks from handlerN)	setAssertionErroridparentaddvisitZget_childrenwalkleave)r9   r'   Z_doneZ
child_noder   r   r   rM      s    


zASTWalker.walkc             C   sz   |j }| j|}|dkrj| j}|j }t|d| t|dd}t|d| t|dd}||f| j|< n|\}}||fS )z/get callbacks from handler for the visited nodeNzvisit_%sZvisit_defaultzleave_%sZleave_default)	__class__rF   r   rE   r@   lowerr=   )r9   r'   klassmethodsrE   ZkidZe_methodZl_methodr   r   r   get_callbacks   s    
zASTWalker.get_callbacksc             C   s"   |  |d }|dk	r|| dS )z<walk on the tree from <node>, getting callbacks from handlerr   N)rS   )r9   r'   methodr   r   r   rL      s    zASTWalker.visitc             C   s"   |  |d }|dk	r|| dS )z<walk on the tree from <node>, getting callbacks from handlerr   N)rS   )r9   r'   rT   r   r   r   rN      s    zASTWalker.leave)N)	r@   rA   rB   rC   r<   rM   rS   rL   rN   r   r   r   r   rD      s   
rD   c               @   s    e Zd ZdZdd Zdd ZdS )LocalsVisitorz3visit a project by traversing the locals dictionaryc             C   s   t | |  i | _d S )N)rD   r<   _visited)r9   r   r   r   r<      s    zLocalsVisitor.__init__c             C   s|   || j krdS d| j |< | |}|d dk	r:|d | t|dr`x| D ]}| | qNW |d dk	rx|d |S dS )z-launch the visit starting from the given nodeNr   r   locals)rV   rS   hasattrvaluesrL   )r9   r'   rR   Z
local_noder   r   r   rL      s    



zLocalsVisitor.visitN)r@   rA   rB   rC   r<   rL   r   r   r   r   rU      s   rU   )rC   Z
__future__r   r   rer   r
   r   r   compiler   r!   r"   r%   r&   r)   r(   r*   r,   r-   Z_CONSTRUCTORZ_SPECIALZ
_PROTECTEDZ_PRIVATEr4   r>   r1   rD   rU   r   r   r   r   <module>   s@   





;