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rt| 	 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rd	|
_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     