o
    Š�bc  ã                   @   sf   d 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
mZmZ dd„ ZG dd	„ d	ejƒZd
S )aª  Fixer for except statements with named exceptions.

The following cases will be converted:

- "except E, T:" where T is a name:

    except E as T:

- "except E, T:" where T is not a name, tuple or list:

        except E as t:
            T = t

    This is done because the target of an "except" clause must be a
    name.

- "except E, T:" where T is a tuple or list literal:

        except E as t:
            T = t.args
é   )Úpytree)Útoken)Ú
fixer_base)ÚAssignÚAttrÚNameÚis_tupleÚis_listÚsymsc                 c   sF   � t | ƒD ]\}}|jtjkr |jd jdkr || |d  fV  qd S )Né    Úexceptr   )Ú	enumerateÚtyper
   Úexcept_clauseÚchildrenÚvalue)ÚnodesÚiÚn© r   ú//usr/lib/python3.10/lib2to3/fixes/fix_except.pyÚfind_excepts   s   €€ýr   c                   @   s   e Zd ZdZdZdd„ ZdS )Ú	FixExceptTa1  
    try_stmt< 'try' ':' (simple_stmt | suite)
                  cleanup=(except_clause ':' (simple_stmt | suite))+
                  tail=(['except' ':' (simple_stmt | suite)]
                        ['else' ':' (simple_stmt | suite)]
                        ['finally' ':' (simple_stmt | suite)]) >
    c                 C   sr  | j }dd„ |d D ƒ}dd„ |d D ƒ}t|ƒD ]ˆ\}}t|jƒdkr¡|jdd… \}}	}
|	 tdd	d
�¡ |
jtjkr™t|  	¡ d	d
�}|
 
¡ }d|_|
 |¡ | 
¡ }|j}t|ƒD ]\}}t|tjƒrh nq\t|
ƒsqt|
ƒr|t|t|tdƒƒƒ}nt||ƒ}t|d |… ƒD ]}| d|¡ q‰| ||¡ q|
jdkr¡d	|
_qdd„ |jd d… D ƒ| | }t |j|¡S )Nc                 S   ó   g | ]}|  ¡ ‘qS r   ©Úclone)Ú.0r   r   r   r   Ú
<listcomp>2   ó    z'FixExcept.transform.<locals>.<listcomp>Útailc                 S   r   r   r   )r   Úchr   r   r   r   4   r   Úcleanupé   é   Úasú )ÚprefixÚ Úargsr   c                 S   r   r   r   )r   Úcr   r   r   r   \   r   é   )r
   r   Úlenr   Úreplacer   r   r   ÚNAMEÚnew_namer   r&   r   Ú
isinstancer   ÚNoder   r	   r   r   ÚreversedÚinsert_child)ÚselfÚnodeÚresultsr
   r   Útry_cleanupr   Úe_suiteÚEÚcommaÚNÚnew_NÚtargetÚsuite_stmtsr   ÚstmtÚassignÚchildr   r   r   r   Ú	transform/   s:   
ÿ

€ zFixExcept.transformN)Ú__name__Ú
__module__Ú__qualname__ÚBM_compatibleÚPATTERNrA   r   r   r   r   r   $   s    r   N)Ú__doc__r'   r   Úpgen2r   r   Ú
fixer_utilr   r   r   r   r	   r
   r   ÚBaseFixr   r   r   r   r   Ú<module>   s     