a
    c_!                     @   s^  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mZ ddlZg d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rZddlZddlZeejd Z e ! Z"W d   n1 s0    Y  ee"ej#$ejd d dZ%e%& D ]$Z'e%(e'Z)e*e)e)+ e),  q4dS )z2Interface to the compiler's internal symbol tables    N)USE
DEF_GLOBALDEF_NONLOCAL	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   lib/python3.9/symtable.pyr      s    r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )SymbolTableFactoryc                 C   s   t  | _d S r   )weakref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 r   )typer   TYPE_FUNCTIONr   
TYPE_CLASSr   r   )r#   tabler   r   r   r   new   s
    

zSymbolTableFactory.newc                 C   s8   ||f}| j |d }|d u r4| || }| j |< |S r   )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S )r   c                 C   s   || _ || _i | _d S r   )_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.   r1   nameformatr2   )r#   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v sTJ d| j jd S )NmoduleZfunctionclass)         zunexpected type: {0})r1   r%   r   ZTYPE_MODULEr&   r'   r8   r"   r   r   r   get_type9   s    zSymbolTable.get_typec                 C   s   | j jS r   )r1   idr"   r   r   r   get_idC   s    zSymbolTable.get_idc                 C   s   | j jS r   )r1   r7   r"   r   r   r   get_nameF   s    zSymbolTable.get_namec                 C   s   | j jS r   )r1   linenor"   r   r   r   
get_linenoI   s    zSymbolTable.get_linenoc                 C   s   t | jjtjkS r   )boolr1   r%   r   r&   r"   r   r   r   is_optimizedL   s    zSymbolTable.is_optimizedc                 C   s   t | jjS r   )rF   r1   nestedr"   r   r   r   	is_nestedO   s    zSymbolTable.is_nestedc                 C   s   t | jjS r   )rF   r1   childrenr"   r   r   r   has_childrenR   s    zSymbolTable.has_childrenc                 C   s   | j j S r   )r1   symbolskeysr"   r   r   r   get_identifiersU   s    zSymbolTable.get_identifiersc                 C   sD   | j |}|d u r@| jj| }| |}t||| }| j |< |S r   )r3   r*   r1   rL   _SymbolTable__check_childrenr   )r#   r7   Zsymflags
namespacesr   r   r   lookupX   s    
zSymbolTable.lookupc                    s    fdd   D S )Nc                    s   g | ]}  |qS r   )rR   .0identr"   r   r   
<listcomp>a       z+SymbolTable.get_symbols.<locals>.<listcomp>)rN   r"   r   r"   r   get_symbols`   s    zSymbolTable.get_symbolsc                    s    fddj jD S )Nc                    s"   g | ]}|j  krt|jqS r   )r7   r   r2   rT   str7   r#   r   r   rV   d   s   
z0SymbolTable.__check_children.<locals>.<listcomp>r1   rJ   )r#   r7   r   r[   r   Z__check_childrenc   s    zSymbolTable.__check_childrenc                    s    fdd j jD S )Nc                    s   g | ]}t | jqS r   )r   r2   rY   r"   r   r   rV   i   s   z,SymbolTable.get_children.<locals>.<listcomp>r\   r"   r   r"   r   get_childrenh   s    
zSymbolTable.get_childrenN)r.   r/   r0   r$   r:   r@   rB   rC   rE   rG   rI   rK   rN   rR   rX   rO   r]   r   r   r   r   r   %   s   
r   c                   @   sP   e Zd 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d ZdS )r   Nc                    s   t  fdd  D S )Nc                 3   s"   | ]} j j| r|V  qd S r   )r1   rL   rS   r#   Z	test_funcr   r   	<genexpr>w   s   z-Function.__idents_matching.<locals>.<genexpr>)tuplerN   r^   r   r^   r   Z__idents_matchingv   s    zFunction.__idents_matchingc                 C   s    | j d u r| dd | _ | j S )Nc                 S   s   | t @ S r   )r   xr   r   r   <lambda>|   rW   z)Function.get_parameters.<locals>.<lambda>)_Function__params_Function__idents_matchingr"   r   r   r   get_parametersz   s    
zFunction.get_parametersc                    s0   | j d u r*ttf  fdd}| || _ | j S )Nc                    s   | t ? t@  v S r   r
   r   ra   Zlocsr   r   rc      rW   z%Function.get_locals.<locals>.<lambda>)_Function__localsr   r   re   r#   testr   rh   r   
get_locals   s
    
zFunction.get_localsc                    s0   | j d u r*ttf  fdd}| || _ | j S )Nc                    s   | t ? t@  v S r   rg   ra   Zglobr   r   rc      rW   z&Function.get_globals.<locals>.<lambda>)_Function__globalsr   r   re   rj   r   rm   r   get_globals   s
    
zFunction.get_globalsc                 C   s    | j d u r| dd | _ | j S )Nc                 S   s   | t @ S r   )r   ra   r   r   r   rc      rW   z(Function.get_nonlocals.<locals>.<lambda>)_Function__nonlocalsre   r"   r   r   r   get_nonlocals   s    
zFunction.get_nonlocalsc                 C   s$   | j d u rdd }| || _ | j S )Nc                 S   s   | t ? t@ tkS r   )r
   r   r   ra   r   r   r   rc      rW   z$Function.get_frees.<locals>.<lambda>)_Function__freesre   )r#   is_freer   r   r   	get_frees   s    
zFunction.get_frees)r.   r/   r0   rd   ri   rr   rn   rp   re   rf   rl   ro   rq   rt   r   r   r   r   r   m   s   r   c                   @   s   e Zd ZdZdd ZdS )r   Nc                 C   s6   | j d u r0i }| jjD ]}d||j< qt|| _ | j S )Nr=   )_Class__methodsr1   rJ   r7   r`   )r#   drZ   r   r   r   get_methods   s    

zClass.get_methods)r.   r/   r0   ru   rw   r   r   r   r   r      s   r   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 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#   r7   rP   rQ   r   r   r   r$      s    zSymbol.__init__c                 C   s   d | jS )Nz<symbol {0!r}>)r8   rx   r"   r   r   r   r:      s    zSymbol.__repr__c                 C   s   | j S r   )rx   r"   r   r   r   rC      s    zSymbol.get_namec                 C   s   t | jtj@ S r   )rF   ry   r   r   r"   r   r   r   is_referenced   s    zSymbol.is_referencedc                 C   s   t | jt@ S r   )rF   ry   r   r"   r   r   r   is_parameter   s    zSymbol.is_parameterc                 C   s   t | jttfv S r   )rF   rz   r   r   r"   r   r   r   	is_global   s    zSymbol.is_globalc                 C   s   t | jt@ S r   )rF   ry   r   r"   r   r   r   is_nonlocal   s    zSymbol.is_nonlocalc                 C   s   t | jtkS r   )rF   rz   r   r"   r   r   r   is_declared_global   s    zSymbol.is_declared_globalc                 C   s   t | jttfv S r   )rF   rz   r   r   r"   r   r   r   is_local   s    zSymbol.is_localc                 C   s   t | jt@ S r   )rF   ry   r	   r"   r   r   r   is_annotated   s    zSymbol.is_annotatedc                 C   s   t | jtkS r   )rF   rz   r   r"   r   r   r   rs      s    zSymbol.is_freec                 C   s   t | jt@ S r   )rF   ry   r   r"   r   r   r   is_imported   s    zSymbol.is_importedc                 C   s   t | jt@ S r   )rF   ry   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.
        )rF   r{   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)r{   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.
        r=   z$name is bound to multiple namespacesr   )lenr{   
ValueErrorr"   r   r   r   get_namespace   s    zSymbol.get_namespace)N)r.   r/   r0   r$   r:   rC   r|   r}   r~   r   r   r   r   rs   r   r   r   r   r   r   r   r   r   r      s    
r   __main__r=   exec)-__doc__r   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modrN   rU   rR   infoprintr   r   r   r   r   r   <module>   s&   DH,F
(
