B
    Wa	ej              	   @   sN  d Z ddlZddlmZmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZ ddlZdddddgZd	d ZG d
d dZ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ZedkrJddlZddlZeejd Ze  Z!W dQ R X ee!ej"#ejd d dZ$x0e$% D ]$Z&e$'e&Z(e)e(e(* e(+  q"W dS )z2Interface to the compiler's internal symbol tables    N)USE
DEF_GLOBAL	DEF_LOCAL	DEF_PARAM
DEF_IMPORT	DEF_BOUND	DEF_ANNOT	SCOPE_OFF
SCOPE_MASKFREELOCALGLOBAL_IMPLICITGLOBAL_EXPLICITCELLsymtableSymbolTableClassFunctionSymbolc             C   s   t | ||}t||S )N)	_symtabler   _newSymbolTable)codefilenameZcompile_typetop r   /usr/lib/python3.7/symtable.pyr      s    c               @   s$   e Zd Zdd Zdd Zdd ZdS )SymbolTableFactoryc             C   s   t  | _d S )N)weakrefZWeakValueDictionary_SymbolTableFactory__memo)selfr   r   r   __init__   s    zSymbolTableFactory.__init__c             C   s6   |j tjkrt||S |j tjkr,t||S t||S )N)typer   TYPE_FUNCTIONr   
TYPE_CLASSr   r   )r   tabler   r   r   r   new   s
    

zSymbolTableFactory.newc             C   s8   ||f}| j |d }|d kr4| || }| j |< |S )N)r   getr%   )r   r$   r   keyobjr   r   r   __call__   s
    zSymbolTableFactory.__call__N)__name__
__module____qualname__r    r%   r)   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	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 ) r   c             C   s   || _ || _i | _d S )N)_table	_filename_symbols)r   Z	raw_tabler   r   r   r   r    '   s    zSymbolTable.__init__c             C   sN   | j tkrd}nd| j j }| jjdkr6d|| jS d|| jj| jS d S )N z%s globalz<{0}SymbolTable for module {1}>z<{0}SymbolTable for {1} in {2}>)	__class__r   r*   r-   nameformatr.   )r   Zkindr   r   r   __repr__,   s    
zSymbolTable.__repr__c             C   sX   | j jtjkrdS | j jtjkr$dS | j jtjkr6dS | j jdksTtd| j jd S )NmoduleZfunctionclass)         zunexpected type: {0})r-   r!   r   ZTYPE_MODULEr"   r#   AssertionErrorr4   )r   r   r   r   get_type9   s    zSymbolTable.get_typec             C   s   | j jS )N)r-   id)r   r   r   r   get_idC   s    zSymbolTable.get_idc             C   s   | j jS )N)r-   r3   )r   r   r   r   get_nameF   s    zSymbolTable.get_namec             C   s   | j jS )N)r-   lineno)r   r   r   r   
get_linenoI   s    zSymbolTable.get_linenoc             C   s   t | jjtjkS )N)boolr-   r!   r   r"   )r   r   r   r   is_optimizedL   s    zSymbolTable.is_optimizedc             C   s   t | jjS )N)rB   r-   nested)r   r   r   r   	is_nestedO   s    zSymbolTable.is_nestedc             C   s   t | jjS )N)rB   r-   children)r   r   r   r   has_childrenR   s    zSymbolTable.has_childrenc             C   s   dS )z7Return true if the scope uses exec.  Deprecated method.Fr   )r   r   r   r   has_execU   s    zSymbolTable.has_execc             C   s   | j j S )N)r-   symbolskeys)r   r   r   r   get_identifiersY   s    zSymbolTable.get_identifiersc             C   sD   | j |}|d kr@| jj| }| |}t||| }| j |< |S )N)r/   r&   r-   rI   _SymbolTable__check_childrenr   )r   r3   Zsymflags
namespacesr   r   r   lookup\   s    
zSymbolTable.lookupc                s    fdd   D S )Nc                s   g | ]}  |qS r   )rO   ).0ident)r   r   r   
<listcomp>e   s    z+SymbolTable.get_symbols.<locals>.<listcomp>)rK   )r   r   )r   r   get_symbolsd   s    zSymbolTable.get_symbolsc                s    fddj jD S )Nc                s"   g | ]}|j  krt|jqS r   )r3   r   r.   )rP   st)r3   r   r   r   rR   h   s   z0SymbolTable.__check_children.<locals>.<listcomp>)r-   rF   )r   r3   r   )r3   r   r   Z__check_childreng   s    zSymbolTable.__check_childrenc                s    fdd j jD S )Nc                s   g | ]}t | jqS r   )r   r.   )rP   rT   )r   r   r   rR   m   s   z,SymbolTable.get_children.<locals>.<listcomp>)r-   rF   )r   r   )r   r   get_childrenl   s    
zSymbolTable.get_childrenN)r*   r+   r,   r    r5   r<   r>   r?   rA   rC   rE   rG   rH   rK   rO   rS   rL   rU   r   r   r   r   r   %   s   
c               @   sD   e Zd ZdZdZdZdZdd Zdd Zdd Z	dd	 Z
d
d ZdS )r   Nc                s   t  fdd  D S )Nc             3   s"   | ]} j j| r|V  qd S )N)r-   rI   )rP   rQ   )r   	test_funcr   r   	<genexpr>z   s    z-Function.__idents_matching.<locals>.<genexpr>)tuplerK   )r   rV   r   )r   rV   r   Z__idents_matchingy   s    zFunction.__idents_matchingc             C   s    | j d kr| dd | _ | j S )Nc             S   s   | t @ S )N)r   )xr   r   r   <lambda>       z)Function.get_parameters.<locals>.<lambda>)_Function__params_Function__idents_matching)r   r   r   r   get_parameters}   s    
zFunction.get_parametersc                s0   | j d kr*ttf  fdd}| || _ | j S )Nc                s   | t ? t@  kS )N)r	   r
   )rY   )locsr   r   rZ      r[   z%Function.get_locals.<locals>.<lambda>)_Function__localsr   r   r]   )r   testr   )r_   r   
get_locals   s
    
zFunction.get_localsc                s0   | j d kr*ttf  fdd}| || _ | j S )Nc                s   | t ? t@  kS )N)r	   r
   )rY   )globr   r   rZ      r[   z&Function.get_globals.<locals>.<lambda>)_Function__globalsr   r   r]   )r   ra   r   )rc   r   get_globals   s
    
zFunction.get_globalsc             C   s$   | j d krdd }| || _ | j S )Nc             S   s   | t ? t@ tkS )N)r	   r
   r   )rY   r   r   r   rZ      r[   z$Function.get_frees.<locals>.<lambda>)_Function__freesr]   )r   is_freer   r   r   	get_frees   s    
zFunction.get_frees)r*   r+   r,   r\   r`   rf   rd   r]   r^   rb   re   rh   r   r   r   r   r   q   s   c               @   s   e Zd ZdZdd ZdS )r   Nc             C   s:   | j d kr4i }x| jjD ]}d||j< qW t|| _ | j S )Nr8   )_Class__methodsr-   rF   r3   rX   )r   drT   r   r   r   get_methods   s    

zClass.get_methods)r*   r+   r,   ri   rk   r   r   r   r   r      s   c               @   s   e Zd Z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d Zdd Zdd Zdd ZdS )!r   Nc             C   s(   || _ || _|t? t@ | _|p d| _d S )Nr   )_Symbol__name_Symbol__flagsr	   r
   _Symbol__scope_Symbol__namespaces)r   r3   rM   rN   r   r   r   r       s    zSymbol.__init__c             C   s   d | jS )Nz<symbol {0!r}>)r4   rl   )r   r   r   r   r5      s    zSymbol.__repr__c             C   s   | j S )N)rl   )r   r   r   r   r?      s    zSymbol.get_namec             C   s   t | jtj@ S )N)rB   rm   r   r   )r   r   r   r   is_referenced   s    zSymbol.is_referencedc             C   s   t | jt@ S )N)rB   rm   r   )r   r   r   r   is_parameter   s    zSymbol.is_parameterc             C   s   t | jttfkS )N)rB   rn   r   r   )r   r   r   r   	is_global   s    zSymbol.is_globalc             C   s   t | jtkS )N)rB   rn   r   )r   r   r   r   is_declared_global   s    zSymbol.is_declared_globalc             C   s   t | jt@ S )N)rB   rm   r   )r   r   r   r   is_local   s    zSymbol.is_localc             C   s   t | jt@ S )N)rB   rm   r   )r   r   r   r   is_annotated   s    zSymbol.is_annotatedc             C   s   t | jtkS )N)rB   rn   r   )r   r   r   r   rg      s    zSymbol.is_freec             C   s   t | jt@ S )N)rB   rm   r   )r   r   r   r   is_imported   s    zSymbol.is_importedc             C   s   t | jt@ S )N)rB   rm   r   )r   r   r   r   is_assigned   s    zSymbol.is_assignedc             C   s
   t | jS )a  Returns true if name binding introduces new namespace.

        If the name is used as the target of a function or class
        statement, this will be true.

        Note that a single name can be bound to multiple objects.  If
        is_namespace() is true, the name may also be bound to other
        objects, like an int or list, that does not introduce a new
        namespace.
        )rB   ro   )r   r   r   r   is_namespace   s    zSymbol.is_namespacec             C   s   | j S )z.Return a list of namespaces bound to this name)ro   )r   r   r   r   get_namespaces   s    zSymbol.get_namespacesc             C   s    t | jdkrtd| jd S )zReturns the single namespace bound to this name.

        Raises ValueError if the name is bound to multiple namespaces.
        r8   z$name is bound to multiple namespacesr   )lenro   
ValueError)r   r   r   r   get_namespace   s    zSymbol.get_namespace)N)r*   r+   r,   r    r5   r?   rp   rq   rr   rs   rt   ru   rg   rv   rw   rx   ry   r|   r   r   r   r   r      s   
__main__r8   exec),__doc__r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   __all__r   r   r   objectr   r   r   r   r*   ossysopenargvfreadsrcpathsplitmodrK   rQ   rO   infoprintrt   rx   r   r   r   r   <module>   s&   @L&C

