3
‡Œði™  ã               @   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 }yt | ƒ}t |ƒ}W n$ tk
r<   t| ƒ}t|ƒ}Y nX | dkr°t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ƒ}|j|ƒ |j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rðt|ƒ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ƒ}|j|ƒ |dk�rè|j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ƒ}	|j|	ƒ 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é   Ú ú-)ÚunicodeÚ	NameErrorÚstrr   r   Úpowerr   Útrailerr   r
   ÚLSQBZ	subscriptÚCOLONr	   ÚRSQBÚappendÚPLUSZfactorÚMINUSZ
arith_expr)Znum_preZnum_postÚLISTNAMEÚITERNAMEÚchildrenÚpreÚpostZpre_partZ	main_partZ	post_partÚsource© r+   úC/tmp/pip-build-6m2fasei/future/libpasteurize/fixes/fix_unpacking.pyÚassignment_source   s&    J
¢

b
r-   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||jƒ g | ƒD ƒ}|jtƒ ƒ d|_ tt| jƒttdƒ|jƒ gƒƒ}t|t	t
|ƒt
|ƒ| j| jƒƒ}	||	fS )Nc             3   s   | ]}ˆ j |ƒV  qd S )N)Úget)Ú.0Ún)Úresultsr+   r,   ú	<genexpr>7   s    z4FixUnpacking.fix_explicit_context.<locals>.<genexpr>r(   Únamer)   r*   c             S   s    g | ]}|j tjkr|jƒ ‘qS r+   )Útyper
   ÚNAMEÚclone)r0   r1   r+   r+   r,   ú
<listcomp>8   s    z5FixUnpacking.fix_explicit_context.<locals>.<listcomp>r   c             S   s    g | ]}|j tjkr|jƒ ‘qS r+   )r5   r
   r6   r7   )r0   r1   r+   r+   r,   r8   :   s    c             S   s   g | ]}|j ƒ ‘qS r+   )r7   )r0   r1   r+   r+   r,   r8   ;   s    r   Úlist)r(   r4   r)   r*   )r   r   r7   r"   r   r   r   r%   r   r-   Úlenr&   )
ÚselfÚnoder2   r(   r4   r)   r*   ÚtargetÚ
setup_lineÚ
power_liner+   )r2   r,   Úfix_explicit_context6   s       z!FixUnpacking.fix_explicit_contextc                sÀ   ‡ fdd„dD ƒ\}}}}dd„ |D ƒ}d	|_ d
d„ |D ƒ}dd„ t||jƒ g | ƒD ƒ}|jtƒ ƒ |jƒ }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   s   | ]}ˆ j |ƒV  qd S )N)r/   )r0   r1   )r2   r+   r,   r3   I   s    z4FixUnpacking.fix_implicit_context.<locals>.<genexpr>r(   r4   r)   Úitc             S   s    g | ]}|j tjkr|jƒ ‘qS r+   )r5   r
   r6   r7   )r0   r1   r+   r+   r,   r8   J   s    z5FixUnpacking.fix_implicit_context.<locals>.<listcomp>r   c             S   s    g | ]}|j tjkr|jƒ ‘qS r+   )r5   r
   r6   r7   )r0   r1   r+   r+   r,   r8   L   s    c             S   s   g | ]}|j ƒ ‘qS r+   )r7   )r0   r1   r+   r+   r,   r8   M   s    r   r9   )r(   r4   r)   rA   )r   r   r7   r"   r   r   r   r%   r   r&   r-   r:   )r;   r<   r2   r(   r4   r)   rA   r=   r*   r>   r?   r+   )r2   r,   Úfix_implicit_contextD   s     " z!FixUnpacking.fix_implicit_contextc       
      C   s@  | j dƒ| _| j dƒ| _|jdƒ|jdƒ }}|dk	rŽ| j||ƒ\}}|j|_t|jƒ|_|jt	ƒ ƒ |j}|j
ƒ }|j||ƒ |j||ƒ n®|dk	�r<| j||ƒ\}}t|ƒ dd„ |jD ƒd }	d	|_|	jd
 j|_t|	jd ƒ|	jd _|	jdt	ƒ ƒ |	jd|ƒ |	jdt	ƒ ƒ |	jd|ƒ |jdƒjt| jdd�ƒ 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
        Z	_3to2listZ	_3to2iterÚexplÚimplNc             S   s   g | ]}|j tjkr|‘qS r+   )r5   r   Úsuite)r0   Úkr+   r+   r,   r8   t   s    z*FixUnpacking.transform.<locals>.<listcomp>r   r   r   é   Úlstr   )r   )Únew_namer%   r&   r/   r@   r   r   ÚparentZappend_childr   ÚremoveZinsert_childrB   r   r'   ÚvalueÚreplacer   )
r;   r<   r2   rC   rD   r>   r?   rJ   ÚirE   r+   r+   r,   Ú	transformW   s0    
zFixUnpacking.transformN)Ú__name__Ú
__module__Ú__qualname__ZPATTERNr@   rB   rO   r+   r+   r+   r,   r.   *   s   
r.   N)Ú__doc__Zlib2to3r   Ú	itertoolsr   Zlib2to3.fixer_utilr   r   r   r   r   r	   r
   r   r   r   Zlibfuturize.fixer_utilr   r   r   r-   ZBaseFixr.   r+   r+   r+   r,   Ú<module>   s   0