B
    A!p\²  ã               @   s†   d Z ddl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	 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=Checker for anything related to the async protocol (PEP 492).é    N)Úbases)Ú
exceptions)Úcheckers)Úutils)Ú
interfaces)Údecorated_withc               @   sd   e Zd ZejZdZdddddifddd	ddifd
œZdd„ Ze	 
d¡dd„ ƒZe	 
d¡dd„ ƒZdS )ÚAsyncCheckerÚasynczYield inside async functionzyield-inside-async-functionzQUsed when an `yield` or `yield from` statement is found inside an async function.Z
minversion)é   é   zFAsync context manager '%s' doesn't implement __aenter__ and __aexit__.znot-async-context-managerzxUsed when an async context manager is used with an object that does not implement the async context management protocol.)ZE1700ZE1701c             C   s   t  | d¡| _dg| _d S )Nzignore-mixin-memberszcontextlib.asynccontextmanager)r   Zget_global_optionÚ_ignore_mixin_membersÚ_async_generators)Úself© r   ú4lib/python3.7/site-packages/pylint/checkers/async.pyÚopen*   s    
zAsyncChecker.openc             C   sR   xL|  tj¡D ]<}| ¡ |krtjd d… dks<t|tjƒr| jd|d qW d S )Né   )r
   r   zyield-inside-async-function)Únode)	Znodes_of_classÚastroidZYieldZscopeÚsysÚversion_infoÚ
isinstanceZ	YieldFromÚadd_message)r   r   Zchildr   r   r   Úvisit_asyncfunctiondef0   s    z#AsyncChecker.visit_asyncfunctiondefc          	   C   sÐ   xÊ|j D ]À\}}t |¡}|d ks|tjkr.qt|tjƒrLt|j	| j
ƒr´qnhy| d¡ | d¡ W q tjk
r°   t|tjƒr¬t |¡sŽw| jr¬|jdd …  ¡ dkr¬wY nX q| jd||jfd qW d S )NÚ
__aenter__Ú	__aexit__éûÿÿÿZmixinznot-async-context-manager)r   Úargs)ÚitemsÚchecker_utilsZ
safe_inferr   ZUninferabler   r   ÚAsyncGeneratorr   Úparentr   Úgetattrr   ZNotFoundErrorZInstanceZhas_known_basesr   ÚnameÚlowerr   )r   r   Zctx_mgrÚ_Zinferredr   r   r   Úvisit_asyncwith8   s(    


zAsyncChecker.visit_asyncwithN)Ú__name__Ú
__module__Ú__qualname__r   ZIAstroidCheckerZ__implements__r#   Zmsgsr   r   Zcheck_messagesr   r&   r   r   r   r   r      s   r   c             C   s   |   t| ƒ¡ dS )z-required method to auto register this checkerN)Zregister_checkerr   )Zlinterr   r   r   ÚregisterZ   s    r*   )Ú__doc__r   r   r   r   Zpylintr   Zpylint.checkersr   r   r   Zpylint.checkers.utilsr   ZBaseCheckerr   r*   r   r   r   r   Ú<module>   s   D