o
    ­‡a—‡  ã                	   @   sn  d dl mZmZ d dlmZ d dlZd dlZG dd„ deƒZ	G dd„ dej
ƒZG dd	„ d	eƒZi Zejjd
kr:eZnd dlZejZdd„ e ¡ D ƒZeed< eƒ eƒ ZZG dd„ dej
ƒZG dd„ dej
ƒZG dd„ deƒZedkr³d dlZG dd„ dej
ƒZejdd… pˆdZeD ])Zer“e eƒnej!Z"e #e" $¡ ¡Z%eee%ƒ W d  ƒ n1 s­w   Y  q‹dS dS )é    )ÚdefaultdictÚOrderedDict)ÚcontextmanagerNc                   @   sF   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S )Úordered_setNc                 C   s   t  |pg ¡| _d S ©N)r   ÚfromkeysÚvalues)ÚselfÚelements© r   ú1/usr/lib/python3/dist-packages/beniget/beniget.pyÚ__init__	   s   zordered_set.__init__c                 C   s   d | j |< d S r   ©r   ©r	   Úvaluer   r   r   Úadd   ó   zordered_set.addc                 C   s   | j  dd„ |D ƒ¡ d S )Nc                 s   s    | ]}|d fV  qd S r   r   )Ú.0Úkr   r   r   Ú	<genexpr>   ó   € z%ordered_set.update.<locals>.<genexpr>)r   Úupdate)r	   r   r   r   r   r      s   zordered_set.updatec                 C   s   t | j ¡ ƒS r   )Úiterr   Úkeys©r	   r   r   r   Ú__iter__   r   zordered_set.__iter__c                 C   s
   || j v S r   r   r   r   r   r   Ú__contains__   ó   
zordered_set.__contains__c                 C   s   | j  ¡ }| |j ¡ |S r   )r   Úcopyr   )r	   ÚotherÚoutr   r   r   Ú__add__   s   
zordered_set.__add__c                 C   s
   t | jƒS r   )Úlenr   r   r   r   r   Ú__len__   r   zordered_set.__len__r   )
Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r!   r#   r   r   r   r   r      s    
r   c                       sP   e Zd ZdZdd„ Z‡ fdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
‡  ZS )Ú	Ancestorsa0  
    Build the ancestor tree, that associates a node to the list of node visited
    from the root node (the Module) to the current node

    >>> import gast as ast
    >>> code = 'def foo(x): return x + 1'
    >>> module = ast.parse(code)

    >>> from beniget import Ancestors
    >>> ancestors = Ancestors()
    >>> ancestors.visit(module)

    >>> binop = module.body[0].body[0].value
    >>> for n in ancestors.parents(binop):
    ...    print(type(n))
    <class 'gast.gast.Module'>
    <class 'gast.gast.FunctionDef'>
    <class 'gast.gast.Return'>
    c                 C   s   t ƒ | _tƒ | _d S r   )ÚdictÚ_parentsÚlistÚ_currentr   r   r   r   r   6   s   zAncestors.__init__c                    s:   t | jƒ| j|< | j |¡ tt| ƒ |¡ | j ¡  d S r   )r*   r+   r)   ÚappendÚsuperr'   Úgeneric_visitÚpop©r	   Únode©Ú	__class__r   r   r.   :   s   zAncestors.generic_visitc                 C   s   | j | d S ©Néÿÿÿÿ©r)   r0   r   r   r   Úparent@   r   zAncestors.parentc                 C   s
   | j | S r   r6   r0   r   r   r   ÚparentsC   r   zAncestors.parentsc                 C   s6   t | j| ƒD ]}t||ƒr|  S qtd ||¡ƒ‚)Nz{} has no parent of type {})Úreversedr)   Ú
isinstanceÚ
ValueErrorÚformat)r	   r1   ÚclsÚnr   r   r   ÚparentInstanceF   s
   
ÿzAncestors.parentInstancec                 C   s   |   |tjtjf¡S r   )r?   ÚastÚFunctionDefÚAsyncFunctionDefr0   r   r   r   ÚparentFunctionL   s   
ÿzAncestors.parentFunctionc                 C   s   |   |tj¡S r   )r?   r@   Ústmtr0   r   r   r   Ú
parentStmtP   r   zAncestors.parentStmt)r$   r%   r&   Ú__doc__r   r.   r7   r8   r?   rC   rE   Ú__classcell__r   r   r2   r   r'   !   s    r'   c                   @   sT   e 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d„ Zdd„ ZdS )ÚDefzE
    Model a definition, either named or unnamed, and its users.
    )r1   Ú_usersc                 C   s   || _ tƒ | _d S r   )r1   r   rI   r0   r   r   r   r   [   s   zDef.__init__c                 C   s   t |tƒsJ ‚| j |¡ d S r   )r:   rH   rI   r   r0   r   r   r   Úadd_user_   s   zDef.add_userc                 C   s†   t | jtjtjtjfƒr| jjS t | jtjƒr| jjS t | jtj	ƒr2| jj 
dd¡d }| jjp1|S t | jtƒr=| jd S t| jƒjS )zv
        If the node associated to this Def has a name, returns this name.
        Otherwise returns its type
        Ú.é   r   )r:   r1   r@   ÚClassDefrA   rB   ÚnameÚNameÚidÚaliasÚsplitÚasnameÚtupleÚtyper$   )r	   Úbaser   r   r   rN   c   s   
þ
zDef.namec                 C   s   | j S )zL
        The list of ast entity that holds a reference to this node
        )rI   r   r   r   r   Úusersv   s   z	Def.usersc                 C   ó
   |   i ¡S r   )Ú_reprr   r   r   r   Ú__repr__|   r   zDef.__repr__c                    sF   | ˆ v rd  ˆ |  ¡S tˆ ƒˆ | < d  | jd ‡ fdd„| jD ƒ¡¡S )Nú(#{})ú
{} -> ({})ú, c                 3   ó    | ]
}|  ˆ  ¡ ¡V  qd S r   )rY   r   ©r   Úu©Únodesr   r   r   …   ó   € ÿzDef._repr.<locals>.<genexpr>)r<   r"   r1   ÚjoinrI   ©r	   rb   r   ra   r   rY      s   ÿÿz	Def._reprc                 C   rX   r   )Ú_strr   r   r   r   Ú__str__‰   r   zDef.__str__c                    sH   | ˆ v rd  ˆ |  ¡S tˆ ƒˆ | < d  |  ¡ d ‡ fdd„| jD ƒ¡¡S )Nr[   r\   r]   c                 3   r^   r   )rf   r   r_   ra   r   r   r   ’   rc   zDef._str.<locals>.<genexpr>)r<   r"   rN   rd   rI   re   r   ra   r   rf   Œ   s   ÿÿzDef._strN)r$   r%   r&   rF   Ú	__slots__r   rJ   rN   rW   rZ   rY   rg   rf   r   r   r   r   rH   T   s    
rH   é   c                 C   s   i | ]\}}||“qS r   r   ©r   r   Úvr   r   r   Ú
<dictcomp>    s    rl   Ú__file__c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚCollectGlobalsc                 C   s   t tƒ| _d S r   )r   r*   ÚGlobalsr   r   r   r   r   ¨   r   zCollectGlobals.__init__c                 C   s$   |j D ]}| j|  ||f¡ qd S r   )Únamesro   r,   ©r	   r1   rN   r   r   r   Úvisit_Global«   s   
ÿzCollectGlobals.visit_GlobalN)r$   r%   r&   r   rr   r   r   r   r   rn   §   s    rn   c                   @   sH  e Zd ZdZd‚dd„Zdƒdd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zedd„ ƒZdd„ Zefd d!„ZeZd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Z e Z!d6d7„ Z"d8d9„ Z#d:d;„ Z$e$Z%d<d=„ Z&d>d?„ Z'd@dA„ Z(dBdC„ Z)dDdE„ Z*dFdG„ Z+dHdI„ Z,dJdK„ Z-dLdM„ Z.dNdO„ Z/dPdQ„ Z0dRdS„ Z1efdTdU„Z2dVdW„ Z3dXdY„ Z4dZd[„ Z5d\d]„ Z6e6Z7d^d_„ Z8e6Z9d`da„ Z:dbdc„ Z;e:Z<ddde„ Z=dfdg„ Z>e:Z?dhdi„ Z@djdk„ ZAdldm„ ZBe:ZCdndo„ ZDe:ZEdpdq„ ZFdrds„ ZGdtdu„ ZHdvdw„ ZIeIZJdxdy„ ZKdzd{„ ZLd|d}„ ZMd~d„ ZNd€d„ ZOdS )„ÚDefUseChainsa|  
    Module visitor that gathers two kinds of informations:
        - locals: Dict[node, List[Def]], a mapping between a node and the list
          of variable defined in this node,
        - chains: Dict[node, Def], a mapping between nodes and their chains.

    >>> import gast as ast
    >>> module = ast.parse("from b import c, d; c()")
    >>> duc = DefUseChains()
    >>> duc.visit(module)
    >>> for head in duc.locals[module]:
    ...     print("{}: {}".format(head.name(), len(head.users())))
    c: 1
    d: 0
    >>> alias_def = duc.chains[module.body[0].names[0]]
    >>> print(alias_def)
    c -> (c -> (Call -> ()))
    Nc                 C   s^   i | _ ttƒ| _|| _dd„ t ¡ D ƒ| _g | _g | _	g | _
g | _g | _g | _g | _d| _dS )zN
            - filename: str, included in error messages if specified
        c                 S   s   i | ]	\}}|t |ƒ“qS r   )rH   rj   r   r   r   rl   Í   s    z)DefUseChains.__init__.<locals>.<dictcomp>r   N)Úchainsr   r*   ÚlocalsÚfilenameÚBuiltinsÚitemsÚ	_builtinsÚ_deferedÚ_definitionsÚ_promoted_localsÚ_undefsÚ_currentheadÚ_breaksÚ
_continuesÚdeadcode)r	   rv   r   r   r   r   Ä   s   

zDefUseChains.__init__Tc                    sX   t |tjƒr |s dd„ | j ¡ D ƒ‰ t‡ fdd„| j| D ƒƒS tdd„ | j| D ƒƒS )Nc                 S   s   h | ]}|’qS r   r   ©r   Údr   r   r   Ú	<setcomp>ê   s    z0DefUseChains.dump_definitions.<locals>.<setcomp>c                 3   s     | ]}|ˆ vr|  ¡ V  qd S r   ©rN   r‚   ©Úbuiltinsr   r   r   ë   s   € ÿz0DefUseChains.dump_definitions.<locals>.<genexpr>c                 s   ó    | ]}|  ¡ V  qd S r   r…   r‚   r   r   r   r   î   r   )r:   r@   ZModulery   r   Úsortedru   )r	   r1   Zignore_builtinsr   r†   r   Údump_definitionsè   s   ÿzDefUseChains.dump_definitionsc                 C   s&   g }| j | D ]	}| t|ƒ¡ q|S r   )ru   r,   Ústr)r	   r1   rt   rƒ   r   r   r   Údump_chainsð   s   zDefUseChains.dump_chainsc                 C   sP   t |dƒrd | jd u rdn| j¡}d ||j|j¡}nd}td ||¡ƒ d S )NÚlinenoz{}:z	<unknown>z at {}{}:{}Ú zW: unbound identifier '{}'{})Úhasattrr<   rv   r   Ú
col_offsetÚprint)r	   rN   r1   rv   Úlocationr   r   r   Úunbound_identifierö   s   
ÿþzDefUseChains.unbound_identifierc                 C   s(   t | jƒD ]}||v r||   S qg S r   )r9   r{   )r	   rN   rƒ   r   r   r   Úlookup_identifier  s
   ÿzDefUseChains.lookup_identifierc                 C   s²   |j }g }t| jƒD ]#}||v r"|s||   S |t|| ƒ   S d|v r-| |d ¡ q
| j |t|ƒ¡}| jrF| jd |  	||f¡ |rM||g S | jsV|  
||¡ |gS )NÚ*r5   )rP   r9   r{   r*   Úextendrt   Ú
setdefaultrH   r}   r,   r“   )r	   r1   rN   Ústarsrƒ   r   r   r   Údefs  s    $€
zDefUseChains.defsc                 C   s^   d}|D ]}t |tjtjtjfƒr|sd}|  jd7  _|  |¡ q|r-|  jd8  _d S d S )NFTrL   )r:   r@   ZBreakZContinueZRaiser   Úvisit)r	   Zstmtsr   rD   r   r   r   Úprocess_body  s   ÿzDefUseChains.process_bodyc                 C   s   | j d  ¡ D ]9\}}|| jd v r0| jd | D ]}|D ]\}}| ¡ D ]}| |¡ q%qqq|D ]\}}|s?|  ||j¡ q2q| j  ¡  d S r4   )r}   rx   r{   rW   rJ   r“   r1   r/   )r	   Z
undef_namer}   ZnewdefZundefÚ_Úuserr˜   r   r   r   Úprocess_undefs(  s   ÿÿÿ€þzDefUseChains.process_undefsc                 c   sT    | j  |¡ | j ttƒ¡ | j tƒ ¡ d V  | j ¡  | j ¡  | j  ¡  d S r   )r~   r,   r{   r   r   r|   Úsetr/   r0   r   r   r   ÚDefinitionContext5  s   €

zDefUseChains.DefinitionContextc                 c   sp    t jjdkr| j |¡ | j ttƒ¡ | j t	ƒ ¡ d V  t jjdkr6| j 
¡  | j 
¡  | j 
¡  d S d S )Né   )ÚsysÚversion_infoÚmajorr~   r,   r{   r   r   r|   rŸ   r/   r0   r   r   r   ÚCompDefinitionContext?  s   €

ýz"DefUseChains.CompDefinitionContextc                 C   sÔ  || _ |  |¡Î | jd  dd„ | j ¡ D ƒ¡ | j g ¡ |  |j	¡ t
ƒ }| |¡ |j ¡ D ]$}|D ]\}}|| jd vrUt||fƒ}|  ||¡ | j|  |¡ q6q2| jd D ]\}}t| d t|ƒj¡ƒ}	| j|}
| _|	|td |
| _q\| j ¡  	 tƒ }| j| D ]}| ¡ }|| jv rš| |¡ || jd v s¨J ||jfƒ‚qŠt| jd ƒ}t| jƒ}t|ƒ}tdd	„ | j| D ƒƒ}||| | ksÏJ ‚W d   ƒ n1 sÙw   Y  | jrãJ ‚| jrèJ ‚d S )
Nr5   c                 S   s   i | ]
\}}|t |fƒ“qS r   )r   rj   r   r   r   rl   Q  s    z-DefUseChains.visit_Module.<locals>.<dictcomp>zvisit_{})ÚstepTr   c                 S   s   h | ]}|  ¡ ’qS r   r…   r‚   r   r   r   r„   v  ó    z,DefUseChains.visit_Module.<locals>.<setcomp>)Úmoduler    r{   r   ry   rx   rz   r,   r›   Úbodyrn   rš   ro   r   rH   Úset_definitionru   Úgetattrr<   rU   r$   ÚDefinitionStepr/   rŸ   rN   r   r1   r"   )r	   r1   Zcgrb   r>   rN   ÚdnodeZfnodeÚctxZvisitorr™   Zoverloaded_builtinsrƒ   Znb_defsZnb_bltnsZnb_overloaded_bltnsZnb_headsr   r   r   Úvisit_ModuleL  sP   
ÿ
€üÿ



×
+zDefUseChains.visit_Modulec                 C   sB   | j rd S t|tƒrt|fƒ| jd |< d S t|ƒ| jd |< d S r4   )r   r:   rH   r   r{   ©r	   rN   Údnode_or_dnodesr   r   r   rª   |  s
   
zDefUseChains.set_definitionc                 C   s.   t |tƒr| |  |¡ d S | |  |¡ d S r   )r:   rH   r   r   )Z
definitionrN   r±   r   r   r   Úadd_to_definition„  s   
zDefUseChains.add_to_definitionc                 C   s"   | j rd S t | jd ||¡ d S r4   )r   rs   r²   r{   r°   r   r   r   Úextend_definition‹  s
   ÿzDefUseChains.extend_definitionc                 C   s:  |t u ri| j |t|ƒ¡}|  |j|¡ | j| jd   |¡ t	d |j
jƒD ]
}|  |¡ |¡ q&|j
jD ]
}|  |¡ |¡ q5|jD ]}|  |¡ qCt| jƒ}t| jd tjƒr]| ¡  | jd  ||f¡ d S |tu rš|jrv|  |j¡ |  |¡ |  |j
¡ |  |j¡ W d   ƒ d S 1 s“w   Y  d S tƒ ‚r4   )ÚDeclarationSteprt   r—   rH   rª   rN   ru   r~   r,   ÚfilterÚargsÚkw_defaultsrš   rJ   ÚdefaultsÚdecorator_listr*   r{   r:   r@   rM   r/   rz   r¬   Úreturnsr    r›   r©   ÚNotImplementedError)r	   r1   r¦   r­   Z
kw_defaultÚdefaultÚ	decoratorZdefinitionsr   r   r   Úvisit_FunctionDef‘  s,   

"þzDefUseChains.visit_FunctionDefc                 C   sØ   | j  |t|ƒ¡}| j| jd   |¡ |  |j|¡ |jD ]
}|  	|¡ 
|¡ q|jD ]}|  	|j¡ 
|¡ q,|jD ]
}|  	|¡ 
|¡ q;|  |¡ |  dtdƒ¡ |  |j¡ W d   ƒ d S 1 sew   Y  d S )Nr5   r3   )rt   r—   rH   ru   r~   r,   rª   rN   Úbasesrš   rJ   Úkeywordsr   r¹   r    r›   r©   )r	   r1   r­   rV   Úkeywordr½   r   r   r   Úvisit_ClassDef®  s   


"þzDefUseChains.visit_ClassDefc                 C   s   |j r|  |j ¡ d S d S r   )r   rš   r0   r   r   r   Úvisit_Return½  s   ÿzDefUseChains.visit_Returnc                 C   ó>   | j d  ¡ D ]\}}t | jd ||¡ q| j d  ¡  d S r4   )r{   rx   rs   r²   r   Úclear©r	   rœ   r   rk   r   r   r   Úvisit_BreakÁ  ó   zDefUseChains.visit_Breakc                 C   rÄ   r4   )r{   rx   rs   r²   r€   rÅ   rÆ   r   r   r   Úvisit_ContinueÆ  rÈ   zDefUseChains.visit_Continuec                 C   s   |j D ]}|  |¡ qd S r   )Útargetsrš   ©r	   r1   Útargetr   r   r   Úvisit_DeleteË  s   
ÿzDefUseChains.visit_Deletec                 C   s&   |   |j¡ |jD ]}|   |¡ q	d S r   )rš   r   rÊ   rË   r   r   r   Úvisit_AssignÏ  s   
ÿzDefUseChains.visit_Assignc                 C   sL   |j r	|  |j ¡}|  |j¡}|  |j¡}| |¡ |j r$| |¡ d S d S r   )r   rš   Ú
annotationrÌ   rJ   )r	   r1   ÚdvalueZdannotationÚdtargetr   r   r   Úvisit_AnnAssignÕ  s   
ÿzDefUseChains.visit_AnnAssignc                 C   sÖ   |   |j¡}t|jtjƒr`|jjt ¡ }|j_|   |j¡}| |¡ ||j_|jj	| j
d v r:|  |jj	|¡ d S dd„ |  |j¡D ƒ}|  |jj	|¡ d|v r^| j| jd   |¡ d S d S |   |j¡ |¡ d S )Nr5   c                 S   s   g | ]}|  ¡ ‘qS r   r…   r‚   r   r   r   Ú
<listcomp>è  r§   z0DefUseChains.visit_AugAssign.<locals>.<listcomp>r•   )rš   r   r:   rÌ   r@   rO   r®   ÚLoadrJ   rP   r|   r³   r™   rª   ru   r~   r,   )r	   r1   rÐ   r®   rÑ   Zloaded_fromr   r   r   Úvisit_AugAssignÞ  s   
ÿzDefUseChains.visit_AugAssignc                 C   s,   |j r	|  |j ¡ |jD ]}|  |¡ qd S r   )Údestrš   r   )r	   r1   r   r   r   r   Úvisit_Printñ  s
   
ÿzDefUseChains.visit_Printc                 C   s‚  |   |j¡ | j ttƒ¡ | j ttƒ¡ | j ttƒ¡ | j	 | j	d  
¡ ¡ |   |j¡ |  |j¡ |  ¡  | j ¡ }| ¡ D ]
\}}|  ||¡ qB| j ttƒ¡ |   |j¡ |  |j¡ | j	 ttƒ¡ |  |j¡ | j	 ¡ }| j ¡ }| j ¡ }| j	 ¡ }| ¡ D ]
\}}|  ||¡ q‡| ¡ D ]
\}}|  ||¡ q–| ¡ D ]
\}}|  ||¡ q¥| ¡ D ]
\}}|  ||¡ q´d S r4   )rš   r   r   r,   r   r   r€   r}   r*   r{   r   rÌ   r›   r©   rž   r/   rx   r³   Úorelse)r	   r1   Úcontinue_defsrƒ   r`   Úorelse_defsÚ
break_defsÚ	body_defsr   r   r   Ú	visit_For÷  s:   




ÿzDefUseChains.visit_Forc                 C   s´  | j  | j d  ¡ ¡ | j ttƒ¡ | j ttƒ¡ | j ttƒ¡ |  	|j
¡ | j  ¡  | j  | j d  ¡ ¡ |  |j¡ |  	|j¡ |  ¡  | j ¡ }| ¡ D ]
\}}|  ||¡ qR| j ttƒ¡ |  |j¡ |  	|j¡ |  |j¡ | j  | j d  ¡ ¡ |  	|j
¡ | j  ¡ }| j  ¡ }| j ¡ }| j ¡ }| ¡ D ]
\}}|  ||¡ q | ¡ D ]
\}}|  ||¡ q¯| ¡ D ]
\}}|  ||¡ q¾| ¡ D ]
\}}|  ||¡ qÍd S r4   )r{   r,   r   r}   r   r*   r   r   r€   r›   rØ   r/   rš   Útestr©   rž   rx   r³   )r	   r1   rÙ   rƒ   r`   rÚ   rÜ   rÛ   r   r   r   Úvisit_While$  s@   





ÿzDefUseChains.visit_Whilec                 C   sÈ   |   |j¡ | j | jd  ¡ ¡ |  |j¡ | j ¡ }| j | jd  ¡ ¡ |  |j¡ | j ¡ }|D ]}||v rG|  	||| ||  ¡ q4|  
||| ¡ q4|D ]}||v rYqR|  
||| ¡ qRd S r4   )rš   rÞ   r{   r,   r   r›   r©   r/   rØ   rª   r³   )r	   r1   rÜ   rÚ   rƒ   r   r   r   Úvisit_IfV  s    

üzDefUseChains.visit_Ifc                 C   s&   |j D ]}|  |¡ q|  |j¡ d S r   )rx   rš   r›   r©   )r	   r1   Zwithitemr   r   r   Ú
visit_Withm  s   
zDefUseChains.visit_Withc                 C   s,   |j r	|  |j ¡ |jr|  |j¡ d S d S r   )Úexcrš   Úcauser0   r   r   r   Úvisit_Raiset  s
   ÿzDefUseChains.visit_Raisec                 C   s¬   | j  | j d  ¡ ¡ |  |j¡ |  |j¡ | j  ¡ }|D ]
}|  ||| ¡ q|jD ]!}| j  t	t
ƒ¡ |  |¡ | j  ¡ }|D ]
}|  ||| ¡ qBq,|  |j¡ d S r4   )r{   r,   r   r›   r©   rØ   r/   r³   Úhandlersr   r   rš   Ú	finalbody)r	   r1   Zfailsafe_defsrƒ   ZexcepthandlerZhandler_defZhdr   r   r   Ú	visit_Tryz  s   



ÿzDefUseChains.visit_Tryc                 C   s&   |   |j¡ |jr|   |j¡ d S d S r   )rš   rÞ   Úmsgr0   r   r   r   Úvisit_Assert  s   ÿzDefUseChains.visit_Assertc                 C   s\   |j D ](}| j |t|ƒ¡}|j dd¡d }|  |jp||¡ | j| j	d   
|¡ qd S )NrK   rL   r   r5   )rp   rt   r—   rH   rN   rR   rª   rS   ru   r~   r,   )r	   r1   rQ   ÚdaliasrV   r   r   r   Úvisit_Import’  s   
üzDefUseChains.visit_Importc                 C   sL   |j D ] }| j |t|ƒ¡}|  |jp|j|¡ | j| jd   	|¡ qd S r4   )
rp   rt   r—   rH   rª   rS   rN   ru   r~   r,   )r	   r1   rQ   rê   r   r   r   Úvisit_ImportFrom™  s
   
ýzDefUseChains.visit_ImportFromc                 C   sÔ   | j  |t|ƒ¡}|  |j¡ |jr|  |j¡ n| jd  ¡ D ]}|D ]}| |¡ q$q |j	r7|  |j	¡ n+t
ƒ }t| jdd … ƒD ]}| ¡ D ]\}}||vr`| |¡ |D ]}| |¡ qXqIqC|  d|¡ d S )Nr   rL   r•   )rt   r—   rH   rš   r©   Úglobalsr{   r   rJ   ru   rŸ   r9   rx   r   r³   )r	   r1   r­   r™   rƒ   Zvisible_localsr{   Zdnamer   r   r   Ú
visit_ExecŸ  s(   ÿ
€üzDefUseChains.visit_Execc                 C   s    |j D ]
}| jd  |¡ qd S r4   )rp   r|   r   rq   r   r   r   rr   ¹  s   
ÿzDefUseChains.visit_Globalc                 C   sP   |j D ]"}t| jd d… ƒD ]}||vrq|  ||| ¡  n|  ||¡ qd S r4   )rp   r9   r{   rª   r“   )r	   r1   rN   rƒ   r   r   r   Úvisit_Nonlocal½  s   
€÷zDefUseChains.visit_Nonlocalc                 C   s   |   |¡ d S r   )r.   r0   r   r   r   Ú
visit_ExprÉ  r   zDefUseChains.visit_Exprc                 C   ó2   | j  |t|ƒ¡}|jD ]
}|  |¡ |¡ q|S r   ©rt   r—   rH   r   rš   rJ   ©r	   r1   r­   r   r   r   r   Úvisit_BoolOpÍ  ó   
zDefUseChains.visit_BoolOpc                 C   ó:   | j  |t|ƒ¡}|  |j¡ |¡ |  |j¡ |¡ |S r   )rt   r—   rH   rš   ÚleftrJ   Úright©r	   r1   r­   r   r   r   Úvisit_BinOpÓ  ó   zDefUseChains.visit_BinOpc                 C   ó(   | j  |t|ƒ¡}|  |j¡ |¡ |S r   )rt   r—   rH   rš   ÚoperandrJ   rù   r   r   r   Úvisit_UnaryOpÙ  ó   zDefUseChains.visit_UnaryOpc                 C   sž   |t u r| j |t|ƒ¡}| jd  |t| jƒf¡ |S |tu rL| j| }|  	|¡ |  
|j¡ |  
|j¡ |¡ W d   ƒ |S 1 sEw   Y  |S tƒ ‚r4   )r´   rt   r—   rH   rz   r,   r*   r{   r¬   r    rš   r¶   r©   rJ   r»   )r	   r1   r¦   r­   r   r   r   Úvisit_LambdaÞ  s   

þýzDefUseChains.visit_Lambdac                 C   sL   | j  |t|ƒ¡}|  |j¡ |¡ |  |j¡ |¡ |  |j¡ |¡ |S r   )rt   r—   rH   rš   rÞ   rJ   r©   rØ   rù   r   r   r   Úvisit_IfExpì  s
   zDefUseChains.visit_IfExpc                 C   sT   | j  |t|ƒ¡}td |jƒD ]
}|  |¡ |¡ q|jD ]
}|  |¡ |¡ q|S r   )rt   r—   rH   rµ   r   rš   rJ   r   )r	   r1   r­   Úkeyr   r   r   r   Ú
visit_Dictó  s   
zDefUseChains.visit_Dictc                 C   rñ   r   )rt   r—   rH   Úeltsrš   rJ   ©r	   r1   r­   Úeltr   r   r   Ú	visit_Setû  rõ   zDefUseChains.visit_Setc                 C   sp   | j  |t|ƒ¡}|  |¡  |jD ]
}|  |¡ |¡ q|  |j¡ |¡ W d   ƒ |S 1 s1w   Y  |S r   )rt   r—   rH   r¥   Ú
generatorsrš   rJ   r  ©r	   r1   r­   Zcomprehensionr   r   r   Úvisit_ListComp  s   

ýûzDefUseChains.visit_ListCompc                 C   s‚   | j  |t|ƒ¡}|  |¡) |jD ]
}|  |¡ |¡ q|  |j¡ |¡ |  |j¡ |¡ W d   ƒ |S 1 s:w   Y  |S r   )	rt   r—   rH   r¥   r  rš   rJ   r  r   r	  r   r   r   Úvisit_DictComp  s   

üúzDefUseChains.visit_DictCompc                 C   rü   r   )rt   r—   rH   rš   r   rJ   rù   r   r   r   Úvisit_Await  rÿ   zDefUseChains.visit_Awaitc                 C   s.   | j  |t|ƒ¡}|jr|  |j¡ |¡ |S r   )rt   r—   rH   r   rš   rJ   rù   r   r   r   Úvisit_Yield  s   zDefUseChains.visit_Yieldc                 C   sD   | j  |t|ƒ¡}|  |j¡ |¡ |jD ]
}|  |¡ |¡ q|S r   )rt   r—   rH   rš   r÷   rJ   Úcomparators)r	   r1   r­   Úexprr   r   r   Úvisit_Compare'  s
   
zDefUseChains.visit_Comparec                 C   sb   | j  |t|ƒ¡}|  |j¡ |¡ |jD ]
}|  |¡ |¡ q|jD ]}|  |j¡ |¡ q#|S r   )	rt   r—   rH   rš   ÚfuncrJ   r¶   rÀ   r   )r	   r1   r­   ÚargÚkwr   r   r   Ú
visit_Call.  s   

zDefUseChains.visit_Callc                 C   s   | j  |t|ƒ¡}|S r   )rt   r—   rH   rù   r   r   r   Úvisit_Constant9  s   zDefUseChains.visit_Constantc                 C   s@   | j  |t|ƒ¡}|  |j¡ |¡ |jr|  |j¡ |¡ |S r   )rt   r—   rH   rš   r   rJ   Úformat_specrù   r   r   r   Úvisit_FormattedValue=  s
   z!DefUseChains.visit_FormattedValuec                 C   rñ   r   rò   ró   r   r   r   Úvisit_JoinedStrD  rõ   zDefUseChains.visit_JoinedStrc                 C   rö   r   )rt   r—   rH   rš   r   rJ   Úslicerù   r   r   r   Úvisit_SubscriptL  rû   zDefUseChains.visit_Subscriptc                 C   s4   | j  |t|ƒ¡}|  |j¡ |¡ |  |j¡ |S r   )rt   r—   rH   rš   r   rJ   rÌ   rù   r   r   r   Úvisit_NamedExprT  s   zDefUseChains.visit_NamedExprc                 C   s"  t |jtjtjfƒr]| j |t|ƒ¡}|j| j	d v r4|  
|j|¡ || j| j vr3| j| j  |¡ n|  |j|¡ || j| jd  vrP| j| jd   |¡ |jd ur[|  |j¡ |S t |jtjtjfƒrŽ|| jv }|rt| j| }nt|ƒ}|  |¡D ]}| |¡ q}|sŒ|| j|< |S tƒ ‚r4   )r:   r®   r@   ZParamÚStorert   r—   rH   rP   r|   r³   ru   r¨   r,   rª   r~   rÏ   rš   rÔ   ZDelr™   rJ   r»   )r	   r1   r­   Znode_in_chainsrƒ   r   r   r   Ú
visit_NameZ  s0   €
ó

ÿzDefUseChains.visit_Namec                 C   s’   | j  |t|ƒ¡}t ¡ }|jD ]6}t|tjƒr,|j|}|_|  	|¡ |j|}|_qt|tj
ƒr8|  	|¡ qt|tjtjfƒrF|  |¡ q|S r   )rt   r—   rH   r@   r  r  r:   rO   r®   rš   Z	SubscriptZListZTupleÚvisit_Destructured)r	   r1   r­   Z	tmp_storer  r   r   r   r  y  s   


€zDefUseChains.visit_Destructuredc                 C   s\   t |jtjƒr | j |t|ƒ¡}|jD ]
}|  |¡ 	|¡ q|S t |jtj
ƒr,|  |¡S d S r   )r:   r®   r@   rÔ   rt   r—   rH   r  rš   rJ   r  r  r  r   r   r   Ú
visit_List‡  s   

ÿzDefUseChains.visit_Listc                 C   s^   | j  |t|ƒ¡}|jr|  |j¡ |¡ |jr!|  |j¡ |¡ |jr-|  |j¡ |¡ |S r   )rt   r—   rH   Úlowerrš   rJ   Úupperr¦   rù   r   r   r   Úvisit_Slice–  s   zDefUseChains.visit_Slicec                 C   sP   | j  |t|ƒ¡}|  |j¡ |¡ |  |j¡ |jD ]
}|  |¡ |¡ q|S r   )rt   r—   rH   rš   r   rJ   rÌ   Úifs)r	   r1   r­   Zif_r   r   r   Úvisit_comprehension¢  s   
z DefUseChains.visit_comprehensionc                 C   sR   | j  |t|ƒ¡}|jr|  |j¡ |¡ |jr!|  |j¡ |¡ |  |j¡ |S r   )	rt   r—   rH   rU   rš   rJ   rN   r›   r©   rù   r   r   r   Úvisit_excepthandlerª  s   z DefUseChains.visit_excepthandlerc                 C   sn   |j D ]}|  |¡ q|jD ]}|  |¡ q|jr|  |j¡ |jD ]}|  |¡ q"|jr5|  |j¡ d S d S r   )r¶   rš   ÚposonlyargsÚvarargÚ
kwonlyargsÚkwarg)r	   r1   r  r   r   r   Úvisit_arguments³  s   


ÿzDefUseChains.visit_argumentsc                 C   s:   | j  |t|ƒ¡}|  |j¡ |¡ |jr|  |j¡ |S r   )rt   r—   rH   rš   Úcontext_exprrJ   Úoptional_varsrù   r   r   r   Úvisit_withitemÂ  s
   zDefUseChains.visit_withitemr   )T)Pr$   r%   r&   rF   r   rŠ   rŒ   r“   r”   r™   r›   rž   r   r    r¥   r¯   rª   Ústaticmethodr²   r³   r´   r¾   Zvisit_AsyncFunctionDefrÂ   rÃ   rÇ   rÉ   rÍ   rÎ   rÒ   rÕ   r×   rÝ   Zvisit_AsyncForrß   rà   rá   Zvisit_AsyncWithrä   rç   ré   rë   rì   rî   rr   rï   rð   rô   rú   rþ   r   r  r  r  r
  Zvisit_SetCompr  Zvisit_GeneratorExpr  r  Zvisit_YieldFromr  r  Z
visit_Reprr  r  r  Zvisit_Attributer  Zvisit_Starredr  r  r  r  Zvisit_Tupler"  r$  r%  r*  r-  r   r   r   r   rs   °   sœ    

$
	
0
	+2
		rs   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚUseDefChainszÖ
    DefUseChains adaptor that builds a mapping between each user
    and the Def that defines this user:
        - chains: Dict[node, List[Def]], a mapping between nodes and the Defs
          that define it.
    c                 C   s   i | _ |j  ¡ D ]#}t|jtjƒr| j  |jg ¡ | ¡ D ]}| j  |jg ¡ |¡ qq|j	 ¡ D ]}| ¡ D ]}| j  |jg ¡ |¡ q7q1d S r   )
rt   r   r:   r1   r@   rO   r—   rW   r,   ry   )r	   ÚdefusesÚchainÚuser   r   r   r   Ò  s   ÿÿÿzUseDefChains.__init__c              	   C   sn   g }| j  ¡ D ]!\}}t|ƒ ¡ }d |d tdd„ |D ƒƒ¡¡}| ||f¡ q| ¡  d dd„ |D ƒ¡S )Nz{} <- {{{}}}r]   c                 s   rˆ   r   r…   )r   r2  r   r   r   r   ã  r   z'UseDefChains.__str__.<locals>.<genexpr>c                 s   s    | ]\}}|V  qd S r   r   )r   r   Úsr   r   r   r   ç  r   )	rt   rx   rH   rN   r<   rd   r‰   r,   Úsort)r	   r    r   ZusesZknameZkstrr   r   r   rg   Þ  s   ÿzUseDefChains.__str__N)r$   r%   r&   rF   r   rg   r   r   r   r   r/  Ê  s    r/  Ú__main__c                       s6   e Zd Z‡ fdd„Zd
dd„Zdd„ Zdd	„ Z‡  ZS )ÚBenigetc                    sR   t t| ƒ ¡  |p
d| _tƒ | _| j |¡ t| jƒ| _| j |¡ |  |¡ d S )Nz<stdin>)	r-   r6  r   rv   r'   Ú	ancestorsrš   rs   r0  )r	   rv   r¨   r2   r   r   r   î  s   
zBeniget.__init__r   c                 C   s–   | j j| D ]B}| ¡ sH| ¡ dkrqt|j|ƒrq|j}t|dƒs-| j |¡}t|dƒr"t|t	j
ƒr9|jdkr9qtd | ¡ | j|j|j¡ƒ qd S )Nrœ   r   Z
__future__z+W: '{}' is defined but not used at {}:{}:{})r0  ru   rW   rN   r:   r1   r   r7  r7   r@   Z
ImportFromr¨   r‘   r<   rv   r   r   )r	   r1   Úskipped_typesZ	local_defr’   r   r   r   Úcheck_unusedû  s.   

ÿ
üÿ€ñzBeniget.check_unusedc                 C   s<   |   |¡ | j d¡rd S | j|tjtjtjtjfd d S )Nz__init__.py)r8  )	r.   rv   Úendswithr9  r@   rA   rB   rM   rO   r0   r   r   r   r¯     s   

ÿ
ÿzBeniget.visit_Modulec                 C   s   |   |¡ |  |¡ d S r   )r.   r9  r0   r   r   r   r¾     s   
zBeniget.visit_FunctionDef)r   )r$   r%   r&   r   r9  r¯   r¾   rG   r   r   r2   r   r6  í  s
    
	r6  rL   r   )&Úcollectionsr   r   Ú
contextlibr   r¢   Zgastr@   Úobjectr   ZNodeVisitorr'   rH   rw   r£   r¤   Ú__builtins__ZBuiltinsSrcr‡   Ú__dict__rx   rm   r´   r¬   rn   rs   r/  r$   r6  ÚargvÚpathsÚpathÚopenÚstdinrÌ   ÚparseÚreadr¨   r   r   r   r   Ú<module>   sH    3C	        4þ€Æ9