
    ex5                        d dl mZ d dlZd dlmZmZmZmZ d dlm	Z	 d dl
mZmZ d dlmZmZ d dlmZ erd dlmZ ej(                  d	k\  rd d
lmZ nd d
lmZ  G d de      ZddZy)    )annotationsN)TYPE_CHECKINGTupleTypecast)nodes)BaseCheckerutils)only_required_for_messages
safe_infer)	INFERENCE)PyLinter)   
   )	TypeGuardc            	      X   e Zd ZdZdZddddddd	d
ifdddd	d
ifdZddddddffZd$dZ ed      d%d       Z	 ed      d&d       Z
 ed      d'd       Z ed      d(d       Z ed      d)d       Zd&dZd)dZe	 	 	 	 	 	 d*d        Ze	 	 	 	 	 	 d+d!       Z ed      d,d"       Zy#)-CodeStyleCheckeram  Checkers that can improve code consistency.

    As such they don't necessarily provide a performance benefit and
    are often times opinionated.

    Before adding another checker here, consider this:
    1. Does the checker provide a clear benefit,
       i.e. detect a common issue or improve performance
       => it should probably be part of the core checker classes
    2. Is it something that would improve code consistency,
       maybe because it's slightly better with regard to performance
       and therefore preferred => this is the right place
    3. Everything else should go into another extension
    
code_style)z<Consider using namedtuple or dataclass for dictionary values&consider-using-namedtuple-or-dataclasszUEmitted when dictionary values can be replaced by namedtuples or dataclass instances.)z0Consider using an in-place tuple instead of listconsider-using-tuplezOnly for style consistency! Emitted where an in-place defined ``list`` can be replaced by a ``tuple``. Due to optimizations by CPython, there is no performance benefit from it.)zUse '%s' insteadconsider-using-assignment-exprzEmitted when an if assignment is directly followed by an if statement and both can be combined by using an assignment expression ``:=``. Requires Python 3.8 and ``py-version >= 3.8``.z+Use '%s' to do an augmented assign directlyconsider-using-augmented-assignzEmitted when an assignment is referring to the object that it is assigning to. This can be changed to be an augmented assign.
Disabled by default!default_enabledFz8Prefer 'typing.NamedTuple' over 'collections.namedtuple'prefer-typing-namedtuplez'typing.NamedTuple' uses the well-known 'class' keyword with type-hints for readability (it's also faster as it avoids an internal exec call).
Disabled by default!)R6101R6102R6103R6104R6105zmax-line-length-suggestionsintr   z<int>zMax line length for which to sill emit suggestions. Used to prevent optional suggestions which would get split by a code formatter (e.g., black). Will default to the setting for ``max-line-length``.)typedefaultmetavarhelpc                    | j                   j                  j                  }|dk\  | _        |dk\  | _        | j                   j                  j
                  xs  | j                   j                  j                  | _        y )N)r      )r      )linterconfig
py_version
_py36_plus
_py38_plusmax_line_length_suggestionsmax_line_length_max_length)selfr*   s     >/usr/lib/python3/dist-packages/pylint/extensions/code_style.pyopenzCodeStyleChecker.opene   sb    [[''22
$.$.KK:: 2{{!!11 	    c                    | j                   rEt        |j                        }|r-|j                         dk(  r| j	                  d|t
               y y y y )Nzcollections.namedtupler   )node
confidence)r+   r   funcqnameadd_messager   )r0   r5   calleds      r1   
visit_callzCodeStyleChecker.visit_calln   sO    ??		*F&,,.,DD  .Ti !  Ev r3   r   c                &    | j                  |       y N))_check_dict_consider_namedtuple_dataclassr0   r5   s     r1   
visit_dictzCodeStyleChecker.visit_dictw   s    66t<r3   r   c                    t        |j                  t        j                        r| j	                  d|j                         y y Nr   r5   
isinstanceiterr   Listr9   r?   s     r1   	visit_forzCodeStyleChecker.visit_for{   1    dii,3$))D -r3   c                    t        |j                  t        j                        r| j	                  d|j                         y y rB   rD   r?   s     r1   visit_comprehensionz$CodeStyleChecker.visit_comprehension   rI   r3   r   c                @    | j                   r| j                  |       y y r=   )r,   %_check_consider_using_assignment_exprr?   s     r1   visit_ifzCodeStyleChecker.visit_if   s    ??66t< r3   c                   t        |j                  t        j                  t        j                  f      r.t        |j                  j                  t        j
                        s}t        |j                  t        j                        rXt        |j                  j                  t        j                        r*t        j                  |j                  j                  d      syt        |j                        dkD  rt        d |j                  D              rwt        t        t        j                     t         f   }t#               }|j                  D ]  \  }}t%        t        j&                  |      }|j                  D ]q  \  }}t)        |      |j+                         f}||v r&t-        |      }t        |t        j.                        r|j1                         dk(  s  y|j3                  |       s  g }	|j                  D ]J  \  }}t%        t        j&                  |      }|	j5                  t7        d |j                  D                     L t#        |	d         }
|	dd D ]  }|
j9                  |        |
sy| j;                  d|	       yt        |j                        dkD  rt        d
 |j                  D              rt        |j                  d   d   j<                        }|dk(  ry|j                  dd D ]  \  }}t        |j<                        |k7  s y |j                  D ]#  \  }}t        d |j<                  D              s# y | j;                  d|	       yyy)zFCheck if dictionary values can be replaced by Namedtuple or Dataclass.FinalN   c              3  V   K   | ]!  \  }}t        |t        j                         # y wr=   rE   r   Dict.0_
dict_values      r1   	<genexpr>zMCodeStyleChecker._check_dict_consider_namedtuple_dataclass.<locals>.<genexpr>   s$      '
3@1jJz5::.'
s   ')zbuiltins.strc              3  X   K   | ]"  \  }}t        |      |j                         f $ y wr=   )r!   	as_string)rV   keyrW   s      r1   rY   zMCodeStyleChecker._check_dict_consider_namedtuple_dataclass.<locals>.<genexpr>   s#     V6349cmmo6Vs   (*r   r   rC   c              3  v   K   | ]1  \  }}t        |t        j                  t        j                  f       3 y wr=   )rE   r   rG   r   rU   s      r1   rY   zMCodeStyleChecker._check_dict_consider_namedtuple_dataclass.<locals>.<genexpr>   s0      '
: zEJJ#<='
s   79c              3  P   K   | ]  }t        |t        j                           y wr=   rS   )rV   entrys     r1   rY   zMCodeStyleChecker._check_dict_consider_namedtuple_dataclass.<locals>.<genexpr>   s     Rz%4Rs   $&)rE   parentr   Assign	AnnAssignModuletarget
AssignNamer
   is_assign_name_annotated_withlenitemsallr   r   NodeNGstrsetr   rT   r!   r[   r   Constpytypeaddappendtupleintersection_updater9   elts)r0   r5   	KeyTupleTkeys_checkedrW   rX   r\   	key_tupleinferred
key_tupleskeys_intersectionsub_key_tupleslist_lengths                r1   r>   z:CodeStyleChecker._check_dict_consider_namedtuple_dataclass   s    t{{U\\5??$CD4;;--u||<$++u74;;--u/?/?@33DKK4F4FP  tzz?Q3 '
DHJJ'
 $
 d5<<0#56I ,/5L!% 0:!%**j9
(.. 
0FC!%cCMMO <I L0 )#H"8U[[9$OO-? $$Y/
00 79J!% :!%**j9
!!VZEUEUVV
 14JqM0B",QR. F!55nEF$EDQ tzz?Q3 '
!%'
 $

 djjmA.334Ka!%AB :z';6
 "& :R*//RR EDQ%$
r3   c                   d}t        |j                  t        j                        r|j                  }nt        |j                  t        j                        r^|j                  j
                  dk(  rEt        |j                  j                  t        j                        r|j                  j                  }nt        |j                  t        j                        rgt        |j                  j                  t        j                        r9t        |j                  j                        dk(  r|j                  j                  }ny|j                         }t        j                  ||j                        rt        j                  ||j                        ry|j                  j!                         j#                  |j                  d|j                   d|j$                  j!                          dd      }d| d}|j&                  %t        |      |j&                  z   | j(                  kD  st        |      | j(                  kD  ry| j+                  d	||f
       yy)aY  Check if an assignment expression (walrus operator) can be used.

        For example if an assignment is directly followed by an if statement:
        >>> x = 2
        >>> if x:
        >>>     ...

        Can be replaced by:
        >>> if (x := 2):
        >>>     ...

        Note: Assignment expressions were added in Python 3.8
        NnotrQ   (z := )zif :r   )r5   args)rE   testr   NameUnaryOpopoperandCompareleftrg   opsprevious_siblingr   _check_prev_sibling_to_if_stmtname(_check_ignore_assignment_expr_suggestionr[   replacevalue
col_offsetr/   r9   )r0   r5   	node_nameprev_siblingtest_str
suggestions         r1   rM   z6CodeStyleChecker._check_consider_using_assignment_expr   s    (,	dii,		Ityy%--0		%499,,ejj9		))Ityy%--0499>>5::6DIIMM"a'		I ,,.::)..

  HHinn  yy**,44INN#4(:(:(D(D(F'GqIH
 xj*J+
Odoo58H8HHz?T%5%550 ]  3
r3   c                   | | j                   | j                  z
  dk7  ryt        | t        j                        r\t        | j                        dk(  rDt        | j                  d   t        j                        r| j                  d   j                  |k(  ryt        | t        j                        r>t        | j                  t        j                        r| j                  j                  |k(  ryy)z}Check if previous sibling is an assignment with the same name.

        Ignore statements which span multiple lines.
        r   FrQ   T)tolineno
fromlinenorE   r   ra   rg   targetsre   r   rb   rd   )r   r   s     r1   r   z/CodeStyleChecker._check_prev_sibling_to_if_stmt  s     <#8#8<;R;R#RVW#W |U\\2L(()Q.<//2E4D4DE$$Q',,4|U__5<..0@0@A##((D0r3   c                   t        | j                  t        j                        r2d}| j	                         }t        | j                        dk(  r7t        | j                  d   t        j                        r| j                  d   }nt        |t        j                        r|}|t        |j                  t        j                        rQt        |j                  j                  t        j                        r#|j                  j                  j                  |k(  s=t        |j                  t        j                        r|j                  j                  |k(  ryy)zReturn True if suggestion for assignment expr should be ignored.

        E.g., in cases where a match statement would be a better fit
        (multiple conditions).
        NrQ   r   TF)rE   r   r   r   next_siblingrg   orelseIfr   r   r   )r5   r   next_if_noder   s       r1   r   z9CodeStyleChecker._check_ignore_assignment_expr_suggestion/  s     dii/,0L,,.L4;;1$DKKNEHH)M#{{1~L%((3+ (|00%--@"<#4#4#9#95::F$))..33t;!,"3"3UZZ@$))..$6 r3   c                    t        j                  |      \  }}|r3| j                  d| d||j                  |j                  t
               y y )Nr   =)r   r5   liner   r6   )r
   is_augmented_assignr9   linenor   r   )r0   r5   is_augr   s       r1   visit_assignzCodeStyleChecker.visit_assignO  sQ    ..t4
1t1X[[??$   r3   N)returnNone)r5   z
nodes.Callr   r   )r5   z
nodes.Dictr   r   )r5   z	nodes.Forr   r   )r5   znodes.Comprehensionr   r   )r5   nodes.Ifr   r   )r   znodes.NodeNG | Noner   
str | Noner   z)TypeGuard[nodes.Assign | nodes.AnnAssign])r5   r   r   r   r   bool)r5   znodes.Assignr   r   )__name__
__module____qualname____doc__r   msgsoptionsr2   r   r;   r@   rH   rK   rN   r>   rM   staticmethodr   r   r    r3   r1   r   r      s    D



 :-# "5	
 G&#
 "5

=)DX *"K
	
G"
   :; <   HI= J=   67E 8E   67E 8E   @A= B=FPAF )1;	2 2 (	 >   AB
 C
r3   r   c                8    | j                  t        |              y r=   )register_checkerr   )r(   s    r1   registerr   ]  s    
,V45r3   )r(   r   r   r   )
__future__r   systypingr   r   r   r   astroidr   pylint.checkersr	   r
   pylint.checkers.utilsr   r   pylint.interfacesr   pylint.lintr   version_infor   typing_extensionsr   r   r   r3   r1   <module>r      sM   
 # 
 3 3  . H '$w +A{ AH
6r3   