a
    =a                     @   sR   d Z ddlZddlmZmZ ddlmZ ddlmZ G dd dej	Z
dd	 ZdS )
z!Looks for overlapping exceptions.    N)checkers
interfaces)utils)_annotated_unpack_inferc                   @   s<   e Zd ZdZejZdZddiZdZ	dZ
eddd	 Zd
S )OverlappingExceptionsCheckerzChecks for two or more exceptions in the same exception handler
    clause that are identical or parts of the same inheritance hierarchy
    (i.e. overlapping).zoverlap-exceptZW0714)zOverlapping exceptions (%s)overlapping-exceptz8Used when exceptions in handler overlap or are identical r   c              
   C   sh  |j D ]Z}|jdu rqt|jtjr(qztt|j}W n tjyR   Y qY n0 g }|D ]\}}|tju rrq\t|tj	rt
|r|j}t|tjsq\dd | D }|D ]\}}	dd |	 D }
||	kr| jd|jd| | f d q|	|v s
||
v r||
v r|n|}|	|v r*|n|}| jd|jd| | f d q|||fg7 }q\qdS )	zcheck for empty exceptNc                 S   s   g | ]}t |tjr|qS r	   
isinstanceastroidClassDef.0Zancr	   r	   Glib/python3.9/site-packages/pylint/extensions/overlapping_exceptions.py
<listcomp>7   s   z@OverlappingExceptionsChecker.visit_tryexcept.<locals>.<listcomp>c                 S   s   g | ]}t |tjr|qS r	   r
   r   r	   r	   r   r   <   s   r   z%s and %s are the same)nodeargsz%s is an ancestor class of %s)handlerstyper   r   ZBoolOplistr   ZInferenceErrorZUninferableZInstancer   Zinherit_from_std_exZ_proxiedr   Z	ancestorsZadd_messageZ	as_string)selfr   ZhandlerZexcsZhandled_in_clausepartexcZexc_ancestorsZ	prev_partZprev_excZprev_exc_ancestorsZancestorZ
descendantr	   r	   r   visit_tryexcept   sV    


z,OverlappingExceptionsChecker.visit_tryexceptN)__name__
__module____qualname____doc__r   ZIAstroidCheckerZ__implements__nameZmsgsZpriorityZoptionsr   Zcheck_messagesr   r	   r	   r	   r   r      s   r   c                 C   s   |  t|  dS )z.Required method to auto register this checker.N)Zregister_checkerr   )Zlinterr	   r	   r   registerT   s    r    )r   r   Zpylintr   r   Zpylint.checkersr   Zpylint.checkers.exceptionsr   ZBaseCheckerr   r    r	   r	   r	   r   <module>   s   G