a XC?h| �@sBdZddlmZddlmZddlmZmZGdd�dej�ZdS)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)� fixer_base)�Name� parenthesizec@seZdZdZdZdd�ZdS)� FixHasKeyTa� anchor=power< before=any+ trailer< '.' 'has_key' > trailer< '(' ( not(arglist | argument) arg=any ','> ) ')' > after=any* > | negation=not_test< 'not' anchor=power< before=any+ trailer< '.' 'has_key' > trailer< '(' ( not(arglist | argument) arg=any ','> ) ')' > > > c Cs�|sJ�|j}|jj|jkr.|j�|j�r.dS|�d�}|d}|j}dd�|dD�}|d��}|�d�} | r�dd�| D�} |j|j |j|j |j |j |j |jfvr�t|�}t|�d kr�|d }nt�|j|�}d |_td d d �} |�rtdd d �} t�|j| | f�} t�|j || |f�} | �rBt| �} t�|j| ft| ��} |jj|j |j|j|j|j|j|j|j|jf v�r|t| �} || _| S)N�negation�anchorcSsg|] }|���qS���clone��.0�nr r �>/opt/alt/python39/lib64/python3.9/lib2to3/fixes/fix_has_key.py� R�z'FixHasKey.transform..�before�arg�aftercSsg|] }|���qSr r r r r rrVr��� �in)�prefix�not)�syms�parent�typeZnot_test�pattern�match�getrr Z comparisonZand_testZor_test�testZlambdefZargumentr�lenrZNodeZpowerrZcomp_op�tuple�exprZxor_exprZand_exprZ shift_exprZ arith_exprZtermZfactor) �selfZnodeZresultsrrrrrrrZn_opZn_not�newr r r� transformGsL �   �    �zFixHasKey.transformN)�__name__� __module__� __qualname__Z BM_compatibleZPATTERNr'r r r rr&srN) �__doc__�rrZ fixer_utilrrZBaseFixrr r r r�s