B
    A!p\                 @   sZ   d Z ddlZddlmZ ddl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)
interfaces)checkers)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)zoverlapping-exceptz8Used when exceptions in handler overlap or are identical zoverlapping-exceptc          
   C   sz  xr|j D ]f}|jdkrq
t|jtjr,q
ytt|j}W n tjk
rV   w
Y nX g }x|D ]\}}|tjkrzqdt|tj	rt
|r|j}t|tjsqddd | D }x|D ]\}}	dd |	 D }
||	kr| jd|jd| | f d q|	|ks||
kr||
kr$|n|}|	|kr6|n|}| jd|jd| | f d qW |||fg7 }qdW q
W dS )	zcheck for empty exceptNc             S   s   g | ]}t |tjr|qS r   )
isinstanceastroidClassDef).0ancr   r   Glib/python3.7/site-packages/pylint/extensions/overlapping_exceptions.py
<listcomp><   s    z@OverlappingExceptionsChecker.visit_tryexcept.<locals>.<listcomp>c             S   s   g | ]}t |tjr|qS r   )r	   r
   r   )r   r   r   r   r   r   A   s   zoverlapping-exceptz%s and %s are the same)nodeargsz%s is an ancestor class of %s)Z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#   sH    


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   registerX   s    r   )r   r
   Zpylintr   r   Zpylint.checkersr   Zpylint.checkers.exceptionsr   ZBaseCheckerr   r   r   r   r   r   <module>   s   G