B
    S£†\×V  ã               @   sP   d Z ddlZdZG dd„ dƒZG dd„ deƒZdd	„ Zejd
krDeZedƒZdS )a  This module renders Astroid nodes as string:

* :func:`to_code` function return equivalent (hopefully valid) python string

* :func:`dump` function return an internal representation of nodes found
  in the tree, useful for debugging or understanding the tree structure
é    Nú c               @   s\  e Zd ZdZdd„ Zdd„ Zd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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/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„ Z9dodp„ Z:dqdr„ Z;dsdt„ Z<dudv„ Z=dwdx„ Z>dydz„ Z?d{d|„ Z@d}d~„ ZAdd€„ ZBdd‚„ ZCdƒd„„ ZDd…d†„ ZEd‡dˆ„ ZFd‰dŠ„ ZGd‹dŒ„ ZHddŽ„ ZIdd„ ZJd‘d’„ ZKd“d”„ ZLd•S )˜ÚAsStringVisitorz?Visitor to render an Astroid node as a valid python code stringc             C   s
   || _ d S )N)Úindent)Úselfr   © r   ú0lib/python3.7/site-packages/astroid/as_string.pyÚ__init__#   s    zAsStringVisitor.__init__c             C   s   |  | ¡ td¡S )z.Makes this visitor behave as a simple functionÚ
)ÚacceptÚreplaceÚDOC_NEWLINE)r   Únoder   r   r   Ú__call__&   s    zAsStringVisitor.__call__c             C   s   d| j | dt¡f S )z7Stop newlines in docs being indented by self._stmt_listz
%s"""%s"""r	   )r   r   r   )r   Údocr   r   r   Ú_docs_dedent*   s    zAsStringVisitor._docs_dedentTc                sB   d  dd„ ‡ fdd„|D ƒD ƒ¡}|r>ˆ j| ddˆ j ¡ S |S )z return a list of nodes to stringr	   c             s   s   | ]}|r|V  qd S )Nr   )Ú.0Znstrr   r   r   ú	<genexpr>0   s    z-AsStringVisitor._stmt_list.<locals>.<genexpr>c                s   g | ]}|  ˆ ¡‘qS r   )r
   )r   Ún)r   r   r   ú
<listcomp>0   s    z.AsStringVisitor._stmt_list.<locals>.<listcomp>)Újoinr   r   )r   Zstmtsr   r   )r   r   Ú
_stmt_list.   s    "zAsStringVisitor._stmt_listc             C   s&   |   |||¡rd| | ¡ S | | ¡S )z<Wrap child in parens only if required to keep same semanticsz(%s))Ú_should_wrapr
   )r   r   ÚchildÚis_leftr   r   r   Ú_precedence_parens6   s    z"AsStringVisitor._precedence_parensc             C   s8   |  ¡ }|  ¡ }||krdS ||kr4|| ¡ kr4dS dS )zWrap child if:
            - it has lower precedence
            - same precedence with position opposite to associativity direction
        TF)Zop_precedenceZop_left_associative)r   r   r   r   Znode_precedenceZchild_precedencer   r   r   r   =   s    zAsStringVisitor._should_wrapc             C   s   |  ¡ S )z)return an astroid.Function node as string)Zformat_args)r   r   r   r   r   Úvisit_argumentsU   s    zAsStringVisitor.visit_argumentsc             C   s
   |   |¡S )z(return an astroid.AssAttr node as string)Úvisit_attribute)r   r   r   r   r   Úvisit_assignattrY   s    z AsStringVisitor.visit_assignattrc             C   s2   |j r"d|j | ¡|j  | ¡f S d|j | ¡ S )z'return an astroid.Assert node as stringzassert %s, %sz	assert %s)ZfailÚtestr
   )r   r   r   r   r   Úvisit_assert]   s    zAsStringVisitor.visit_assertc             C   s   |j S )z(return an astroid.AssName node as string)Úname)r   r   r   r   r   Úvisit_assignnamec   s    z AsStringVisitor.visit_assignnamec                s.   d  ‡ fdd„|jD ƒ¡}d||j ˆ ¡f S )z'return an astroid.Assign node as stringz = c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   r   )r   r   r   r   i   s    z/AsStringVisitor.visit_assign.<locals>.<genexpr>z%s = %s)r   ÚtargetsÚvaluer
   )r   r   Zlhsr   )r   r   Úvisit_assigng   s    zAsStringVisitor.visit_assignc             C   s    d|j  | ¡|j|j | ¡f S )z*return an astroid.AugAssign node as stringz%s %s %s)Útargetr
   Úopr#   )r   r   r   r   r   Úvisit_augassignl   s    zAsStringVisitor.visit_augassignc             C   sD   |j  | ¡}|j | ¡}|jdkr.d||f S d|||j | ¡f S )z*Return an astroid.AugAssign node as stringNz%s: %sz%s: %s = %s)r%   r
   Ú
annotationr#   )r   r   r%   r(   r   r   r   Úvisit_annassignp   s
    
zAsStringVisitor.visit_annassignc             C   s   d|j  | ¡ S )z%return an astroid.Repr node as stringz`%s`)r#   r
   )r   r   r   r   r   Ú
visit_repry   s    zAsStringVisitor.visit_reprc             C   sJ   |   ||j¡}| j ||jdd}|jdkr:d||j|f S d||j|f S )z&return an astroid.BinOp node as stringF)r   z**z%s%s%sz%s %s %s)r   ÚleftÚrightr&   )r   r   r+   r,   r   r   r   Úvisit_binop}   s
    
zAsStringVisitor.visit_binopc                s&   ‡ ‡fdd„ˆ j D ƒ}dˆ j  |¡S )z'return an astroid.BoolOp node as stringc                s   g | ]}d ˆ  ˆ |¡ ‘qS )z%s)r   )r   r   )r   r   r   r   r   ˆ   s    z0AsStringVisitor.visit_boolop.<locals>.<listcomp>z %s )Úvaluesr&   r   )r   r   r.   r   )r   r   r   Úvisit_boolop†   s    zAsStringVisitor.visit_boolopc             C   s   dS )z&return an astroid.Break node as stringÚbreakr   )r   r   r   r   r   Úvisit_break‹   s    zAsStringVisitor.visit_breakc                s^   ˆ   ||j¡}‡ fdd„|jD ƒ}|jr>‡ fdd„|jD ƒ}ng }| |¡ d|d |¡f S )z%return an astroid.Call node as stringc                s   g | ]}|  ˆ ¡‘qS r   )r
   )r   Úarg)r   r   r   r   ’   s    z.AsStringVisitor.visit_call.<locals>.<listcomp>c                s   g | ]}|  ˆ ¡‘qS r   )r
   )r   Zkwarg)r   r   r   r   ”   s    z%s(%s)z, )r   ÚfuncÚargsÚkeywordsÚextendr   )r   r   Zexpr_strr4   r5   r   )r   r   Ú
visit_call   s    
zAsStringVisitor.visit_callc                s¦   |j r|j  ˆ ¡nd}d ‡ fdd„|jD ƒ¡}| ¡ }|rd| ¡ sd|rXd||jf }qtd|j }n|rpd| nd}|jr†ˆ  |j¡nd}d||j||ˆ  	|j
¡f S )	z)return an astroid.ClassDef node as stringÚ z, c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   r   )r   r   r   r   ž   s    z1AsStringVisitor.visit_classdef.<locals>.<genexpr>z(%s, metaclass=%s)z(metaclass=%s)z(%s)z

%sclass %s%s:%s
%s
)Ú
decoratorsr
   r   ÚbasesÚ	metaclassZhas_metaclass_hackr    r   r   r   Úbody)r   r   Údecorater:   r;   Údocsr   )r   r   Úvisit_classdef›   s    zAsStringVisitor.visit_classdefc                s2   d  ‡ ‡fdd„ˆ jD ƒ¡}dˆ ˆ ˆ j¡|f S )z(return an astroid.Compare node as stringú c          	      s(   g | ] \}}d |ˆj ˆ |ddf ‘qS )z%s %sF)r   )r   )r   r&   Úexpr)r   r   r   r   r   ´   s   z1AsStringVisitor.visit_compare.<locals>.<listcomp>z%s %s)r   Zopsr   r+   )r   r   Zrhs_strr   )r   r   r   Úvisit_compare°   s    zAsStringVisitor.visit_comparec                s8   d  ‡ fdd„|jD ƒ¡}d|j ˆ ¡|j ˆ ¡|f S )z.return an astroid.Comprehension node as stringr8   c             3   s   | ]}d |  ˆ ¡ V  qdS )z if %sN)r
   )r   r   )r   r   r   r   ¼   s    z6AsStringVisitor.visit_comprehension.<locals>.<genexpr>zfor %s in %s%s)r   Úifsr%   r
   Úiter)r   r   rC   r   )r   r   Úvisit_comprehensionº   s
    

z#AsStringVisitor.visit_comprehensionc             C   s   |j tkrdS t|j ƒS )z&return an astroid.Const node as stringz...)r#   ÚEllipsisÚrepr)r   r   r   r   r   Úvisit_constÃ   s    
zAsStringVisitor.visit_constc             C   s   dS )z)return an astroid.Continue node as stringÚcontinuer   )r   r   r   r   r   Úvisit_continueÉ   s    zAsStringVisitor.visit_continuec                s   dd  ‡ fdd„|jD ƒ¡ S )z'return an astroid.Delete node as stringzdel %sz, c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   r   )r   r   r   r   Ï   s    z/AsStringVisitor.visit_delete.<locals>.<genexpr>)r   r"   )r   r   r   )r   r   Úvisit_deleteÍ   s    zAsStringVisitor.visit_deletec             C   s
   |   |¡S )z(return an astroid.DelAttr node as string)r   )r   r   r   r   r   Úvisit_delattrÑ   s    zAsStringVisitor.visit_delattrc             C   s   |j S )z(return an astroid.DelName node as string)r    )r   r   r   r   r   Úvisit_delnameÕ   s    zAsStringVisitor.visit_delnamec                s   dd  ‡ fdd„|jD ƒ¡ S )z+return an astroid.Decorators node as stringz@%s
z
@c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   Úitem)r   r   r   r   Û   s    z3AsStringVisitor.visit_decorators.<locals>.<genexpr>)r   Únodes)r   r   r   )r   r   Úvisit_decoratorsÙ   s    z AsStringVisitor.visit_decoratorsc             C   s   dd  |  |¡¡ S )z%return an astroid.Dict node as stringz{%s}z, )r   Ú_visit_dict)r   r   r   r   r   Ú
visit_dictÝ   s    zAsStringVisitor.visit_dictc             c   sN   xH|j D ]>\}}| | ¡}| | ¡}|dkr8|| V  qd||f V  qW d S )Nz**z%s: %s)Úitemsr
   )r   r   Úkeyr#   r   r   r   rQ   á   s    

zAsStringVisitor._visit_dictc             C   s   dS )Nz**r   )r   r   r   r   r   Úvisit_dictunpackë   s    z AsStringVisitor.visit_dictunpackc                s4   d|j  ˆ ¡|j ˆ ¡d ‡ fdd„|jD ƒ¡f S )z)return an astroid.DictComp node as stringz{%s: %s %s}r@   c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   r   )r   r   r   r   ó   s    z1AsStringVisitor.visit_dictcomp.<locals>.<genexpr>)rT   r
   r#   r   Ú
generators)r   r   r   )r   r   Úvisit_dictcompî   s    

zAsStringVisitor.visit_dictcompc             C   s   |j  | ¡S )z(return an astroid.Discard node as string)r#   r
   )r   r   r   r   r   Ú
visit_exprö   s    zAsStringVisitor.visit_exprc             C   s   dS )z'dummy method for visiting an Empty noder8   r   )r   r   r   r   r   Úvisit_emptynodeú   s    zAsStringVisitor.visit_emptynodec             C   sT   |j r<|jr*d|j  | ¡|j | ¡f }q@d|j  | ¡ }nd}d||  |j¡f S )Nzexcept %s, %sz	except %sÚexceptz%s:
%s)Útyper    r
   r   r<   )r   r   Úexcsr   r   r   Úvisit_excepthandlerþ   s    
z#AsStringVisitor.visit_excepthandlerc             C   s   dS )z)return an astroid.Ellipsis node as stringz...r   )r   r   r   r   r   Úvisit_ellipsis  s    zAsStringVisitor.visit_ellipsisc             C   s   dS )zreturn an Empty node as stringr8   r   )r   r   r   r   r   Úvisit_empty  s    zAsStringVisitor.visit_emptyc             C   s^   |j r,d|j | ¡|j  | ¡|j | ¡f S |jrNd|j | ¡|j | ¡f S d|j | ¡ S )z%return an astroid.Exec node as stringzexec %s in %s, %szexec %s in %szexec %s)ÚlocalsrA   r
   Úglobals)r   r   r   r   r   Ú
visit_exec  s    

zAsStringVisitor.visit_execc                s   d  ‡ fdd„|jD ƒ¡S )z)return an astroid.ExtSlice node as stringz, c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   Zdim)r   r   r   r   !  s    z1AsStringVisitor.visit_extslice.<locals>.<genexpr>)r   Zdims)r   r   r   )r   r   Úvisit_extslice  s    zAsStringVisitor.visit_extslicec             C   sD   d|j  | ¡|j | ¡|  |j¡f }|jr@d||  |j¡f }|S )z$return an astroid.For node as stringzfor %s in %s:
%sz%s
else:
%s)r%   r
   rD   r   r<   Úorelse)r   r   Zforsr   r   r   Ú	visit_for#  s    

zAsStringVisitor.visit_forc             C   s"   dd|j pd |j t|jƒf S )z+return an astroid.ImportFrom node as stringzfrom %s import %sÚ.r   )ÚlevelÚmodnameÚ_import_stringÚnames)r   r   r   r   r   Úvisit_importfrom.  s    z AsStringVisitor.visit_importfromc          	   C   sv   |j r|j  | ¡nd}|jr(|  |j¡nd}d}|jrLd|j ¡  }|d }d}|||j|j | ¡|||  |j	¡f S )z)return an astroid.Function node as stringr8   ú:z->z
%sdef %s(%s)%s%s
%s)
r9   r
   r   r   ZreturnsZ	as_stringr    r4   r   r<   )r   r   r=   r>   ZtrailerZreturn_annotationZ
def_formatr   r   r   Úvisit_functiondef5  s    
z!AsStringVisitor.visit_functiondefc                s*   d|j  ˆ ¡d ‡ fdd„|jD ƒ¡f S )z-return an astroid.GeneratorExp node as stringz(%s %s)r@   c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   r   )r   r   r   r   K  s    z5AsStringVisitor.visit_generatorexp.<locals>.<genexpr>)Úeltr
   r   rV   )r   r   r   )r   r   Úvisit_generatorexpG  s    
z"AsStringVisitor.visit_generatorexpc             C   s   d|   ||j¡|jf S )z(return an astroid.Getattr node as stringz%s.%s)r   rA   Zattrname)r   r   r   r   r   r   N  s    zAsStringVisitor.visit_attributec             C   s   dd  |j¡ S )z'return an astroid.Global node as stringz	global %sz, )r   rj   )r   r   r   r   r   Úvisit_globalR  s    zAsStringVisitor.visit_globalc             C   sh   d|j  | ¡|  |j¡f g}| ¡ rB| d| j|jdd ¡ n|jr^| d|  |j¡ ¡ d |¡S )z#return an astroid.If node as stringz	if %s:
%szel%sF)r   zelse:
%sr	   )r   r
   r   r<   Zhas_elif_blockÚappendrd   r   )r   r   rC   r   r   r   Úvisit_ifV  s    zAsStringVisitor.visit_ifc             C   s8   d| j ||jdd| j ||jdd| j ||jddf S )z&return an astroid.IfExp node as stringz%s if %s else %sT)r   F)r   r<   r   rd   )r   r   r   r   r   Úvisit_ifexp_  s    zAsStringVisitor.visit_ifexpc             C   s   dt |jƒ S )z'return an astroid.Import node as stringz	import %s)ri   rj   )r   r   r   r   r   Úvisit_importg  s    zAsStringVisitor.visit_importc             C   s0   |j dkrd|j | ¡ S d|j |j | ¡f S )z(return an astroid.Keyword node as stringNz**%sz%s=%s)r2   r#   r
   )r   r   r   r   r   Úvisit_keywordk  s    
zAsStringVisitor.visit_keywordc             C   s0   |j  | ¡}|j | ¡}|r(d||f S d| S )z'return an astroid.Lambda node as stringzlambda %s: %sz
lambda: %s)r4   r
   r<   )r   r   r4   r<   r   r   r   Úvisit_lambdaq  s
    zAsStringVisitor.visit_lambdac                s   dd  ‡ fdd„|jD ƒ¡ S )z%return an astroid.List node as stringz[%s]z, c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   r   )r   r   r   r   |  s    z-AsStringVisitor.visit_list.<locals>.<genexpr>)r   Úelts)r   r   r   )r   r   Ú
visit_listz  s    zAsStringVisitor.visit_listc                s*   d|j  ˆ ¡d ‡ fdd„|jD ƒ¡f S )z)return an astroid.ListComp node as stringz[%s %s]r@   c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   r   )r   r   r   r   ‚  s    z1AsStringVisitor.visit_listcomp.<locals>.<genexpr>)rn   r
   r   rV   )r   r   r   )r   r   Úvisit_listcomp~  s    
zAsStringVisitor.visit_listcompc                s6   |j rd|j  nd}|d ‡ fdd„|jD ƒ¡ d S )z'return an astroid.Module node as stringz
"""%s"""

r8   r	   c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   r   )r   r   r   r   ˆ  s    z/AsStringVisitor.visit_module.<locals>.<genexpr>z

)r   r   r<   )r   r   r>   r   )r   r   Úvisit_module…  s    zAsStringVisitor.visit_modulec             C   s   |j S )z%return an astroid.Name node as string)r    )r   r   r   r   r   Ú
visit_nameŠ  s    zAsStringVisitor.visit_namec             C   s   dS )z%return an astroid.Pass node as stringÚpassr   )r   r   r   r   r   Ú
visit_passŽ  s    zAsStringVisitor.visit_passc                sJ   d  ‡ fdd„|jD ƒ¡}|js(d| }|jrBd|j ˆ ¡|f S d| S )z&return an astroid.Print node as stringz, c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   r   )r   r   r   r   ”  s    z.AsStringVisitor.visit_print.<locals>.<genexpr>z%s,zprint >> %s, %szprint %s)r   r.   ÚnlÚdestr
   )r   r   rO   r   )r   r   Úvisit_print’  s    zAsStringVisitor.visit_printc             C   sh   |j rd|jrT|jr8d|j  | ¡|j | ¡|j | ¡f S d|j  | ¡|j | ¡f S d|j  | ¡ S dS )z&return an astroid.Raise node as stringzraise %s, %s, %szraise %s, %szraise %sÚraise)ÚexcZinstZtbackr
   )r   r   r   r   r   Úvisit_raise›  s    

zAsStringVisitor.visit_raisec                sV   |  ¡ r<t|jjƒdkr<‡ fdd„|jjD ƒ}dd |¡ S |jrRd|j ˆ ¡ S dS )z'return an astroid.Return node as stringé   c                s   g | ]}|  ˆ ¡‘qS r   )r
   )r   r   )r   r   r   r   ¬  s    z0AsStringVisitor.visit_return.<locals>.<listcomp>z	return %sz, Úreturn)Zis_tuple_returnÚlenr#   rw   r   r
   )r   r   rw   r   )r   r   Úvisit_return©  s    zAsStringVisitor.visit_returnc             C   s   |j  | ¡S )z&return an astroid.Index node as string)r#   r
   )r   r   r   r   r   Úvisit_index´  s    zAsStringVisitor.visit_indexc                s   dd  ‡ fdd„|jD ƒ¡ S )z$return an astroid.Set node as stringz{%s}z, c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   r   )r   r   r   r   º  s    z,AsStringVisitor.visit_set.<locals>.<genexpr>)r   rw   )r   r   r   )r   r   Ú	visit_set¸  s    zAsStringVisitor.visit_setc                s*   d|j  ˆ ¡d ‡ fdd„|jD ƒ¡f S )z(return an astroid.SetComp node as stringz{%s %s}r@   c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   r   )r   r   r   r   À  s    z0AsStringVisitor.visit_setcomp.<locals>.<genexpr>)rn   r
   r   rV   )r   r   r   )r   r   Úvisit_setcomp¼  s    
zAsStringVisitor.visit_setcompc             C   s`   |j r|j  | ¡nd}|jr(|j | ¡nd}|jr>|j | ¡nd}|rTd|||f S d||f S )z&return an astroid.Slice node as stringr8   z%s:%s:%sz%s:%s)Úlowerr
   ÚupperÚstep)r   r   r‹   rŒ   r   r   r   r   Úvisit_sliceÃ  s    zAsStringVisitor.visit_slicec             C   s^   |j }|jj ¡ dkr|j}| | ¡}|jj ¡ dkrH|jrH|dd… }d|  ||j¡|f S )z*return an astroid.Subscript node as stringÚindexÚtupler„   éÿÿÿÿz%s[%s])ÚsliceÚ	__class__Ú__name__r‹   r#   r
   rw   r   )r   r   ÚidxZidxstrr   r   r   Úvisit_subscriptÌ  s    
zAsStringVisitor.visit_subscriptc             C   sX   d|   |j¡ g}x|jD ]}| | | ¡¡ qW |jrN| d|   |j¡ ¡ d |¡S )z*return an astroid.TryExcept node as stringztry:
%szelse:
%sr	   )r   r<   Zhandlersrq   r
   rd   r   )r   r   ZtrysZhandlerr   r   r   Úvisit_tryexceptØ  s    zAsStringVisitor.visit_tryexceptc             C   s   d|   |j¡|   |j¡f S )z+return an astroid.TryFinally node as stringztry:
%s
finally:
%s)r   r<   Z	finalbody)r   r   r   r   r   Úvisit_tryfinallyá  s    
z AsStringVisitor.visit_tryfinallyc                s@   t |jƒdkr"d|jd  ˆ ¡ S dd ‡ fdd„|jD ƒ¡ S )z&return an astroid.Tuple node as stringr„   z(%s, )r   z(%s)z, c             3   s   | ]}|  ˆ ¡V  qd S )N)r
   )r   r   )r   r   r   r   ì  s    z.AsStringVisitor.visit_tuple.<locals>.<genexpr>)r†   rw   r
   r   )r   r   r   )r   r   Úvisit_tupleè  s    zAsStringVisitor.visit_tuplec             C   s,   |j dkrd}n|j }d||  ||j¡f S )z(return an astroid.UnaryOp node as stringÚnotznot z%s%s)r&   r   Zoperand)r   r   Úoperatorr   r   r   Úvisit_unaryopî  s    
zAsStringVisitor.visit_unaryopc             C   s:   d|j  | ¡|  |j¡f }|jr6d||  |j¡f }|S )z&return an astroid.While node as stringzwhile %s:
%sz%s
else:
%s)r   r
   r   r<   rd   )r   r   Zwhilesr   r   r   Úvisit_whileö  s    zAsStringVisitor.visit_whilec                s.   d  ‡ fdd„|jD ƒ¡}d|ˆ  |j¡f S )z%return an astroid.With node as stringz, c             3   s6   | ].\}}d |  ˆ ¡ |r(d|  ˆ ¡ p*d V  qdS )z%sz as %sr8   N)r
   )r   rA   Úvars)r   r   r   r      s   z-AsStringVisitor.visit_with.<locals>.<genexpr>zwith %s:
%s)r   rS   r   r<   )r   r   rS   r   )r   r   Ú
visit_withý  s    
zAsStringVisitor.visit_withc             C   s8   |j rd|j  | ¡ nd}d| }|jjr.|S d|f S )z!yield an ast.Yield node as stringr@   r8   Úyieldz(%s))r#   r
   ÚparentÚis_statement)r   r   Úyi_valrA   r   r   r   Úvisit_yield  s
    zAsStringVisitor.visit_yieldc             C   s   d|j  | ¡ S )zreturn Starred node as stringÚ*)r#   r
   )r   r   r   r   r   Úvisit_starred  s    zAsStringVisitor.visit_starredc             C   s   |j  | ¡S )N)r¡   r
   )r   r   r   r   r   Úvisit_frozenset  s    zAsStringVisitor.visit_frozensetc             C   s   |j  | ¡S )N)r¡   r
   )r   r   r   r   r   Úvisit_super  s    zAsStringVisitor.visit_superc             C   s   t |ƒS )N)Ústr)r   r   r   r   r   Úvisit_uninferable  s    z!AsStringVisitor.visit_uninferableN)T)T)Mr”   Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r   r   r!   r$   r'   r)   r*   r-   r/   r1   r7   r?   rB   rE   rH   rJ   rK   rL   rM   rP   rR   rQ   rU   rW   rX   rY   r]   r^   r_   rb   rc   re   rk   rm   ro   r   rp   rr   rs   rt   ru   rv   rx   ry   rz   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       s”   

		
	
						r   c                   st   e Zd Z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d„ Zdd„ Zdd„ Z‡ fdd„Z‡  ZS )ÚAsStringVisitor3z8AsStringVisitor3 overwrites some AsStringVisitor methodsc             C   sT   |j r<|jr*d|j  | ¡|j | ¡f }q@d|j  | ¡ }nd}d||  |j¡f S )Nzexcept %s as %sz	except %srZ   z%s:
%s)r[   r    r
   r   r<   )r   r   r\   r   r   r   r]   !  s    
z$AsStringVisitor3.visit_excepthandlerc             C   s   dd  |j¡ S )z)return an astroid.Nonlocal node as stringznonlocal %sz, )r   rj   )r   r   r   r   r   Úvisit_nonlocal.  s    zAsStringVisitor3.visit_nonlocalc             C   s<   |j r8|jr(d|j  | ¡|j | ¡f S d|j  | ¡ S dS )z&return an astroid.Raise node as stringzraise %s from %szraise %sr   )r‚   Úcauser
   )r   r   r   r   r   rƒ   2  s    
zAsStringVisitor3.visit_raisec             C   s8   |j rd|j  | ¡ nd}d| }|jjr.|S d|f S )z- Return an astroid.YieldFrom node as string. r@   r8   z
yield fromz(%s))r#   r
   r¡   r¢   )r   r   r£   rA   r   r   r   Úvisit_yieldfrom=  s
    z AsStringVisitor3.visit_yieldfromc                s   t t| ƒ |¡}d| ¡  S )Nzasync )Úsuperr®   rm   Ústrip)r   r   Zfunction)r“   r   r   Úvisit_asyncfunctiondefF  s    z'AsStringVisitor3.visit_asyncfunctiondefc             C   s   d|j  | ¡ S )Nzawait %s)r#   r
   )r   r   r   r   r   Úvisit_awaitJ  s    zAsStringVisitor3.visit_awaitc             C   s   d|   |¡ S )Nzasync %s)rŸ   )r   r   r   r   r   Úvisit_asyncwithM  s    z AsStringVisitor3.visit_asyncwithc             C   s   d|   |¡ S )Nzasync %s)re   )r   r   r   r   r   Úvisit_asyncforP  s    zAsStringVisitor3.visit_asyncforc                s"   d  ‡ fdd„|jD ƒ¡}d| S )Nr8   c             3   s,   | ]$}t |ƒjd kr|jn| ˆ ¡V  qdS )ZConstN)r[   r”   r#   r
   )r   r#   )r   r   r   r   W  s   z3AsStringVisitor3.visit_joinedstr.<locals>.<genexpr>zf'%s')r   r.   )r   r   Ústringr   )r   r   Úvisit_joinedstrS  s    
z AsStringVisitor3.visit_joinedstrc             C   s   d|j  | ¡ S )Nz{%s})r#   r
   )r   r   r   r   r   Úvisit_formattedvalue\  s    z%AsStringVisitor3.visit_formattedvaluec                s"   d|j rdndtt| ƒ |¡f S )z.return an astroid.Comprehension node as stringz%s%szasync r8   )Zis_asyncr²   r®   rE   )r   r   )r“   r   r   rE   _  s    z$AsStringVisitor3.visit_comprehension)r”   r«   r¬   r­   r]   r¯   rƒ   r±   r´   rµ   r¶   r·   r¹   rº   rE   Ú__classcell__r   r   )r“   r   r®     s   		r®   c             C   sF   g }x6| D ].\}}|dk	r.|  d||f ¡ q
|  |¡ q
W d |¡S )z5return a list of (name, asname) formatted as a stringNz%s as %sz, )rq   r   )rj   Z_namesr    Zasnamer   r   r   ri   g  s    ri   )é   r   z    )r­   Úsysr   r   r®   ri   Úversion_infoZto_coder   r   r   r   Ú<module>   s       I
