File: //opt/alt/python35/lib64/python3.5/lib2to3/fixes/__pycache__/fix_has_key.cpython-35.pyc
��Yf�  �               @   si   d  Z  d d l m Z d d l m Z d d l m Z d d l m Z m Z Gd d �  d e j	 � Z
 d S)	a&  Fixer for has_key().
Calls to .has_key() methods are expressed in terms of the 'in'
operator:
    d.has_key(k) -> k in d
CAVEATS:
1) While the primary target of this fixer is dict.has_key(), the
   fixer will change any has_key() method call, regardless of its
   class.
2) Cases like this will not be converted:
    m = d.has_key
    if m(k):
        ...
   Only *calls* to has_key() are converted. While it is possible to
   convert the above to something like
    m = d.__contains__
    if m(k):
        ...
   this is currently not done.
�   )�pytree)�token)�
fixer_base)�Name�parenthesizec               @   s(   e  Z d  Z d Z d Z d d �  Z d S)�	FixHasKeyTa�  
    anchor=power<
        before=any+
        trailer< '.' 'has_key' >
        trailer<
            '('
            ( not(arglist | argument<any '=' any>) arg=any
            | arglist<(not argument<any '=' any>) arg=any ','>
            )
            ')'
        >
        after=any*
    >
    |
    negation=not_test<
        'not'
        anchor=power<
            before=any+
            trailer< '.' 'has_key' >
            trailer<
                '('
                ( not(arglist | argument<any '=' any>) arg=any
                | arglist<(not argument<any '=' any>) arg=any ','>
                )
                ')'
            >
        >
    >
    c       
   
   C   s.  | s t  � |  j } | j j | j k rC |  j j | j � rC d  S| j d � } | d } | j } d d �  | d D� } | d j	 �  } | j d � }	 |	 r� d d �  |	 D� }	 | j | j
 | j | j | j | j
 | j | j f k r� t | � } t | � d	 k r| d
 } n t j | j | � } d | _ t d d
 d �}
 | r{t d d
 d �} t j | j | |
 f � }
 t j | j
 | |
 | f � } |	 r�t | � } t j | j | f t |	 � � } | j j | j
 | j | j | j | j | j | j | j | j f	 k r!t | � } | | _ | S)N�negation�anchorc             S   s   g  |  ] } | j  �  � q S� )�clone)�.0�nr
   r
   �>/opt/alt/python35/lib64/python3.5/lib2to3/fixes/fix_has_key.py�
<listcomp>S   s   	 z'FixHasKey.transform.<locals>.<listcomp>�before�arg�afterc             S   s   g  |  ] } | j  �  � q Sr
   )r   )r   r
   r
   r
   r   r   W   s   	 �   �    � �in�prefix�not)�AssertionError�syms�parent�typeZnot_test�pattern�match�getr   r   Z
comparisonZand_testZor_testZtestZlambdefZargumentr   �lenr   ZNodeZpowerr   Zcomp_op�tuple�exprZxor_exprZand_exprZ
shift_exprZ
arith_exprZtermZfactor)
�selfZnodeZresultsr   r   r	   r   r   r   r   Zn_opZn_not�newr
   r
   r   �	transformH   sF    	
	!
	"	zFixHasKey.transformN)�__name__�
__module__�__qualname__Z
BM_compatibleZPATTERNr%   r
   r
   r
   r   r   '