3
/*^[                 @   s   d Z ddlmZmZmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZmZmZmZ erddlmZ ndd	lmZ dd
lmZ dddZdddZdS )z
All the crazy things we have to do to handle Python functions in 3.0-3.5 or so.
The saga of changes before and after is in other files.
    )iscodecode_has_star_argcode_has_star_star_argCO_GENERATOR)Code)
SyntaxTree)PYTHON3)ParserError)print_docstringfind_all_globalsfind_globals_and_nonlocals	find_none)zip_longest)izip_longest)maybe_show_tree_param_default   Nc       2         s,   fdd}|d8 j jds td}x2tt|d d9d:D ]}|| dkr:|| }P q:W i }|dkr|d d;krt|d jtr|d j}	d<}
|d }t| }x>||kr|| j d=kr|| d ||	|
 < |
d8 }
|d8 }qW |d> }t|jtr0|d|jd  }|j\}}}d|j krFt|d }n|d|j }d}d}i }x,|j D ] } j	|| dd}|||< qTW d j
  kodkn  rd?}nd j
krd@}nd}|r|rt|| jr|| j dkst|| j}n|j}t|stt| j j}|j}|j}t|jd| }|dkrPt|j|||  }y  j|j|j|d|jkd}W nB ttfk
r } z  jt|  js| _dS d}~X nX |jd } j}|rֈ jd n
 jd  jj j ddA }t|}d| } j!} t|t| }
d}!x\|d|
 D ]L}" j|!|" d}!|"|kr, jd||"   |  j!kr,d| }! j!} q,W |
dkrdnd}!x|D ]}|dkr j|! ||
 }" j|" |"|kr||" }#t|#tr|#d }# jd|#  n t|#t"r jd  j#|#  jd  |
d7 }
 j#| |  j!krLd| }! j!} nd}!qW t$|r|j||  }$|r|$|kr j|!d!|$||$ f  n j|!d"|$  |d7 }d#}%|dkrt$|s|dkrވ jd$ n
 jd% d&}%n|dkr jd d&}%dg| }x|D ]}|d'kr,|d }|d(krt%|d j&}|j'|}& j	|d dd}'|r||krd)||| |'f ||&< nd*||'f ||&< qW d+d, |D }(xPt(|(D ]D\}
})|)r||
 }||krd-||| f ||
< nd.| ||
< qW  jdj)| d#}%n|dkr"d&}%t*|r|%s< jd |j||  }*|rr|*|krr jd/|*||* f  n jd0|*  |r jd n jd1 d|d jkr
|  j!krt+ rԈ jd|   j!}  jd2 d|kr j|d  n j#||d    j,d3 t|j-dkrP|j-d dk	rP| rPt.  j|j-d  d|_|d4ksdtt/|t0 }+t1|t0 t0 | j
\},}-x,t2|+ j3@ |,B D ]}. j, jd5|. qW x"t2|-D ]}/ j, jd6|/ qW   j3|+8  _3d|jk}0|0ot4| }1 j5||j6|j||1d7 d |_|_dS )Bzf
    Dump function defintion, doc string, and function
    body. This code is specialized for Python 3c                sN   |rF j |dd}t || d||f }|dd dkrB|d7 }|S |S dS )	zebuild parameters:
            - handle defaults
            - handle format tuple parameters
         )indentz%s=%s   Nz= None)traverser   )astnamedefaultvalueresult)self `/home/psgendb/BIRCHDEV/python/lib/python3.6/site-packages/uncompyle6/semantics/make_function3.pybuild_param1   s    z,make_function3_annotate.<locals>.build_paramr   MAKE_Nannotate_tupler   
LOAD_CONST	LOAD_NAMEannotate_argreturnr   )r   g      @g	@r   g=
ףp=@   LOAD_LAMBDAr   )	is_lambdanoneInNameszlambda (
 z, z: %sz,
Zpos_argz: "%s"z: =z*%s: %sz*%sFz, *, z*, Tkwargskwargz	%s: %s=%sz%s=%sc             S   s   g | ]}|d kqS )Nr   ).0cr   r   r   
<listcomp>   s    z+make_function3_annotate.<locals>.<listcomp>z%s: %sz%sz**%s: %sz**%s)z -> :stmtszglobal z	nonlocal )r)   
returnNoner8   r8   )r#   r$   r8   )r%   r"   r8   r   r8   )7kind
startswithAssertionErrorrangelen
isinstanceattrtuplekeysr   versionr   r   scannercurrentclassco_argcountco_kwonlyargcountlistco_varnames	build_ast_tokens
_customizeco_namesr	   ParserError2writestrtolerate_errorsERRORr   fgetvaluesplitline_numberr   Zpreorderr   evalpattrindex	enumeratejoinr   Zno_paramnamesprintln	co_constsr
   r   setr   sorted	mod_globsr   
gen_sourceco_name)2r   noder)   nested	code_nodeZannotate_lastr    r"   Zannotate_argsZannotate_tupijl	args_node	defparamspos_argskw_argsannotate_argcannotate_dictr   nlambda_indexcodeargckwonlyargcount
paramnamesr/   r   pkw_pairsr   	last_linerV   suffixparamaastar_argends_in_commaidxr   other_kwflagstar_star_argall_globalsglobals	nonlocalsgnlhas_nonernr   )r   r   make_function3_annotate*   s\   



































(
r   c       9         sz	  d: fdd	}|d; j jds"td j  ko6dkn  rBd<}nd	 jkrRd=}nd}|d> }i }|j}	t|	trt|	d
kr|	\}
}} n|	\}
}}}d?}d}|r|d8 }|rV|| }|dkrN|d }|d@ }|dko|j jdrN fdd|ddA D }|dB j}t|}|t|ks*tx"t|D ]}|| ||| < q4W |d8 }|r|| }|dkrv|d }|dkr|dC j}|d j jdp|d dk}t|dkrdD}ndE}t|dkr|s|| j dkrd}|d dkr|d7 }|| dkrX|| dkst|}g }x\|| dkrT|j	|| d  |d7 }q(W n,|| dkrn|d7 }||||jd   }n|d|jd  }d}n|d|j }d}|r|rt
|| jr|| j dkst|| j}n|j}t
|s tt| j j}|j}|j}t|jd| }|dkr|rlg }x>t|D ]}|j	|j||   qLW nt|j|||  }|j  |j  y  j|j|j|d|jkd} W nB ttfk
r }! z  jt|!  js|! _dS d}!~!X nX d}t|t| }g }"|rx8t|D ],\}}#|"j	|| || |#|j||  qW x||d d D ]2}$|$|kr|"j	d|$||$ f  n
|"j	|$ q`W n<x:|D ]2}$|$|kr|"j	d|$||$ f  n
|"j	|$ qW |"j  t|rH|j||  }%|r|%|kr|"j	d|%||% f  n|"j	d|%  |r8|"j  |sh|d7 }n |rh|dkrh|"j dd d}|r jddj!|" t| dkr j"| dF dkr j"| dG j# jdr| dH= | dI }&x|&j dkr|&d }&qW |&| dJ< n jd dj!|" d!}'|dkrhd|j$@ sB|dkr2 jd" n
 jd# d$}'n&|dkrh|d dkrh jd d$}'dg| } jd%kr|d }(n||jd  }(|(dkrxH|(D ]@})t%|)d j&}* j"|)d d&d'}+|j'|*},d(|*|+f ||,< qW |(dks  jd)krvd*d |D }-xBt|-D ]6\}}.|.r|t|k rFd+||  ||< n||= qW  jdj!| d!}'n|dkrvd$}'t(|r|'s jd |j||  }/|r|/|krƈ jd,|/||/ f  n jd-|/  |r jd. n6 jd/ |rd0|kr jd1|d0    j)d2 t|j*dkrX|j*d dk	rX| rXt+  j,|j*d  | d3ksftt-| t. }0t/| t. t. | j\}1}2x,t0|0 j1@ |1B D ]}3 j) j,d4|3 qW x"t0|2D ]}4 j) j,d5|4 qW   j1|08  _1d|jk}5|5	ot2|  }6 j3| |j4|j||6d6 | 	rj|j$t5@ 	rjd$}7x |jD ]}8|8dKk	r>d!}7P 	q>W |7	rj j6dL| d|_d|_dS )MzbDump function definition, doc string, and function body in
      Python version 3.0 and above
    Nc                sX    j |dd}t j|| |r0d|||f }nd||f }|d	d dkrT|d7 }|S )
zebuild parameters:
            - handle defaults
            - handle format tuple parameters
        r   )r   z	%s: %s=%sz%s=%sr   Nz= r   r   )r   r   Zshowast)r   r   r   
annotationr   r   )r   r   r   r    W  s    z#make_function3.<locals>.build_paramr   r!   g      @g	@r   g=
ףp=@r'      r   exprdictBUILD_CONST_KEY_MAPc                s   g | ]} j |d dqS )r   )r   )r   )r1   ro   )r   r   r   r3     s    z"make_function3.<locals>.<listcomp>r0   Z	no_kwargsZload_closurer(   r/   r   )r)   r*   z%s: %sz*%s: %sz*%s*zlambda z, yieldr+   Fz, *, z*, Tgffffff
@r   )r   z%s=%sg      @c             S   s   g | ]}|d kqS )Nr   )r1   r2   r   r   r   r3   c  s    z%sz**%s: %sz**%sz: r4   r&   z -> %sr5   r6   zglobal z	nonlocal )r)   r7   YIELD_VALUE
YIELD_FROM%|if False:
%+%|yield None%-)Nr8   r   r9   r8   r8   r   r   r8   r   r9   r8   r   r8   r8   r8   )r   r   )r   )7r:   r;   r<   rC   r@   r?   rA   r>   r=   appendr   r   rD   rE   rF   rG   rH   rI   reverserJ   rK   rL   rM   r	   rN   rO   rP   rQ   rR   rZ   getr   insertr[   r   stripco_flagsrW   rX   rY   r   r\   r]   r
   r   r   r^   r   r_   r`   r   ra   rb   r   Ztemplate_engine)9r   rc   r)   rd   re   r    rp   ri   rn   Z	args_attrrk   rl   rm   closurerf   rv   Zannotate_nodeZannotate_name_nodetypesnamesrh   Zkw_nodeZhave_kwargsZlc_indexZdefault_values_startrj   rq   Zscanner_coderr   rs   rt   r/   r   ru   paramsZdefparamry   r{   Zast_exprr|   Zkw_nodesro   r   r   r}   r~   r   r   r   r   r   r   r   r   r   Zneed_bogus_yieldtokenr   )r   r   make_function36  s   !





$
"












	




(

r   r8   )r   Nr8   )r   N)__doc__Zxdisr   r   r   r   Zuncompyle6.scannerr   Zuncompyle6.parsers.treenoder   
uncompyle6r   Z!uncompyle6.semantics.parser_errorr	   Zuncompyle6.parserrN   Zuncompyle6.semantics.helperr
   r   r   r   	itertoolsr   r   Zuncompyle6.showr   r   r   r   r   r   r   <module>   s   
  