o
    ,º]:  ã                   @   s~   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZmZ ddlmZmZmZ dd„ ZG dd	„ d	ejƒZd
S )zD
Fixer for:
(a,)* *b (,c)* [,] = s
for (a,)* *b (,c)* [,] in d: ...
é    )Ú
fixer_base)Úcount)
ÚAssignÚCommaÚCallÚNewlineÚNameÚNumberÚtokenÚsymsÚNodeÚLeaf)ÚindentationÚsuitifyÚ	commatizec                 C   sÊ  g }t | ƒ}t |ƒ}| dkrCttjt|ƒttjttjdƒttj	ttj
dƒt|ƒgƒttjdƒgƒgƒ}| |¡ | ttjddd�¡ ttjttjddd�t|ƒttjttjdƒttj	| dkrct|ƒntdd	ƒttj
dƒ|dkr~ttjttjd
ƒt|ƒgƒntdd	ƒgƒttjdƒttjdƒgƒgƒ}| |¡ |dkrÝ| ttjddd�¡ ttjt|dd�ttjttjdƒttj	ttjttjd
ƒt|ƒgƒttj
dƒgƒttjdƒgƒgƒ}	| |	¡ ttj|ƒ}
|
S )z±
    Accepts num_pre and num_post, which are counts of values
    before and after the starg (not including the starg)
    Returns a source fit for Assign() from fixer_util
    r   ú[ú:ú]ú+ú ©Úprefixé   Ú ú-)Úunicoder   r   Úpowerr   Útrailerr   r
   ÚLSQBÚ	subscriptÚCOLONr	   ÚRSQBÚappendÚPLUSÚfactorÚMINUSÚ
arith_expr)Únum_preÚnum_postÚLISTNAMEÚITERNAMEÚchildrenÚpreÚpostÚpre_partÚ	main_partÚ	post_partÚsource© r2   ú^/var/www/html/myproject/venv/lib/python3.10/site-packages/libpasteurize/fixes/fix_unpacking.pyÚassignment_source   s   J
 
b
r4   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚFixUnpackinga9  
    expl=expr_stmt< testlist_star_expr<
        pre=(any ',')*
            star_expr< '*' name=NAME >
        post=(',' any)* [','] > '=' source=any > |
    impl=for_stmt< 'for' lst=exprlist<
        pre=(any ',')*
            star_expr< '*' name=NAME >
        post=(',' any)* [','] > 'in' it=any ':' suite=any>c           
         s¶   ‡ fdd„dD ƒ\}}}}dd„ |D ƒ}d|_ dd„ |D ƒ}dd„ t|| ¡ g | ƒD ƒ}| tƒ ¡ d	|_ tt| jƒttd
ƒ| ¡ gƒƒ}t|t	t
|ƒt
|ƒ| j| jƒƒ}	||	fS )Nc                 3   ó   � | ]}ˆ   |¡V  qd S ©N©Úget©Ú.0Ún©Úresultsr2   r3   Ú	<genexpr>3   ó   € z4FixUnpacking.fix_explicit_context.<locals>.<genexpr>)r,   Únamer-   r1   c                 S   ó    g | ]}|j tjkr| ¡ ‘qS r2   ©Útyper
   ÚNAMEÚcloner:   r2   r2   r3   Ú
<listcomp>4   ó     z5FixUnpacking.fix_explicit_context.<locals>.<listcomp>r   c                 S   rB   r2   rC   r:   r2   r2   r3   rG   6   rH   c                 S   ó   g | ]}|  ¡ ‘qS r2   ©rF   r:   r2   r2   r3   rG   7   ó    r   Úlist)r   r   rF   r"   r   r   r   r)   r   r4   Úlenr*   )
ÚselfÚnoder>   r,   rA   r-   r1   ÚtargetÚ
setup_lineÚ
power_liner2   r=   r3   Úfix_explicit_context2   s      z!FixUnpacking.fix_explicit_contextc                    sÀ   ‡ fdd„dD ƒ\}}}}dd„ |D ƒ}d|_ dd„ |D ƒ}dd„ t|| ¡ g | ƒD ƒ}| tƒ ¡ | ¡ }d	|_ tt| jƒttd
ƒt| j	ƒgƒƒ}	t|t
t|ƒt|ƒ| j| j	ƒƒ}
|	|
fS )z_
        Only example of the implicit context is
        a for loop, so only fix that.
        c                 3   r6   r7   r8   r:   r=   r2   r3   r?   E   r@   z4FixUnpacking.fix_implicit_context.<locals>.<genexpr>)r,   rA   r-   Úitc                 S   rB   r2   rC   r:   r2   r2   r3   rG   F   rH   z5FixUnpacking.fix_implicit_context.<locals>.<listcomp>r   c                 S   rB   r2   rC   r:   r2   r2   r3   rG   H   rH   c                 S   rI   r2   rJ   r:   r2   r2   r3   rG   I   rK   r   rL   )r   r   rF   r"   r   r   r   r)   r   r*   r4   rM   )rN   rO   r>   r,   rA   r-   rT   rP   r1   rQ   rR   r2   r=   r3   Úfix_implicit_context@   s    " z!FixUnpacking.fix_implicit_contextc           
      C   sD  |   d¡| _|   d¡| _| d¡| d¡}}|durH|  ||¡\}}|j|_t|jƒ|_| t	ƒ ¡ |j}| 
¡ }| ||¡ | ||¡ dS |dur |  ||¡\}}t|ƒ dd„ |jD ƒd }	d	|_|	jd
 j|_t|	jd ƒ|	jd _|	 dt	ƒ ¡ |	 d|¡ |	 dt	ƒ ¡ |	 d|¡ | d¡ t| jdd�¡ dS dS )a­  
        a,b,c,d,e,f,*g,h,i = range(100) changes to
        _3to2list = list(range(100))
        a,b,c,d,e,f,g,h,i, = _3to2list[:6] + [_3to2list[6:-2]] + _3to2list[-2:]

        and

        for a,b,*c,d,e in iter_of_iters: do_stuff changes to
        for _3to2iter in iter_of_iters:
            _3to2list = list(_3to2iter)
            a,b,c,d,e, = _3to2list[:2] + [_3to2list[2:-2]] + _3to2list[-2:]
            do_stuff
        Ú	_3to2listÚ	_3to2iterÚexplÚimplNc                 S   s   g | ]
}|j tjkr|‘qS r2   )rD   r   Úsuite)r;   Úkr2   r2   r3   rG   p   s    z*FixUnpacking.transform.<locals>.<listcomp>r   r   r   é   Úlstr   r   )Únew_namer)   r*   r9   rS   r   r   ÚparentÚappend_childr   ÚremoveÚinsert_childrU   r   r+   ÚvalueÚreplacer   )
rN   rO   r>   rX   rY   rQ   rR   r_   ÚirZ   r2   r2   r3   Ú	transformS   s2   õzFixUnpacking.transformN)Ú__name__Ú
__module__Ú__qualname__ÚPATTERNrS   rU   rf   r2   r2   r2   r3   r5   &   s
    
r5   N)Ú__doc__Úlib2to3r   Ú	itertoolsr   Úlib2to3.fixer_utilr   r   r   r   r   r	   r
   r   r   r   Úlibfuturize.fixer_utilr   r   r   r4   ÚBaseFixr5   r2   r2   r2   r3   Ú<module>   s    0