B
    S\:                 @   s   d Z ddlZddlZddlmZmZmZ ddlmZ ddddZdd	d	d	d
ddZ	ej
dkZej
dkZej
dkZdd Zdd Zdd Zdd Zdd Zd!ddZG dd dZG dd  d eZej
dkreZdS )"zjthis module contains utilities for rebuilding a _ast tree in
order to get a single Astroid representation
    N)_parse_get_parser_moduleparse_function_type_comment)nodesTF)NoneTrueFalse	ArgumentsComprehensionExceptHandlerKeyword)Z	argumentsZcomprehensionZListCompForZ
GenExprForZexcepthandlerkeyword)   r   )r      )r      c             C   sd   | j d| jd| jd| jd| jd| jd| jd| jd| jd	| j	d
| j
d| jdi}tjdkr`d|| j< |S )N+&|^/z//%*z**-z<<z>>)r      @)ZAddZBitAndZBitOrZBitXorZDivZFloorDivZModZMultZPowZSubZLShiftZRShiftsysversion_infoZMatMult)moduleZbinary_operators r   0lib/python3.7/site-packages/astroid/rebuilder.py_binary_operators_from_module-   s    


r    c             C   s   | j d| jdiS )Nandor)ZAndZOr)r   r   r   r   _bool_operators_from_moduleA   s    r#   c             C   s   | j d| jd| jd| jdiS )Nr   r   not~)ZUAddZUSubZNotZInvert)r   r   r   r   _unary_operators_from_moduleE   s    r&   c             C   s@   | j d| jd| jd| jd| jd| jd| jd| jd| jd	| j	d
i
S )Nz==>z>=iniszis not<z<=z!=znot in)
ZEqZGtZGtEZInZIsZIsNotZLtZLtEZNotEqZNotIn)r   r   r   r   _compare_operators_from_moduleI   s    r+   c             C   s$   | j tj | jtj| jtj| jtjiS )N)LoadastroidStoreDelZParam)r   r   r   r   _contexts_from_moduleX   s    r0   visitc             K   s(   t | |d}|r$t ||||f|S dS )z_If the given node has an attribute, visits the attribute, and
    otherwise returns None.

    N)getattr)nodeattrZvisitorparentr1   Zkwsvaluer   r   r   _visit_or_nonea   s    r7   c               @   sJ  e Zd ZdZdedddZdd Zdd	 Zd
d Zdd Z	dddZ
dd Zdd Zdd Zdd Zdd ZdddZdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zdd)d*Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1d_d` Z2dadb Z3dcdd Z4dedf Z5dgdh Z6didj Z7dkdl Z8dmdn Z9e9Z:dodp Z;dqdr Z<dsdt Z=dudv Z>dwdx Z?dydz Z@d{d| ZAd}d~ ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdS )TreeRebuilderz0Rebuilds the _ast tree to become an Astroid treeF)parse_python_twoc             C   sj   || _ g | _g | _g | _i | _t|d| _t| j| _t	| j| _
t| j| _t| j| _t| j| _d S )N)r9   )Z_manager_global_names_import_from_nodes_delayed_assattr_visit_methsr   _parser_moduler&   _unary_op_classesr+   _cmp_op_classesr#   _bool_op_classesr    _bin_op_classesr0   _context_classes)selfZmanagerr9   r   r   r   __init__p   s    zTreeRebuilder.__init__c             C   s   yvt rt|dr|j}||fS |jrtt|jd | jjrtt|jd j| jjrt|jd jj	}|jdd  |_||fS W n t
k
r   Y nX |d fS )N	docstringr      )PY37hasattrrF   body
isinstancer>   Exprr6   ZStrs
IndexError)rD   r3   docr   r   r   _get_doc   s    zTreeRebuilder._get_docc             C   s   | j t|jtjS )N)rC   gettypectxr-   r,   )rD   r3   r   r   r   _get_context   s    zTreeRebuilder._get_contextc                sF    |\}}tj||||g|dd   fdd|jD   S )z7visit a Module node by returning a fresh instance of itN)namerO   filepathpackager5   c                s   g | ]} | qS r   )r1   ).0child)newnoderD   r   r   
<listcomp>   s    z.TreeRebuilder.visit_module.<locals>.<listcomp>)rP   r   ZModulepostinitrJ   )rD   r3   modnameZmodpathrX   rO   r   )r[   rD   r   visit_module   s    zTreeRebuilder.visit_modulec             C   sT   |j }|| jkr| j| }n.|j}dt||  }t| |}|| j|< |||S )NZvisit_)	__class__r=   __name__REDIRECTrQ   lowerr2   )rD   r3   r5   clsZvisit_methodZcls_name
visit_namer   r   r   r1      s    


zTreeRebuilder.visitNc             C   s>   | j r*|j| j d kr*| |j| n|j|j| dS )zAsave assignement situation since node.parent is not available yetN)r:   rU   root	set_localr5   )rD   r3   rU   r   r   r   _save_assignment   s    zTreeRebuilder._save_assignmentc          
      sz  |j |j }}tr6t|r |jnd|r,|jnd| nt|||  fdd|jD } fdd|jD }d}d}|rtr|j jr	|j j }|j}|rtr|jjr	|jj }|j}t
r$ fdd|jD }	 fdd|jD }
 fdd|jD } fdd|jD }ng }	g }
g }g } j|||	|
||||d	 |rb j|  |rv j|   S )
z;visit an Arguments node by returning a fresh instance of itNc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\      s    z1TreeRebuilder.visit_arguments.<locals>.<listcomp>c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\      s    c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\      s    c                s    g | ]}|r | nd qS )N)r1   )rY   rZ   )r[   rD   r   r   r\      s   c                s$   g | ]}|j r|j  nd qS )N)
annotationr1   )rY   arg)r[   rD   r   r   r\      s   c                s$   g | ]}|j r|j  nd qS )N)rj   r1   )rY   rk   )r[   rD   r   r   r\      s   )argsdefaults
kwonlyargskw_defaultsannotationskwonlyargs_annotationsvarargannotationkwargannotation)varargkwargPY34r   r	   rk   rl   rm   rj   r1   PY3rn   ro   r]   r5   rh   )rD   r3   r5   rt   ru   rl   rm   rr   rs   rn   ro   rp   rq   r   )r[   rD   r   visit_arguments   sZ     

zTreeRebuilder.visit_argumentsc             C   sF   t |j|j|}|jr(| |j|}nd}|| |j|| |S )z7visit a Assert node by returning a fresh instance of itN)r   ZAssertlineno
col_offsetmsgr1   r]   test)rD   r3   r5   r[   r{   r   r   r   visit_assert   s    zTreeRebuilder.visit_assertc             C   s^   t |dd }|sd S yt|}W n tk
r4   d S X | |jd |}t|tjsXd S |jS )Ntype_commentr   )	r2   r   SyntaxErrorr1   rJ   rK   r   rL   r6   )rD   r3   r~   type_comment_astZtype_objectr   r   r   check_type_comment   s    z TreeRebuilder.check_type_commentc                sp   t  dd }|sd S yt|}W n tk
r4   d S X d } fdd|jpNg D }|jrh|j }||fS )Nr~   c                s   g | ]} | qS r   )r1   )rY   elem)r3   rD   r   r   r\     s    z=TreeRebuilder.check_function_type_comment.<locals>.<listcomp>)r2   r   r   argtypesreturnsr1   )rD   r3   r~   r   r   r   r   )r3   rD   r   check_function_type_comment  s    z)TreeRebuilder.check_function_type_commentc                sL    |}t|j|j|  j fdd|jD |j |d  S )z7visit a Assign node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   %  s    z.TreeRebuilder.visit_assign.<locals>.<listcomp>)targetsr6   type_annotation)	r   r   ZAssignry   rz   r]   r   r1   r6   )rD   r3   r5   r   r   )r[   rD   r   visit_assign   s    
zTreeRebuilder.visit_assignc             C   s.   t |t|ddt|dd|}| | |S )z)visit a node and return a AssignName nodery   Nrz   )r   
AssignNamer2   ri   )rD   r3   r5   Z	node_namer[   r   r   r   visit_assignname+  s    


zTreeRebuilder.visit_assignnamec             C   sH   t | jt|j d |j|j|}|| |j	|| |j
| |S )z:visit a AugAssign node by returning a fresh instance of it=)r   Z	AugAssignrB   rR   opry   rz   r]   r1   targetr6   )rD   r3   r5   r[   r   r   r   visit_augassign6  s    zTreeRebuilder.visit_augassignc             C   s*   t |j|j|}|| |j| |S )z:visit a Backquote node by returning a fresh instance of it)r   Reprry   rz   r]   r1   r6   )rD   r3   r5   r[   r   r   r   
visit_reprC  s    zTreeRebuilder.visit_reprc             C   sD   t | jt|j |j|j|}|| |j	|| |j
| |S )z6visit a BinOp node by returning a fresh instance of it)r   ZBinOprB   rR   r   ry   rz   r]   r1   leftright)rD   r3   r5   r[   r   r   r   visit_binopI  s
    zTreeRebuilder.visit_binopc                s@   t jt|j |j|j|   fdd|jD   S )z7visit a BoolOp node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   X  s    z.TreeRebuilder.visit_boolop.<locals>.<listcomp>)	r   ZBoolOprA   rR   r   ry   rz   r]   values)rD   r3   r5   r   )r[   rD   r   visit_boolopS  s    zTreeRebuilder.visit_boolopc             C   s   t t|ddt|dd|S )z6visit a Break node by returning a fresh instance of itry   Nrz   )r   ZBreakr2   )rD   r3   r5   r   r   r   visit_break[  s    zTreeRebuilder.visit_breakc       	         s   t |j|j| t|d }t|d } fdd|jD }|jrb fdd|jD }nd}|rt j|j|j|jd}|j	|d |
| |rt jd|j|j|jd	}|j	|d |r|
| n|g} 	|j ||  S )
z9visit a CallFunc node by returning a fresh instance of itstarargskwargsc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   f  s    z,TreeRebuilder.visit_call.<locals>.<listcomp>c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   i  s    N)rz   ry   r5   )r6   )rk   rz   ry   r5   )r   ZCallry   rz   r7   rl   keywordsStarredr5   r]   appendr   r1   func)	rD   r3   r5   r   r   rl   r   Znew_starargsZ
new_kwargsr   )r[   rD   r   
visit_calla  s4    


zTreeRebuilder.visit_callc          
      s    |\}}t|j||j|j| d}trXx(|jD ]}|jdkr6	| j
}P q6W |jrl| }nd}  fdd|jD  fdd|jD |||tr fdd|jD ng   S )z'visit a ClassDef node to become astroidN	metaclassc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z0TreeRebuilder.visit_classdef.<locals>.<listcomp>c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    c                s"   g | ]}|j d kr| qS )r   )rk   r1   )rY   Zkwd)r[   rD   r   r   r\     s   )rP   r   ZClassDefrU   ry   rz   rw   r   rk   r1   r6   decorator_listvisit_decoratorsr]   basesrJ   )rD   r3   r5   newstylerO   r   r   
decoratorsr   )r[   rD   r   visit_classdef  s(    
zTreeRebuilder.visit_classdefc             C   s"   t |jt|ddt|dd|S )z6visit a Const node by returning a fresh instance of itry   Nrz   )r   Constr6   r2   )rD   r3   r5   r   r   r   visit_const  s
    

zTreeRebuilder.visit_constc             C   s   t t|ddt|dd|S )z9visit a Continue node by returning a fresh instance of itry   Nrz   )r   ZContinuer2   )rD   r3   r5   r   r   r   visit_continue  s    zTreeRebuilder.visit_continuec                sF   t |j|j|  |j  fddt|j|j	D   S )z8visit a Compare node by returning a fresh instance of itc                s(   g | ] \}}j |j | fqS r   )r@   r`   r1   )rY   r   expr)r[   rD   r   r   r\     s   z/TreeRebuilder.visit_compare.<locals>.<listcomp>)
r   ZComparery   rz   r]   r1   r   zipZopsZcomparators)rD   r3   r5   r   )r[   rD   r   visit_compare  s    zTreeRebuilder.visit_comparec          	      sL   t |  |j |j  fdd|jD t|dd  S )z>visit a Comprehension node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z5TreeRebuilder.visit_comprehension.<locals>.<listcomp>Zis_asyncN)r   r
   r]   r1   r   iterZifsr2   )rD   r3   r5   r   )r[   rD   r   visit_comprehension  s    
z!TreeRebuilder.visit_comprehensionc                s2   t |j|j|   fdd|jD   S )z;visit a Decorators node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z2TreeRebuilder.visit_decorators.<locals>.<listcomp>)r   Z
Decoratorsry   rz   r]   r   )rD   r3   r5   r   )r[   rD   r   r     s    zTreeRebuilder.visit_decoratorsc                s2   t |j|j|   fdd|jD   S )z7visit a Delete node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z.TreeRebuilder.visit_delete.<locals>.<listcomp>)r   ZDeletery   rz   r]   r   )rD   r3   r5   r   )r[   rD   r   visit_delete  s    zTreeRebuilder.visit_deletec             c   sZ   xTt |j|jD ]B\}}| ||}|s<t|j|j|}n| ||}||fV  qW d S )N)r   keysr   r1   r   Z
DictUnpackry   rz   )rD   r3   r5   r[   keyr6   Zrebuilt_valueZrebuilt_keyr   r   r   _visit_dict_items  s    zTreeRebuilder._visit_dict_itemsc             C   s2   t |j|j|}t| |||}|| |S )z5visit a Dict node by returning a fresh instance of it)r   ZDictry   rz   listr   r]   )rD   r3   r5   r[   itemsr   r   r   
visit_dict  s    
zTreeRebuilder.visit_dictc                sJ   t |j|j|  |j |j  fdd|jD   S )z9visit a DictComp node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z0TreeRebuilder.visit_dictcomp.<locals>.<listcomp>)	r   ZDictCompry   rz   r]   r1   r   r6   
generators)rD   r3   r5   r   )r[   rD   r   visit_dictcomp  s    zTreeRebuilder.visit_dictcompc             C   s*   t |j|j|}|| |j| |S )z5visit a Expr node by returning a fresh instance of it)r   rL   ry   rz   r]   r1   r6   )rD   r3   r5   r[   r   r   r   
visit_expr  s    zTreeRebuilder.visit_exprc             C   s   t t|ddt|dd|S )z:visit an Ellipsis node by returning a fresh instance of itry   Nrz   )r   Ellipsisr2   )rD   r3   r5   r   r   r   visit_ellipsis  s    zTreeRebuilder.visit_ellipsisc             C   s   t t|ddt|dd|S )z;visit an EmptyNode node by returning a fresh instance of itry   Nrz   )r   Z	EmptyNoder2   )rD   r3   r5   r   r   r   visit_emptynode   s    zTreeRebuilder.visit_emptynodec                sJ   t |j|j|  t|d t|d  fdd|jD   S )z?visit an ExceptHandler node by returning a fresh instance of itrR   rU   c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z5TreeRebuilder.visit_excepthandler.<locals>.<listcomp>)r   r   ry   rz   r]   r7   rJ   )rD   r3   r5   r   )r[   rD   r   visit_excepthandler  s    z!TreeRebuilder.visit_excepthandlerc          	   C   sB   t |j|j|}|| |j|t|d| |t|d| | |S )z6visit an Exec node by returning a fresh instance of itglobalslocals)r   ZExecry   rz   r]   r1   rJ   r7   )rD   r3   r5   r[   r   r   r   
visit_exec  s    zTreeRebuilder.visit_execc                s,   t j|d   fdd|jD   S )z:visit an ExtSlice node by returning a fresh instance of it)r5   c                s   g | ]} | qS r   )r1   )rY   Zdim)r[   rD   r   r   r\     s    z0TreeRebuilder.visit_extslice.<locals>.<listcomp>)r   ZExtSlicer]   Zdims)rD   r3   r5   r   )r[   rD   r   visit_extslice  s    zTreeRebuilder.visit_extslicec                sj   ||j |j| |} j|j |j  fdd|jD  fdd|jD |d  S )z4visit a For node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   )  s    z,TreeRebuilder._visit_for.<locals>.<listcomp>c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   *  s    )r   r   rJ   orelser   )	ry   rz   r   r]   r1   r   r   rJ   r   )rD   rd   r3   r5   r   r   )r[   rD   r   
_visit_for"  s    
zTreeRebuilder._visit_forc             C   s   |  tj||S )N)r   r   ZFor)rD   r3   r5   r   r   r   	visit_for/  s    zTreeRebuilder.visit_forc          
   C   sP   dd |j D }t|jpd||jp&dt|ddt|dd|}| j| |S )z<visit an ImportFrom node by returning a fresh instance of itc             S   s   g | ]}|j |jfqS r   )rU   asname)rY   aliasr   r   r   r\   4  s    z2TreeRebuilder.visit_importfrom.<locals>.<listcomp> Nry   rz   )namesr   Z
ImportFromr   levelr2   r;   r   )rD   r3   r5   r   r[   r   r   r   visit_importfrom2  s    

zTreeRebuilder.visit_importfromc       
         s   j i  |\}}||j||j|j| |jrD| }nd}trb|j	rb
|j	 }nd}d }}|}	|	r|	\}} j
|j  fdd|jD ||||d j    S )z+visit an FunctionDef node to become astroidNc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   U  s    z4TreeRebuilder._visit_functiondef.<locals>.<listcomp>)rl   rJ   r   r   type_comment_returnstype_comment_args)r:   r   rP   rU   ry   rz   r   r   rw   r   r1   r   r]   rl   rJ   pop)
rD   rd   r3   r5   rO   r   r   r   r   Ztype_comment_annotationr   )r[   rD   r   _visit_functiondefA  s,    


z TreeRebuilder._visit_functiondefc             C   s   |  tj||S )N)r   r   ZFunctionDef)rD   r3   r5   r   r   r   visit_functiondef^  s    zTreeRebuilder.visit_functiondefc                s>   t |j|j|  |j  fdd|jD   S )z=visit a GeneratorExp node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   f  s    z4TreeRebuilder.visit_generatorexp.<locals>.<listcomp>)r   ZGeneratorExpry   rz   r]   r1   eltr   )rD   r3   r5   r   )r[   rD   r   visit_generatorexpa  s
    z TreeRebuilder.visit_generatorexpc             C   s   |  |}|tjkr,t|j|j|j|}nP|tjkrft	|j|j|j|}t
|tjs|| j| nt|j|j|j|}|| |j| |S )z;visit an Attribute node by returning a fresh instance of it)rT   r-   r/   r   ZDelAttrr4   ry   rz   r.   Z
AssignAttrrK   r   r<   r   Z	Attributer]   r1   r6   )rD   r3   r5   contextr[   r   r   r   visit_attributej  s    


zTreeRebuilder.visit_attributec             C   sT   t |jt|ddt|dd|}| jrPx&|jD ]}| jd |g | q0W |S )z%visit a Global node to become astroidry   Nrz   rf   )r   ZGlobalr   r2   r:   
setdefaultr   )rD   r3   r5   r[   rU   r   r   r   visit_global{  s    

zTreeRebuilder.visit_globalc                sR   t |j|j|  |j  fdd|jD  fdd|jD   S )z4visit an If node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z*TreeRebuilder.visit_if.<locals>.<listcomp>c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    )	r   ZIfry   rz   r]   r1   r|   rJ   r   )rD   r3   r5   r   )r[   rD   r   visit_if  s    zTreeRebuilder.visit_ifc             C   sB   t |j|j|}|| |j|| |j|| |j| |S )z6visit a IfExp node by returning a fresh instance of it)	r   ZIfExpry   rz   r]   r1   r|   rJ   r   )rD   r3   r5   r[   r   r   r   visit_ifexp  s    zTreeRebuilder.visit_ifexpc             C   sf   dd |j D }t|t|ddt|dd|}x0|j D ]&\}}|pF|}||dd | q8W |S )z7visit a Import node by returning a fresh instance of itc             S   s   g | ]}|j |jfqS r   )rU   r   )rY   r   r   r   r   r\     s    z.TreeRebuilder.visit_import.<locals>.<listcomp>ry   Nrz   .r   )r   r   ZImportr2   rh   split)rD   r3   r5   r   r[   rU   r   r   r   r   visit_import  s    

zTreeRebuilder.visit_importc             C   s$   t j|d}|| |j| |S )z6visit a Index node by returning a fresh instance of it)r5   )r   ZIndexr]   r1   r6   )rD   r3   r5   r[   r   r   r   visit_index  s    zTreeRebuilder.visit_indexc             C   s(   t j|j|d}|| |j| |S )z8visit a Keyword node by returning a fresh instance of it)r5   )r   r   rk   r]   r1   r6   )rD   r3   r5   r[   r   r   r   visit_keyword  s    zTreeRebuilder.visit_keywordc             C   s6   t |j|j|}|| |j|| |j| |S )z7visit a Lambda node by returning a fresh instance of it)r   ZLambdary   rz   r]   r1   rl   rJ   )rD   r3   r5   r[   r   r   r   visit_lambda  s     zTreeRebuilder.visit_lambdac                s@    |}tj||j|j|d   fdd|jD   S )z5visit a List node by returning a fresh instance of it)rS   ry   rz   r5   c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z,TreeRebuilder.visit_list.<locals>.<listcomp>)rT   r   ZListry   rz   r]   elts)rD   r3   r5   r   r   )r[   rD   r   
visit_list  s
    
zTreeRebuilder.visit_listc                s>   t |j|j|  |j  fdd|jD   S )z9visit a ListComp node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z0TreeRebuilder.visit_listcomp.<locals>.<listcomp>)r   ZListCompry   rz   r]   r1   r   r   )rD   r3   r5   r   )r[   rD   r   visit_listcomp  s
    zTreeRebuilder.visit_listcompc             C   s   |  |}|tjkr,t|j|j|j|}nl|tjkrNt	|j|j|j|}nJ|jt
krtt
|j t|ddt|dd|}|S t|j|j|j|}|tjtjfkr| | |S )z5visit a Name node by returning a fresh instance of itry   Nrz   )rT   r-   r/   r   ZDelNameidry   rz   r.   r   CONST_NAME_TRANSFORMSr   r2   Nameri   )rD   r3   r5   r   r[   r   r   r   re     s     






zTreeRebuilder.visit_namec             C   s"   t |jt|ddt|dd|S )z<visit a Constant node by returning a fresh instance of Constry   Nrz   )r   r   r6   r2   )rD   r3   r5   r   r   r   visit_constant  s
    

zTreeRebuilder.visit_constantc             C   s"   t |jt|ddt|dd|S )z@visit a String/Bytes node by returning a fresh instance of Constry   Nrz   )r   r   rM   r2   )rD   r3   r5   r   r   r   	visit_str  s
    

zTreeRebuilder.visit_strc             C   s"   t |jt|ddt|dd|S )z7visit a Num node by returning a fresh instance of Constry   Nrz   )r   r   nr2   )rD   r3   r5   r   r   r   	visit_num  s
    

zTreeRebuilder.visit_numc             C   s   t |j|j|S )z5visit a Pass node by returning a fresh instance of it)r   ZPassry   rz   )rD   r3   r5   r   r   r   
visit_pass  s    zTreeRebuilder.visit_passc                sB   t |j|j|j|  t|d  fdd|jD   S )z6visit a Print node by returning a fresh instance of itdestc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z-TreeRebuilder.visit_print.<locals>.<listcomp>)r   ZPrintnlry   rz   r]   r7   r   )rD   r3   r5   r   )r[   rD   r   visit_print  s
    zTreeRebuilder.visit_printc          	   C   sB   t |j|j|}|t|d| |t|d| |t|d| | |S )z6visit a Raise node by returning a fresh instance of itrR   ZinstZtback)r   Raisery   rz   r]   r7   )rD   r3   r5   r[   r   r   r   visit_raise  s    zTreeRebuilder.visit_raisec             C   s4   t |j|j|}|jdk	r0|| |j| |S )z7visit a Return node by returning a fresh instance of itN)r   ZReturnry   rz   r6   r]   r1   )rD   r3   r5   r[   r   r   r   visit_return  s    
zTreeRebuilder.visit_returnc                s2   t |j|j|   fdd|jD   S )z4visit a Set node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   )  s    z+TreeRebuilder.visit_set.<locals>.<listcomp>)r   Setry   rz   r]   r   )rD   r3   r5   r   )r[   rD   r   	visit_set&  s    zTreeRebuilder.visit_setc                s>   t |j|j|  |j  fdd|jD   S )z8visit a SetComp node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   1  s    z/TreeRebuilder.visit_setcomp.<locals>.<listcomp>)r   ZSetCompry   rz   r]   r1   r   r   )rD   r3   r5   r   )r[   rD   r   visit_setcomp,  s
    zTreeRebuilder.visit_setcompc          	   C   s<   t j|d}|t|d| |t|d| |t|d| | |S )z6visit a Slice node by returning a fresh instance of it)r5   rc   upperstep)r   ZSlicer]   r7   )rD   r3   r5   r[   r   r   r   visit_slice5  s    zTreeRebuilder.visit_slicec             C   sD   |  |}tj||j|j|d}|| |j|| |j| |S )z:visit a Subscript node by returning a fresh instance of it)rS   ry   rz   r5   )	rT   r   Z	Subscriptry   rz   r]   r1   r6   slice)rD   r3   r5   r   r[   r   r   r   visit_subscript?  s    
zTreeRebuilder.visit_subscriptc                sZ   t |j|j|   fdd|jD  fdd|jD  fdd|jD   S )z:visit a TryExcept node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   N  s    z1TreeRebuilder.visit_tryexcept.<locals>.<listcomp>c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   O  s    c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   P  s    )r   Z	TryExceptry   rz   r]   rJ   handlersr   )rD   r3   r5   r   )r[   rD   r   visit_tryexceptJ  s    zTreeRebuilder.visit_tryexceptc                sF   t |j|j|   fdd|jD  fdd|jD   S )z;visit a TryFinally node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   X  s    z2TreeRebuilder.visit_tryfinally.<locals>.<listcomp>c                s   g | ]} | qS r   )r1   )rY   r   )r[   rD   r   r   r\   Y  s    )r   
TryFinallyry   rz   r]   rJ   	finalbody)rD   r3   r5   r   )r[   rD   r   visit_tryfinallyT  s
    zTreeRebuilder.visit_tryfinallyc                s@    |}tj||j|j|d   fdd|jD   S )z6visit a Tuple node by returning a fresh instance of it)rS   ry   rz   r5   c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   c  s    z-TreeRebuilder.visit_tuple.<locals>.<listcomp>)rT   r   ZTuplery   rz   r]   r   )rD   r3   r5   r   r   )r[   rD   r   visit_tuple]  s
    
zTreeRebuilder.visit_tuplec             C   s6   t | j|jj |j|j|}|| |j	| |S )z8visit a UnaryOp node by returning a fresh instance of it)
r   ZUnaryOpr?   r   r`   ry   rz   r]   r1   Zoperand)rD   r3   r5   r[   r   r   r   visit_unaryopf  s    zTreeRebuilder.visit_unaryopc                sR   t |j|j|  |j  fdd|jD  fdd|jD   S )z6visit a While node by returning a fresh instance of itc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   v  s    z-TreeRebuilder.visit_while.<locals>.<listcomp>c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\   w  s    )	r   ZWhilery   rz   r]   r1   r|   rJ   r   )rD   r3   r5   r   )r[   rD   r   visit_whileq  s    zTreeRebuilder.visit_whilec                st   t |j|j| |j }|jd k	r:|j }nd }|} j||fg fdd|j	D |d  S )Nc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z,TreeRebuilder.visit_with.<locals>.<listcomp>)r   rJ   r   )
r   Withry   rz   r1   context_exproptional_varsr   r]   rJ   )rD   r3   r5   r   r   r   r   )r[   rD   r   
visit_with{  s    

zTreeRebuilder.visit_withc             C   s4   t |j|j|}|jdk	r0|| |j| |S )z6visit a Yield node by returning a fresh instance of itN)r   ZYieldry   rz   r6   r]   r1   )rD   r3   r5   r[   r   r   r   visit_yield  s    
zTreeRebuilder.visit_yield)F)N)N)N)Kra   
__module____qualname____doc__boolrE   rP   rT   r_   r1   ri   rx   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   re   r   r   Zvisit_bytesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   m   s   
>


#
	
	

		
				

		
r8   c                   s   e 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 fddZdd Zdd Zd' fdd	Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Z  ZS )(TreeRebuilder3z/extend and overwrite TreeRebuilder for python3kc             C   s   |  |||jS )z7visit an arg node by returning a fresh AssName instance)r   rk   )rD   r3   r5   r   r   r   	visit_arg  s    zTreeRebuilder3.visit_argc             C   s"   t |jt|dd t|dd |S )Nry   rz   )r   r   r6   r2   )rD   r3   r5   r   r   r   visit_nameconstant  s
    

z!TreeRebuilder3.visit_nameconstantc                s\   t |j|j| |jr*| |j}nd} t|d | fdd|jD   S )z?visit an ExceptHandler node by returning a fresh instance of itNrR   c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z6TreeRebuilder3.visit_excepthandler.<locals>.<listcomp>)	r   r   ry   rz   rU   r   r]   r7   rJ   )rD   r3   r5   rU   r   )r[   rD   r   r     s    z"TreeRebuilder3.visit_excepthandlerc             C   s"   t |jt|ddt|dd|S )z5visit a Nonlocal node and return a new instance of itry   Nrz   )r   ZNonlocalr   r2   )rD   r3   r5   r   r   r   visit_nonlocal  s
    

zTreeRebuilder3.visit_nonlocalc             C   s6   t |j|j|}|t|d| |t|d| | |S )z6visit a Raise node by returning a fresh instance of itexccause)r   r   ry   rz   r]   r7   )rD   r3   r5   r[   r   r   r   r     s
    zTreeRebuilder3.visit_raisec             C   s8   |  |}tj||j|j|d}|| |j| |S )z4visit a Starred node and return a new instance of it)rS   ry   rz   r5   )rT   r   r   ry   rz   r]   r1   r6   )rD   r3   r5   r   r[   r   r   r   visit_starred  s
    
zTreeRebuilder3.visit_starredc                s|   |j rft|j|j| |jr.| g}n fdd|jD } | fdd|j D   S |jrx||S d S )Nc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z,TreeRebuilder3.visit_try.<locals>.<listcomp>c                s   g | ]} | qS r   )r1   )rY   r   )r[   rD   r   r   r\     s    )	r   r   r   ry   rz   r   r   rJ   r]   )rD   r3   r5   rJ   r   )r[   rD   r   	visit_try  s    zTreeRebuilder3.visit_tryc          	   C   sL   t |j|j|}t|d| |}|j| |j|||jt|d| |d |S )z;visit an AnnAssign node by returning a fresh instance of itrj   r6   )r   rj   simpler6   )	r   Z	AnnAssignry   rz   r7   r]   r1   r   r  )rD   r3   r5   r[   rj   r   r   r   visit_annassign  s    zTreeRebuilder3.visit_annassignc                sz   d|j krtt||S ||j|j|  fdd|} jfdd|jD  fdd|j	D |d  S )Nr   c                s$    | j }t| d }||fS )Nr   )r1   r   r7   )rZ   r   var)r[   rD   r   r   visit_child  s    z/TreeRebuilder3._visit_with.<locals>.visit_childc                s   g | ]} |qS r   r   )rY   rZ   )r  r   r   r\     s    z.TreeRebuilder3._visit_with.<locals>.<listcomp>c                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    )r   rJ   r   )
_fieldssuperr  r   ry   rz   r   r]   r   rJ   )rD   rd   r3   r5   r   )r`   )r[   rD   r  r   _visit_with  s    

zTreeRebuilder3._visit_withc             C   s   |  tj||S )N)r  r   r   )rD   r3   r5   r   r   r   r     s    zTreeRebuilder3.visit_withc             C   s4   t |j|j|}|jd k	r0|| |j| |S )N)r   Z	YieldFromry   rz   r6   r]   r1   )rD   r3   r5   r[   r   r   r   visit_yieldfrom   s    
zTreeRebuilder3.visit_yieldfromTc                s   t t| j|||dS )N)r   )r  r  r   )rD   r3   r5   r   )r`   r   r   r     s    
zTreeRebuilder3.visit_classdefc             C   s   |  tj||S )N)r   r   ZAsyncFunctionDef)rD   r3   r5   r   r   r   visit_asyncfunctiondef  s    z%TreeRebuilder3.visit_asyncfunctiondefc             C   s   |  tj||S )N)r   r   ZAsyncFor)rD   r3   r5   r   r   r   visit_asyncfor  s    zTreeRebuilder3.visit_asyncforc             C   s,   t |j|j|}|j| |j|d |S )N)r6   )r   ZAwaitry   rz   r]   r1   r6   )rD   r3   r5   r[   r   r   r   visit_await  s    zTreeRebuilder3.visit_awaitc             C   s   |  tj||S )N)r  r   Z	AsyncWith)rD   r3   r5   r   r   r   visit_asyncwith  s    zTreeRebuilder3.visit_asyncwithc                s2   t |j|j|   fdd|jD   S )Nc                s   g | ]} | qS r   )r1   )rY   rZ   )r[   rD   r   r   r\     s    z2TreeRebuilder3.visit_joinedstr.<locals>.<listcomp>)r   Z	JoinedStrry   rz   r]   r   )rD   r3   r5   r   )r[   rD   r   visit_joinedstr  s    zTreeRebuilder3.visit_joinedstrc          	   C   s:   t |j|j|}|| |j||jt|d| | |S )Nformat_spec)	r   ZFormattedValuery   rz   r]   r1   r6   Z
conversionr7   )rD   r3   r5   r[   r   r   r   visit_formattedvalue  s    z#TreeRebuilder3.visit_formattedvalue)T)ra   r  r  r  r  r  r   r  r   r  r  r  r  r   r  r   r  r  r  r  r  r  __classcell__r   r   )r`   r   r    s&   		
	r  )r1   )r  r   r-   Zastroid._astr   r   r   r   r   rb   r   rw   rv   rH   r    r#   r&   r+   r0   r7   r8   r  r   r   r   r   <module>   s>   


	
      , 
