3
Xw^@                 @   s   d dl mZ d dlmZ d dlmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZmZ d dlmZ d	d
 Zdd ZG dd deeZdS )    )iscode)maybe_show_tree)copy)GenericASTTraversal#GenericASTTraversalPruningException)find_code_node)
SyntaxTree)	NoneTokenToken)RETURN_NONEc          	   C   s<   | dkr| d } y| j dko,| d d jdkS    dS d S )Nsstmtr   assign   __doc__F)kindpattr)node r   [/home/psgendb/BIRCHDEV/python/lib/python3.6/site-packages/uncompyle6/semantics/transform.pyis_docstring   s    r   c          	   C   s4   y$| dko$| d d dko$| d dkS    dS d S )N	call_stmtr   LOAD_STRr   POP_TOPFr   )Zcall_stmt_noder   r   r   is_not_docstring$   s    r   c               @   s|   e Zd ZdddZdd ZdddZd	d
 Zdd Ze ZZ	dddZ
e
 ZZdd Zdd Zdd ZdddZdd ZdS )TreeTransformNFc             C   s   || _ || _|| _d S )N)versionshowastis_pypy)selfr   Zshow_astr   r   r   r   __init__0   s    zTreeTransform.__init__c             C   s    t | jtr| jrt| | d S )N)
isinstancer   dictr   )r   astr   r   r   r   6   s    zTreeTransform.maybe_show_treec             C   sz   |dkr| j }y.d| j| }t| |r:t| |}||}W n tk
rP   dS X x"t|D ]\}}| j|||< q\W |S )a  Walk the tree in roughly 'preorder' (a bit of a lie explained below).
        For each node with typestring name *name* if the
        node has a method called n_*name*, call that before walking
        children.

        In typical use a node with children can call "preorder" in any
        order it wants which may skip children or order then in ways
        other than first to last.  In fact, this this happens.  So in
        this sense this function not strictly preorder.
        NZn_)r"   Z
typestringhasattrgetattrr   	enumeratepreorder)r   r   namefuncikidr   r   r   r&   :   s    

zTreeTransform.preorderc             C   s   | j dkrd}nd}t||j}|d jdkrt|jdkr|jd dk	rtdtd	d
|jd dg}d|_td|dd ||d g }d|_|S )zIf the function has a docstring (this is found in the code
        constants), pull that out and make it part of the syntax
        tree. When generating the source string that AST node rather
        than the code field is seen and used.
        g@      r   closurer   N	docstringr   T)has_argr   n_mkfuncZmkfuncr3   r3   )	r   r   attrr   len	co_constsr   r
   transformed_by)r   r   Z
code_indexcodeZdocstring_noder   r   r   r0   T   s    
zTreeTransform.n_mkfuncc             C   s  |d }|d"kr|S |j d#krZ|d }|dkrD|d dkrD|d }n|d$krP|S |d }n|d }|d%kott|dkr|d }|dkrt|dkr|d }|d }|j dkodt|  kodkn  o|j jdkr|d&k r|d }t}n2|d'ks t|d }|d(kr|S |d }d|_ |d }	|d }
|	d }|dkr|dtfkrZd}n|dkrh|S d}|d j }|d)kr|S t|d tr|d d }	t|||||	|
g}d|_nN|dtfkr| j	rd}nd }n|dkstd!}|	d }t|||||
g}d*|_|S )+ziHere we check if we can turn an `ifstmt` or 'iflaststmtl` into
           some kind of `assert` statementr   testexpr	testexprlifstmtifstmtlr   _ifstmts_jumpl_ifstmts_jumpifstmts_jumplc_stmtsstmts	stmts_optZraise_stmt1r,   AssertionErrortesttrue	testtruel	testfalse
testfalseltestfalse_not_andand_notassert_exprcallZjmp_trueZassert2Z	jmp_falseZ
assert2notLOAD_ASSERTLOAD_GLOBALn_ifstmtZassert0_pypyassertZ	assertnot)r9   r:   )r;   r<   )r>   r=   r?   )r@   rA   rB   )rD   rE   )rF   rG   )rH   rI   )rL   rM   )rN   )
r   r5   first_childr   r	   rC   r    r   r7   r   )r   r   r9   Zifstmts_jumprA   
raise_stmtZtesttrue_or_falserJ   Z	jump_condexprZRAISE_VARARGS_1rK   r   rL   r   r   r   rN   p   s|    








zTreeTransform.n_ifstmtc             C   s(  |d }|d }d}d}t |}|d  ko:t |d kn  rZ|d dkrZ|d d }n|dkrf|S |d jdkr|d }|d jdkr|d }|jdkr|d }d}n|dkot|d todt |d ko|d dko|d jdk r|d }n|dkr|}n|S |d jdkr(|}|d }n|S |jdkrFd|_d|_n^|jdkr`d|_d|_nD|jdkrd|_| j|dd |dkrd|_n|jd krd|_|s$|r |jdkr td|dd }	t |	rtd|d || |	g}
|
|d< ntd|d || g}||d< d|_n |S dS )!z
        Transformation involving if..else statments.
        For example


          if ...
          else
             if ..

        into:

          if ..
          elif ...

          [else ...]

        where appropriate.
        r+   r   Nr   stmt
lastc_stmt
lastl_stmtr;   
iflaststmtiflaststmtlifelsestmtlifelsestmtcifpoplaststmtlr,   
ifelsestmtZ
ifelifstmtZelifstmtifelsestmtrZelifelsestmtrT)
preprocessZelifelifstmtZelifelsestmtrA   n_ifelsestmt)rT   rU   )r;   rV   rW   rX   rY   rZ   )r;   rV   r[   rX   )r;   rV   rW   rZ   )r\   )r[   rY   rX   )r[   rY   rX   )r5   r   r    r   r^   r7   )r   r   r]   Z
else_suitenZ	old_stmtsZelse_suite_indexZlen_nZelse_suite_stmtsZtrailing_elseZelifelse_stmtZ	elif_stmtr   r   r   r^      s    ,     


   



zTreeTransform.n_ifelsestmtc             C   s   |d }|dkst t|dkr|d }|d }|dks<t |d j}|d }|dksZt |jjd}t|dkr|d |krtd	|d |d |||d g}d
|_|S )Nr+   importlist37r   r   storer,   ZIMPORT_NAME_ATTR.Zimport_as37n_import_from37r3   r3   )rC   r5   r4   splitr   r7   )r   r   r`   Zalias37ra   Z
alias_nameZimport_name_attrZdotted_namesr   r   r   rc   \  s    
zTreeTransform.n_import_from37c             C   sJ   |d }|dkrF|d dkrF|d d dks0t |d d |d< d|_|S )Nr   rR   Zget_iter
n_list_for)re   )rC   r7   )r   Zlist_for_noderR   r   r   r   re   u  s    zTreeTransform.n_list_forc             C   s   |j  dkr|d d }|d g}xt|dd  D ]\}}|d d }|d dkr|dkr|dkr|d
 }|j|d d jkr|d= td|d |d |g|d d< d	|d d _|j| |}q4W ||_|S )NSETUP_ANNOTATIONSr   r   rS   
ann_assignr   r,   Zann_assign_initn_stmtsr2   r3   r3   )rP   r%   r4   r   r7   appenddata)r   r   prevZ	new_stmtsr)   r   rg   Zannotate_varr   r   r   rh   ~  s&    

zTreeTransform.n_stmtsc             C   s   | j |}|S )N)r&   )r   r   	is_lambdar   r   r   traverse  s    
zTreeTransform.traversec             C   s4  | j | t|| _| j| jdd| _y$|d d }t|rHd|_d|_W n   Y nX yxtt| jD ]}|| }t|dkr|dkr|| d ||< t	| j| rjt
dtd	d
d| j| d d j| j| d d jdg}d|_| j|= | jjd| P qjW | jd tkr| jj  W n   Y nX | jS )NF)rl   r   Zstring_at_beginning	transformr   r   r.   r   T)r/   offsetr4   r   r3   )r   r   r"   rm   r   r   r7   ranger5   r   r   r
   r4   r   insertr   pop)r   r"   r   r)   r   Zdocstring_astr   r   r   rn     sD    

zTreeTransform.transform)NF)N)F)F)__name__
__module____qualname__r   r   r&   r0   rN   Z	n_ifstmtlZn_iflaststmtlr^   Zn_ifelsestmtcZn_ifelsestmtlrc   re   rh   rm   rn   r   r   r   r   r   /   s   

{
k	
r   N)Zxdisr   Zuncompyle6.showr   r   Zspark_parserr   r   Zuncompyle6.semantics.helperr   Zuncompyle6.parsers.treenoder   Zuncompyle6.scanners.tokr	   r
   Zuncompyle6.semantics.constsr   r   r   objectr   r   r   r   r   <module>   s   	