
    yIf                      d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZmZmZmZ d dlZd dlmZ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!m"Z"m#Z# erd dl$m%Z% eej&        ej'        ej(        ej)        f         Z*ddhZ+ e,d          Z- e,d          Z. e,d          Z/d-dZ0d.dZ1d/d"Z2d0d$Z3d0d%Z4d0d&Z5d0d'Z6d1d(Z7 G d) d*e          Z8 G d+ d,ej9                  Z:dS )2    )annotationsN)Iterator)cached_propertyreduce)Pattern)TYPE_CHECKINGAny
NamedTupleUnioncast)basesnodes)UninferableBase)checkers)utils)_loop_exits_early)node_frame_class)HIGH	INFERENCE
Confidence)PyLinterzitertools.countzitertools.cycle)quitexit)zthreading.lock.acquirezthreading._RLock.acquirezthreading.Semaphore.acquirez*multiprocessing.managers.BaseManager.startz*multiprocessing.managers.SyncManager.start)z_io.openzpathlib.Path.openzcodecs.openzurllib.request.urlopenztempfile.NamedTemporaryFileztempfile.SpooledTemporaryFileztempfile.TemporaryDirectoryztempfile.TemporaryFilezzipfile.ZipFilezzipfile.PyZipFilezzipfile.ZipFile.openzzipfile.PyZipFile.openztarfile.TarFileztarfile.TarFile.openz(multiprocessing.context.BaseContext.Poolzsubprocess.Popenif_nodenodes.Ifreturning_node_classnodes.NodeNGreturnboolc                D    t          fd| j        D                       S )Nc              3  8   K   | ]}t          |          V  d S N
isinstance).0noder   s     c/var/www/piapp/venv/lib/python3.11/site-packages/pylint/checkers/refactoring/refactoring_checker.py	<genexpr>z4_if_statement_is_always_returning.<locals>.<genexpr>D   s.      OO$z$ 455OOOOOO    anybody)r   r   s    `r'   !_if_statement_is_always_returningr-   A   s*     OOOO',OOOOOOr)   r&   	nodes.Tryc                D    t          fd| j        D                       S )z'Detect if all except statements return.c              3  X   K   | ]$}t          fd |j        D                       V  %dS )c              3  8   K   | ]}t          |          V  d S r"   r#   )r%   childr   s     r'   r(   zB_except_statement_is_always_returning.<locals>.<genexpr>.<genexpr>L   s.      NNJu233NNNNNNr)   Nr*   )r%   handlerr   s     r'   r(   z8_except_statement_is_always_returning.<locals>.<genexpr>K   sV         	NNNNNNNNN     r)   )allhandlers)r&   r   s    `r'   %_except_statement_is_always_returningr6   G   s?         }     r)   tokenslist[tokenize.TokenInfo]indexintc                ~              }|j         t          j        k    rdS t          j         dz   d          }d}|D ]B}|j        d         |j        d         k    r$d}|j        t          j        t          j        fvr dS C|sdS d fd} |            }dd	ht          fd
 |         D                       S )a  Check if the given token is a trailing comma.

    :param tokens: Sequence of modules tokens
    :type tokens: list[tokenize.TokenInfo]
    :param int index: Index of token under check in tokens
    :returns: True if the token is a comma which trails an expression
    :rtype: bool
    F   Nr   Tr   r:   c                     t          t          d                             D ]!\  } }|j        t          j        k    r| z
  c S "dS )z5Get the index denoting the start of the current line.Nr   )	enumeratereversedtypetokenizeNEWLINE)subindextokenr9   r7   s     r'   get_curline_index_startz3_is_trailing_comma.<locals>.get_curline_index_startl   sY    (&%.)A)ABB 	( 	(OHezX---x'''' .qr)   yieldc              3  <   K   | ]}d |j         v p|j         v V  dS )=N)string)r%   	prevtokenexpected_tokenss     r'   r(   z%_is_trailing_comma.<locals>.<genexpr>v   sL         	yF9#3#F     r)   )r   r:   )

exact_typerA   COMMA	itertoolsislicestartr@   rB   COMMENTr+   )	r7   r9   rD   left_tokensmore_tokens_on_lineremaining_tokenrE   curline_startrK   s	   ``      @r'   _is_trailing_commarV   Q   s     5ME8>))u"6519d;;K&   #u{1~55"& #H,<h>N+OOOuu u       ,+--M)O    e 34     r)   
nodes.Callc                    |                                  }t          |t          j        t          j        t          j        f          sdS |j        dk    pt          j	        |d          S )NF	__enter__zcontextlib.contextmanager)
framer$   r   FunctionDefastroidBoundMethodUnboundMethodnamer   decorated_with)r&   rZ   s     r'   _is_inside_context_managerra   |   sf    JJLLE!7#68MN   u:$ (<*) ) r)   c                    |                                  }|                                 D ]%}||u r nt          |t          j                  r dS &dS )NTF)rZ   node_ancestorsr$   r   Return)r&   rZ   parents      r'   _is_a_return_statementrf      s]    JJLLE%%''  U??Efel++ 	44	5r)   c                   |                                  }| }||k    rlt          |t          j                  rE|j        d         d         j        }|j        d         d         j        }|| j        cxk    o|k    nc S |j        }||k    ldS )zChecks if one of the node's parents is a ``nodes.With`` node and that the node
    itself is located somewhere under its ``items``.
    r   F)rZ   r$   r   Withitemslinenotolinenore   )r&   rZ   currentitems_start	items_ends        r'   _is_part_of_with_itemsrp      s     JJLLEG
U

guz** 	;!-*1-4Kb)!,5I$+:::::::::. U

 5r)   c                    t          d          }t          | j        t          j                  sdS t          j        | j        j                  }|sdS |                                |v S )zChecks if a call that could be used in a ``with`` statement is used in an
    alternative construct which would ensure that its __exit__ method is called.
    )z'contextlib._BaseExitStack.enter_contextz"contextlib.ExitStack.enter_contextF)		frozensetr$   re   r   Callr   
safe_inferfuncqname)r&   callables_taking_care_of_exitru   s      r'   _will_be_released_automaticallyrx      sl     %.	
% %! dk5:.. uDK,--D u::<<888r)   c                <   t          | j        t          j                  r| | j        j        v S t          | j        t          j                  r| | j        j        k    S t          | j        t          j        t          j        f          rt          | j                  S dS )zCheck whether use of a variable is happening as part of the left-hand
    side of an assignment.

    This requires recursive checking, because destructuring assignment can have
    arbitrarily nested tuples and lists to unpack.
    F)
r$   re   r   Assigntargets	AugAssigntargetTupleList_is_part_of_assignment_targetr&   s    r'   r   r      s     $+u|,, +t{***$+u// *t{)))$+UZ899 :,T[9995r)   c                  V    e Zd ZU dZi Zded<   i Zded<   i Zded<   ddZddZ	ddZ
dS )ConsiderUsingWithStackzzStack for objects that may potentially trigger a R1732 message
    if they are not used in a ``with`` block later on.
    dict[str, nodes.NodeNG]module_scopeclass_scopefunction_scoper   !Iterator[dict[str, nodes.NodeNG]]c              #  >   K   | j         | j        | j        fE d {V  d S r"   )r   r   r   selfs    r'   __iter__zConsiderUsingWithStack.__iter__   s4      ')94;LMMMMMMMMMMr)   rZ   1nodes.FunctionDef | nodes.ClassDef | nodes.Modulec                    t          |t          j                  r| j        S t          |t          j                  r| j        S | j        S )z<Get the stack corresponding to the scope of the given frame.)r$   r   r[   r   ClassDefr   r   )r   rZ   s     r'   get_stack_for_framez*ConsiderUsingWithStack.get_stack_for_frame   sH     eU.// 	'&&eU^,, 	$##  r)   Nonec                8    | D ]}|                                  dS )z'Convenience method to clear all stacks.N)clear)r   stacks     r'   	clear_allz ConsiderUsingWithStack.clear_all   s*     	 	EKKMMMM	 	r)   N)r   r   )rZ   r   r   r   r   r   )__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r    r)   r'   r   r      s           -/L....+-K----.0N0000N N N N! ! ! !     r)   r   c                  f    e Zd ZdZdZi ddddddd	d
ddddddddgifddddddgifddddddddd d!d"d#d$d%d&d'd(d)d*d+i d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQZdRdSdTdUdVdWfdXdYdZd[d\dWfd]d^d_d`dadWffZd fdfZddgZddhZ	e
ddj            Zeddn            ZddpZddrZdduZ ej        dv          ddy            Z ej        ddz          dd|            ZeZddZ ej        dddd          dd            Z ej        d          dd            Z ej        ddv          dd            ZddZddZddZddZddZedd            ZddZ ddZ! ej        dddzdddddd	  	        dd            Z"ddZ# ej        d          dd            Z$ddZ% ej        ddddv          dd            Z& ej        dv          dd            Z' ej        d          d d            Z(d dZ)ed!d            Z*d"dZ+d"dZ, ej        dddddddvddd
  
        d"d            Z- ej        d          d#d            Z.ed$d            Z/d"dÄZ0d"dĄZ1d"dńZ2d%dǄZ3d&dʄZ4d'd̈́Z5ed(dЄ            Z6d)dфZ7d)d҄Z8d)dӄZ9ed*dׄ            Z:d+dلZ;d)dڄZ< ej        dddddߦ          d)d            Z=ed,d            Z>d-dZ? ej        ddddv          d.d            Z@ ej        ddd          d-d            ZAd.dZBd"dZCd"dZDd"dZEed/d            ZFd0dZGd1dZH ej        d          d2d            ZI ej        ddd          d3d            ZJd3dZKed,d            ZLed4d            ZMddZNddZOddZPd5d ZQd6dZRed6d            ZSd7dZTddZUd8dZVd8dZWd9d
ZXd:dZY xZZS (;  RefactoringCheckerzLooks for code which can be refactored.

    This checker also mixes the astroid and the token approaches
    in order to create knowledge about whether an "else if" node
    is a true "else if" node, or an "elif" node.
    refactoringR1701)z?Consider merging these isinstance calls to isinstance(%s, (%s))consider-merging-isinstancezGUsed when multiple consecutive isinstance calls can be merged into one.R1706)zConsider using ternary (%s)consider-using-ternaryz=Used when one of known pre-python 2.5 ternary syntax is used.R1709)z*Boolean expression may be simplified to %ssimplify-boolean-expressionz=Emitted when redundant pre-python 2.5 ternary syntax is used.R1726)z0Boolean condition "%s" may be simplified to "%s"simplifiable-conditionz:Emitted when a boolean condition is able to be simplified.R1727)z3Boolean condition '%s' will always evaluate to '%s'condition-evals-to-constantzGEmitted when a boolean condition can be simplified to a constant value.R1702zToo many nested blocks (%s/%s)too-many-nested-blockszvUsed when a function or a method has too many nested blocks. This makes the code less understandable and maintainable.	old_names)R0101zold-too-many-nested-blocksR1703z(The if statement can be replaced with %ssimplifiable-if-statementz<Used when an if statement can be replaced with 'bool(test)'.)R0102zold-simplifiable-if-statementR1704)z*Redefining argument with the local name %rredefined-argument-from-localzUsed when a local name is redefining an argument, which might suggest a potential error. This is taken in account only for a handful of name binding operations, such as for iteration, with statement assignment and exception handler assignment.R1705)z#Unnecessary "%s" after "return", %sno-else-returnzUsed in order to highlight an unnecessary block of code following an if containing a return statement. As such, it will warn when it encounters an else following a chain of ifs, all of them containing a return statement.R1707)zDisallow trailing comma tupletrailing-comma-tuplea  In Python, a tuple is actually created by the comma symbol, not by the parentheses. Unfortunately, one can actually create a tuple by misplacing a trailing comma, which can lead to potential weird bugs in your code. You should always use parentheses explicitly for creating a tuple.R1708)zEDo not raise StopIteration in generator, use return statement insteadstop-iteration-returnzAccording to PEP479, the raise of StopIteration to end the loop of a generator may lead to hard to find bugs. This PEP specify that raise StopIteration has to be replaced by a simple return statementR1710)z_Either all return statements in a function should return an expression, or none of them should.inconsistent-return-statementszAccording to PEP8, if any return statement returns an expression, any return statements where no value is returned should explicitly state this as return None, and an explicit return statement should be present at the end of the function (if reachable)R1711)z+Useless return at end of function or methoduseless-returnzEmitted when a single "return" or "return None" statement is found at the end of function or method definition. This statement can safely be removed because Python will implicitly return NoneR1712)z5Consider using tuple unpacking for swapping variablesconsider-swap-variableszYou do not have to use a temporary variable in order to swap variables. Using "tuple unpacking" to directly swap variables makes the intention more clear.R1713)zLConsider using str.join(sequence) for concatenating strings from an iterableconsider-using-joinznUsing str.join(sequence) is faster, uses less memory and increases readability compared to for-loop iteration.R1714)zqConsider merging these comparisons with 'in' by using '%s %sin (%s)'. Use a set instead if elements are hashable.consider-using-inzTo check if a variable is equal to one of many values, combine the values into a set or tuple and check if the variable is contained "in" it instead of checking for equality against each of the values. This is faster and less verbose.R1715)z^Consider using dict.get for getting values from a dict if a key is present or a default if notconsider-using-getzUsing the builtin dict.get for getting a value from a dictionary if a key is present or a default if not, is simpler and considered more idiomatic, although sometimes a bit slowerR1716)z0Simplify chained comparison between the operandschained-comparisonzThis message is emitted when pylint encounters boolean operation like "a < b and b < c", suggesting instead to refactor it to "a < b < c"R1717)z)Consider using a dictionary comprehension!consider-using-dict-comprehensiona+  Emitted when we detect the creation of a dictionary using the dict() callable and a transient list. Although there is nothing syntactically wrong with this code, it is hard to read and can be simplified to a dict comprehension. Also it is faster since you don't need to create another transient listR1718)z"Consider using a set comprehension consider-using-set-comprehensionzAlthough there is nothing syntactically wrong with this code, it is hard to read and can be simplified to a set comprehension. Also it is faster since you don't need to create another transient listR1719)z)The if expression can be replaced with %ssimplifiable-if-expressionznUsed when an if expression can be replaced with 'bool(test)' or simply 'test' if the boolean cast is implicit.R1720)z"Unnecessary "%s" after "raise", %sno-else-raisezUsed in order to highlight an unnecessary block of code following an if containing a raise statement. As such, it will warn when it encounters an else following a chain of ifs, all of them containing a raise statement.R1721)z3Unnecessary use of a comprehension, use %s instead.unnecessary-comprehensionzwInstead of using an identity comprehension, consider using the list, dict or set constructor. It is faster and simpler.R1722)z!Consider using 'sys.exit' insteadconsider-using-sys-exitzContrary to 'exit()' or 'quit()', 'sys.exit' does not rely on the site module being available (as the 'sys' module is always available).R1723)z"Unnecessary "%s" after "break", %sno-else-breakzUsed in order to highlight an unnecessary block of code following an if containing a break statement. As such, it will warn when it encounters an else following a chain of ifs, all of them containing a break statement.R1724)z%Unnecessary "%s" after "continue", %sno-else-continuezUsed in order to highlight an unnecessary block of code following an if containing a continue statement. As such, it will warn when it encounters an else following a chain of ifs, all of them containing a continue statement.R1725)z7Consider using Python 3 style super() without argumentssuper-with-argumentszEmitted when calling the super() builtin with the current class and instance. On Python 3 these arguments are the default and they can be omitted.R1728)z+Consider using a generator instead '%s(%s)'consider-using-generatorzOIf your container can be large using a generator will bring better performance.R1729)z Use a generator instead '%s(%s)'use-a-generatorzwComprehension inside of 'any', 'all', 'max', 'min' or 'sum' is unnecessary. A generator would be sufficient and faster.R1730)3Consider using '%s' instead of unnecessary if blockconsider-using-min-builtinzTUsing the min builtin instead of a conditional improves readability and conciseness.R1731)r   consider-using-max-builtinzTUsing the max builtin instead of a conditional improves readability and conciseness.R1732)z8Consider using 'with' for resource-allocating operationsconsider-using-withzEmitted if a resource-allocating assignment or call may be replaced by a 'with' block. By using 'with' the release of the allocated resources is ensured even in the case of an exception.R1733)z5Unnecessary dictionary index lookup, use '%s' insteadunnecessary-dict-index-lookupzEmitted when iterating over the dictionary items (key-item pairs) and accessing the value by index lookup. The value can be accessed directly instead.R1734)z#Consider using [] instead of list()use-list-literalzEmitted when using list() to create an empty list instead of the literal []. The literal is faster as it avoids an additional function call.)z0Consider using '%s' instead of a call to 'dict'.use-dict-literalzEmitted when using dict() to create a dictionary instead of a literal '{ ... }'. The literal is faster as it avoids an additional function call.)z/Unnecessary list index lookup, use '%s' insteadunnecessary-list-index-lookupzEmitted when iterating over an enumeration and accessing the value by index lookup. The value can be accessed directly instead.)zEUse 'yield from' directly instead of yielding each element one by oneuse-yield-fromzzYielding directly from the iterator is faster and arguably cleaner code than yielding each element one by one in the loop.)R1735R1736R1737zmax-nested-blocks   r:   z<int>z:Maximum number of nested blocks for function / method body)defaultr@   metavarhelpznever-returning-functions)zsys.exitzargparse.parse_errorcsvz<members names>zComplete name of functions that never returns. When checking for inconsistent-return-statements if a never returning function is called then it will be considered as an explicit return statement and no message will be printed.z%suggest-join-with-non-empty-separatorTynz<y or n>zLet 'consider-using-join' be raised when the separator to join on would be non-empty (resulting in expected fixes of the type: ``"- " + "
- ".join(items)``)linterr   r   r   c                    t                                          |           i | _        t                      | _        |                                  t                      | _        d| _        d S NF)	super__init___return_nodesr   _consider_using_with_stack_initset_never_returning_functions&_suggest_join_with_non_empty_separator)r   r   	__class__s     r'   r   zRefactoringChecker.__init__  sX       <>*@*B*B'

47EE'<A333r)   c                    g | _         g | _        t                      | _        d| _        | j                                         d S r   )_nested_blocks_elifsr   _reported_swap_nodes_can_simplify_bool_opr   r   r   s    r'   r   zRefactoringChecker._init  s@    ;=-/7:uu!+0"'1133333r)   c                x    t          | j        j        j                  | _        | j        j        j        | _        d S r"   )r   r   confignever_returning_functionsr   %suggest_join_with_non_empty_separatorr   r   s    r'   openzRefactoringChecker.open!  s:    *-K8+
 +
' KD 	333r)   Pattern[str]c                $    | j         j        j        S r"   )r   r  dummy_variables_rgxr   s    r'   
_dummy_rgxzRefactoringChecker._dummy_rgx*  s    {!55r)   r&   nodes.Return | nodes.Assignr   c                ~    t          | j        t          j                  ot          | j        j        t                    S r"   )r$   valuer   Constr   r   s    r'   _is_bool_constz!RefactoringChecker._is_bool_const.  s3    $*ek22 
zJd8
 8
 	
r)   nodes.If | nodes.Tryc                    t          |j        t          j                  r,|j        j        }|r||gk    r|j        |j        f| j        v rdS dS )a
  Check if the given node is an actual elif.

        This is a problem we're having with the builtin ast module,
        which splits `elif` branches into a separate if statement.
        Unfortunately we need to know the exact type in certain
        cases.
        TF)r$   re   r   Iforelserk   
col_offsetr  )r   r&   r  s      r'   _is_actual_elifz"RefactoringChecker._is_actual_elif4  sX     dk58,, 	 ['F  &TF**K1T[@@4ur)   r   c                J   |                      |          rdS t          |j                  dk    st          |j                  dk    rdS |j        d         }|j        d         }t	          |t
          j                  rIt	          |t
          j                  sdS |                     |          }|                     |          }d}nt	          |t
          j                  rt	          |t
          j                  sdS d |j	        D             }d |j	        D             }|r|sdS t          |          t          |          k    rdS |                     |          }|                     |          }d}ndS |r|sdS |j        j        sdS |                     d||f	           dS )
au  Check if the given if node can be simplified.

        The if statement can be reduced to a boolean expression
        in some cases. For instance, if there are two branches
        and both of them return a boolean value that depends on
        the result of the statement's test, then this can be reduced
        to `bool(test)` without losing any functionality.
        Nr<   r   z'return bool(test)'c                P    g | ]#}t          |t          j                  |j        $S r   r$   r   
AssignNamer_   r%   r}   s     r'   
<listcomp>z=RefactoringChecker._check_simplifiable_if.<locals>.<listcomp>b  s=     $ $ $fe&677$$ $ $r)   c                P    g | ]#}t          |t          j                  |j        $S r   r  r  s     r'   r  z=RefactoringChecker._check_simplifiable_if.<locals>.<listcomp>g  s=     # # #fe&677## # #r)   z'var = bool(test)'r   r&   args)r  lenr  r,   r$   r   rd   r  rz   r{   sortedr  add_message)	r   r&   first_branchelse_branchfirst_branch_is_boolelse_branch_is_bool
reduced_tofirst_branch_targetselse_branch_targetss	            r'   _check_simplifiable_ifz)RefactoringChecker._check_simplifiable_ifD  s    %% 	Ft{q  C	NNa$7$7F y|k!nlEL11 	k5<88 #'#6#6|#D#D "&"5"5k"B"B.JJel33 	k5<88 $ $*2$ $ $ 
# #)1# # #
 ( /B *++v6I/J/JJJ#'#6#6|#D#D "&"5"5k"B"B-JJF# 	+> 	F!' 	 F44zmTTTTTr)   r7   r8   c                H   t          |          D ]\  }}|d         }|dk    r2| j                            |d         ||dz            d         g           E| j                            d          r2t          ||          r"|                     d|j        d                    d S )Nr<   elif   r   r   )line)r>   r  extendr   is_message_enabledrV   r$  rP   )r   r7   r9   rD   token_strings        r'   process_tokensz!RefactoringChecker.process_tokens  s    %f-- 	N 	NLE5 8Lv%% ""E!HfUQY.?.B#CDDDD//&  N$VU33N   !7ek!n MMM	N 	Nr)   r   _nodes.Modulec                l    |                      | j        j                   |                                  d S r"   )#_emit_consider_using_with_if_neededr   r   r   r   r5  s     r'   leave_modulezRefactoringChecker.leave_module  s8     	00+8	
 	
 	
 	

r)   r   r.   c                    |                      |           |                     |           |                     |           d S r"   )_check_nested_blocks_check_superfluous_else_return_check_superfluous_else_raiser   r&   s     r'   	visit_tryzRefactoringChecker.visit_try  sD    !!$'''++D111**400000r)   	name_nodenodes.AssignNamec                   | j         r!| j                             |j                  rd S |j        sd S |                                }t          |t          j                  sd S |j        	                    t          j
        t          j        f          D ]0}|j        |j        k    r|                     d||j        f           1d S )N
skip_klassr   r   )r  matchr_   rk   scoper$   r   r[   r!  nodes_of_classr  Lambdar$  )r   rA  rG  defined_arguments       r'   $_check_redefined_argument_from_localz7RefactoringChecker._check_redefined_argument_from_local  s    ? 	t44Y^DD 	F 	F!!%!233 	F %
 9 9%, !: !
 !
 	 	  $	66  3"#.* !   		 	r)   r   r   r   	nodes.Forc                    |                      |           |                     |           |                     |           |j                            t
          j                  D ]}|                     |           d S r"   )r<  $_check_unnecessary_dict_index_lookup$_check_unnecessary_list_index_lookupr}   rH  r   r  rK  )r   r&   r_   s      r'   	visit_forzRefactoringChecker.visit_for  s     	!!$'''11$77711$777K..u/?@@ 	< 	<D55d;;;;	< 	<r)   nodes.ExceptHandlerc                    |j         r;t          |j         t          j                  r|                     |j                    d S d S d S r"   )r_   r$   r   r  rK  r?  s     r'   visit_excepthandlerz&RefactoringChecker.visit_excepthandler  sX    9 	ADIu/?@@ 	A55di@@@@@	A 	A 	A 	Ar)   
nodes.Withc                   |j         D ]v\  }}t          |t          j                  r| j        D ]}|j        |v r
||j        =  n|s?|                    t          j                  D ]}|                     |           wd S r"   )	rj   r$   r   Namer   r_   rH  r  rK  )r   r&   varnamesr   r_   s         r'   
visit_withzRefactoringChecker.visit_with  s     * 	@ 	@JC#uz** !<  E x5((!#(O )  ,,U-=>> @ @99$????@	@ 	@r)   msg_idstrr   r   c                   t          |t          j                  r	|j        rd S |j        sd S |                     |          rd S t          |t          j                  rt          ||          s1t          |t          j                  r^|j        sYt          ||          rK|j        d         }|j	        |j
        f| j        v rd}nd}|                     |||t                     d S d S d S d S )Nr   )r.  z#remove the leading "el" from "elif")elsez2remove the "else" and de-indent the code inside itr&   r!  
confidence)r$   r   Try	finalbodyr  r  r  r-   r6   rk   r  r  r$  r   )r   r&   rZ  r   r  r!  s         r'   _check_superfluous_elsez*RefactoringChecker._check_superfluous_else  s,    dEI&& 	4> 	F{ 	F%% 	F tUX&&	L1$8LMM	L tUY''		L
 N	L 6d<PQQ	L [^Fv01T[@@FUV$TdKKKKK	L 	L 	L 	L 	L 	Lr)   c                F    |                      |dt          j                  S )Nr   rZ  r   )rb  r   rd   r?  s     r'   r=  z1RefactoringChecker._check_superfluous_else_return  s)    ++) , 
 
 	
r)   c                F    |                      |dt          j                  S )Nr   rd  )rb  r   Raiser?  s     r'   r>  z0RefactoringChecker._check_superfluous_else_raise  (    ++u{ , 
 
 	
r)   c                F    |                      |dt          j                  S )Nr   rd  )rb  r   Breakr?  s     r'   _check_superfluous_else_breakz0RefactoringChecker._check_superfluous_else_break  rg  r)   c                F    |                      |dt          j                  S )Nr   rd  )rb  r   Continuer?  s     r'    _check_superfluous_else_continuez3RefactoringChecker._check_superfluous_else_continue  s)    +++%. , 
 
 	
r)   node_ar	   node_bc                   t          | t          j                  r*t          |t          j                  r| j        |j        k    S t          | t          j                  r*t          |t          j                  r| j        |j        k    S t          | t          j                  r*t          |t          j                  r| j        |j        k    S dS r   )r$   r   rV  r_   r  r  r  )rn  ro  s     r'   _type_and_name_are_equalz+RefactoringChecker._type_and_name_are_equal  s    fej)) 	.j.L.L 	.;&+--fe.// 	.JE$5
 5
 	. ;&+--fek** 	0z&%+/N/N 	0<6<//ur)   c                   t          |j        t          j                  sdS t	          |j                  dk    rdS |j        d         }t          |t          j                  rrt	          |j        d         j                  dk    rOt          |j        d         j        d         t          j                  rt          |j	        t          j
                  sdS |j	        j        }|                     |j	        j	        |j        j        d         d                   r |                     ||j        j                  sdS t          t          j        |j        j        d         d                   t          j                  S )NFr<   r   )r$   testr   Comparer"  r,   rz   r{   r  r  	Subscriptslicerq  opsleftr   rt   Dict)r   r&   stmtslice_values       r'   _is_dict_get_blockz%RefactoringChecker._is_dict_get_block(  s;   $)U]33 	5 ty>>Q5 y|tU\**	DIaL())Q..49Q</2E4DEE /4:u77 / 5 j&))$**:DIM!<LQ<OPP	--k49>JJ	 5 %*49=+;A+>??LLLr)   c                   |                      |          }|r |j        s|                     d|           d S |rt          |j                  dk    rt	          |j        d         t
          j                  r|                     |j        d         j        d         |j	        d         j        d                   rBt          |j        d         j                  dk    r!|                     d|           d S d S d S d S d S d S )Nr   r   r<   r   )
r|  r  r$  r"  r$   r   rz   rq  r{   r,   )r   r&   if_block_oks      r'   _check_consider_getz&RefactoringChecker._check_consider_getF  s   --d33 	>t{ 	>1=====		>DK  A%%4;q>5<88 &--A&q)49Q<+?+B  &
 DKN*++q001=====		> 		>%%%%%%
 10r)   r   r   r   r   r   r   c                V   |                      |           |                     |           |                     |           |                     |           |                     |           |                     |           |                     |           |                     |           d S r"   )r,  r<  r=  r>  rj  rm  r  %_check_consider_using_min_max_builtinr?  s     r'   visit_ifzRefactoringChecker.visit_ifU  s     	##D)))!!$'''++D111**4000**4000--d333  &&&22488888r)   c                $   |                      |          s|j        rdS t          |j                  dk    rdS dd}|j        d         }t	          |d	          rt          |j                  dk    rdS |j        d         }t          |j        t          j	                  rXt          |t          j
                  s>t          |j        j        t          j
                  st          |t          j                  sdS t	          |d
          r|j        }nt	          |d          r|j        }ndS t          |j        j                  dk    rdS |j        j        d         \  }} ||j                  } ||j        j                  }	 ||          }
|	|k    rn|
|k    rt#          j        |          }ndS ||
|	fvrdS |dv r&| d| d| d}|                     d||f           dS |dv r&| d| d| d}|                     d||f           dS dS )zICheck if the given if node can be refactored as a min/max python builtin.Nr<   r&   r   r   r[  c                
   t          | t          j                  r| j        S t          | t          j                  r| j        S t          | t          j                  rt          | j                  S | 	                                S )z5Obtain simplest representation of a node as a string.)
r$   r   rV  r_   	Attributeattrnamer  r[  r  	as_stringr   s    r'   get_node_namezORefactoringChecker._check_consider_using_min_max_builtin.<locals>.get_node_namex  sn    $
++ !y $00 %}$$,, '4:& >>###r)   r   r{   r_   r     <=<z = max(, )r   r      >=>z = min(r   )r&   r   r   r[  )r  r  r"  r,   hasattrr{   r$   rs  r   rt  ru  rx  rz   r_   r  rw  r  r   get_inverse_comparatorr$  )r   r&   r  r,   r}   target_assignationoperatorright_statement
body_valueleft_operandright_statement_valuer)  s               r'   r  z8RefactoringChecker._check_consider_using_min_max_builtinj  s    %% 	 	Fty>>QF
	$ 
	$ 
	$ 
	$ y|tY'' 	3t|+<+<+A+AFaty%-00	vu77	 ty~u??	 4..		 F
 66"" 	!'VZ(( 	!'Fty}!!F$(IM!$4!/"]4:..
$}TY^44 -o > >---"&8883H==HHF3\BBBF{""%QQ.@QQJQQQ  ,4zm       $$%QQ.@QQJQQQ  ,4zm      	 %$r)   r   nodes.IfExpc                0    |                      |           d S r"   )_check_simplifiable_ifexpr?  s     r'   visit_ifexpzRefactoringChecker.visit_ifexp  s    &&t,,,,,r)   c                   t          |j        t          j                  rt          |j        t          j                  sd S t          |j        j        t                    rt          |j        j        t                    sd S t          |j        t          j                  rd}nd}|j        j        |j        j        fdk    rd| d}n!|j        j        |j        j        fdk    rd}nd S | 	                    d||f           d S )	Nrs  z
bool(test))TF')FTz
'not test'r   r   )
r$   r,   r   r  r  r  r   rs  rt  r$  )r   r&   test_reduced_tor)  s       r'   r  z,RefactoringChecker._check_simplifiable_ifexp  s   $)U[11 	K:
 :
 	 F$)/400 	
Kt9
 9
 	 Fdi// 	+$OO*OIOT[./=@@/_///JJiot{01]BB%JJF5D
}UUUUUr)   r   r   nodes.FunctionDefc                4   |                      | j                   g | _        |                     |           |                     |           g | j        |j        <   |                     | j        j                   | j        j        	                                 d S r"   )
%_emit_nested_blocks_message_if_neededr  _check_consistent_returns_check_return_at_the_endr   r_   r8  r   r   r   r?  s     r'   leave_functiondefz$RefactoringChecker.leave_functiondef  s     	2243FGGG &&t,,,%%d+++(*49%00+:	
 	
 	
 	'6<<>>>>>r)   nodes.ClassDefc                    |                      | j        j                   | j        j                                         d S r"   )r8  r   r   r   r9  s     r'   leave_classdefz!RefactoringChecker.leave_classdef  sE     	00+7	
 	
 	
 	'399;;;;;r)   r   nodes.Raisec                0    |                      |           d S r"   )&_check_stop_iteration_inside_generatorr?  s     r'   visit_raisezRefactoringChecker.visit_raise  s    33D99999r)   c                   |                                 }t          |t          j                  r|                                sdS t          j        |t                    rdS |j        sdS t          j	        |j                  }|r&t          |t          j        t          j        f          sdS |                     |          r|                     d|t                     dS dS )zICheck if an exception of type StopIteration is raised inside a generator.Nr   r&   r_  )rZ   r$   r   r[   is_generatorr   node_ignores_exceptionStopIterationexcrt   r   Instancer   +_check_exception_inherit_from_stopiterationr$  r   )r   r&   rZ   r  s       r'   r  z9RefactoringChecker._check_stop_iteration_inside_generator  s    

%!233 	5;M;M;O;O 	F'm<< 	Fx 	Ftx(( 	*S5>5>*JKK 	F;;C@@ 	W44IVVVVV	W 	Wr)   r  nodes.ClassDef | bases.Instancec                |    t           j         dt          fd|                                 D                       S )zIReturn True if the exception node in argument inherit from StopIteration.z.StopIterationc              3  H   K   | ]}|                                 k    V  d S r"   )rv   )r%   _classstopiteration_qnames     r'   r(   zQRefactoringChecker._check_exception_inherit_from_stopiteration.<locals>.<genexpr>  s1      QQV6<<>>%88QQQQQQr)   )r   EXCEPTIONS_MODULEr+   mro)r  r  s    @r'   r  z>RefactoringChecker._check_exception_inherit_from_stopiteration  sB    
 "'!8HHHQQQQswwyyQQQQQQr)   rW   c                   t          |j        t          j                  r|j        rt          |j        d         t          j                  r|j        j        dk    rh|j        d         j        }t          |t          j                  rd S t          |t          j	                  rt          |j
        t          j        t          j        f          rt          |j
        j                  dk    rt          |j        t          j        t          j        f          rt          |j        j                  dk    rt|j
        j        \  }}|j        j        \  }}|                                |                                k    r,|                                |                                k    rd S d}|                     ||           d S |j        j        dk    r!d}|                     ||           d S d S d S d S d S )Nr   dictr/  r   r   r   r   )r$   ru   r   rV  r!  ListCompr_   eltrs   IfExpr,   r~   r   r"  eltsr  r  r$  )r   r&   elementkey1value1key2value2message_names           r'   /_check_consider_using_comprehension_constructorzBRefactoringChecker._check_consider_using_comprehension_constructor  s   ty%*--	:		: 49Q<88	:
 y~'')A,*guz22 F
 w44"7<%+uz1JKK GL-..!33"7>EK3LMM 4GN/00A55#*<#4LD&#*>#6LD&((DNN,<,<<<",,..&2B2B2D2DDDB  D 999995((A  D 99999?	: 	: 	: 	: 	: 	:: )(r)   c                   g d}t          |t          j                  r|j        rt          |j        t          j                  r|j        j        |v rt          |j                  dk    rt          |j        d         t          j                  r|j        d         	                                dd         }|j
        r2d| d}|dz  }|d                    d |j
        D                       z  }|j        j        }|d	v r|                     d
|||f           d S |                     d|||f           d S d S d S d S d S d S d S )N)r+   r4   summaxminlisttupler<   r   rh   (r  r  c              3  >   K   | ]}|                                 V  d S r"   r  )r%   kws     r'   r(   zERefactoringChecker._check_consider_using_generator.<locals>.<genexpr>L  s*      ,T,TR\\^^,T,T,T,T,T,Tr)   >   r4   r+   r   r   r   )r$   r   rs   ru   rV  r_   r"  r!  r  r  keywordsjoinr$  )r   r&   checked_callinside_comp	call_names        r'   _check_consider_using_generatorz2RefactoringChecker._check_consider_using_generator7  s    LKKtUZ((			 49ej11	 	,.. 49~~""z$)A,'O'O""il4466qt<= U"4k"4"4"4K4'K499,T,Tdm,T,T,T#T#TTK IN	..$$)!'5 %      $$2!'5 %     /	 	 	 	 	 	 /. #"""r)   r   r   r   r   r   r   r   r   c                V   |                      |           |                     |           |                     |           |                     |           |                     |           |                     |           |                     |           |                     |           d S r"   )3_check_raising_stopiteration_in_generator_next_callr  _check_quit_exit_call_check_super_with_argumentsr  _check_consider_using_with_check_use_list_literal_check_use_dict_literalr?  s     r'   
visit_callzRefactoringChecker.visit_call[  s     	@@FFF<<TBBB""4(((((...,,T222''---$$T***$$T*****r)   r   nodes.Yieldc                   t          |j        t          j                  sd S |j        j        }t          |t          j                  r2t          |t          j                  st          |j                  dk    rd S |j	        j
        |j        j
        k    rd S t          |                                t          j                  rd S |                     d|t                     d S )Nr<   r   r  )r$   r  r   rV  re   ForAsyncForr"  r,   r}   r_   rZ   AsyncFunctionDefr$  r   )r   r&   re   s      r'   visit_yieldzRefactoringChecker.visit_yieldq  s    $*ej11 	F#659--	&%.11	 6;1$$F=00FdjjllE$:;; 	F)4HHHHHr)   rG  nodes.LocalsDictNodeNGc                    | j                             d          }t          |o+t          |d         t          j        t          j        f                    S )Nr   r   )localsgetr   r$   r   
ImportFromImport)rG  	exit_funcs     r'   _has_exit_in_scopez%RefactoringChecker._has_exit_in_scope  sI    L$$V,,	T*Yq\E4Del3STT
 
 	
r)   c                P   t          |j        t          j                  r|j        j        t
          v rs|                                }|                     |          s'|                     |                                          rd S | 	                    d|t                     d S d S d S )Nr   r  )r$   ru   r   rV  r_   BUILTIN_EXIT_FUNCSrG  r  rootr$  r   )r   r&   local_scopes      r'   r  z(RefactoringChecker._check_quit_exit_call  s    di,, 	TCU1U1U **,,K&&{33 t7N7N		8 8  6TdSSSSS	T 	T1U1Ur)   c                   t          |j        t          j                  r|j        j        dk    rd S t          |j                  dk    s`t          d |j        D                       rB|j        d         j        dk    s,t          |          x}|j        d         j        |j        k    rd S | 	                    d|           d S )	Nr   r/  c              3  J   K   | ]}t          |t          j                  V  d S r"   r$   r   rV  )r%   args     r'   r(   zARefactoringChecker._check_super_with_arguments.<locals>.<genexpr>  s.      HHsz#uz22HHHHHHr)   r<   r   r   r   r   )
r$   ru   r   rV  r_   r"  r!  r4   r   r$  )r   r&   frame_classs      r'   r  z.RefactoringChecker._check_super_with_arguments  s    $)UZ00 	DINg4M4MF 	NNaHHdiHHHHH  y| F**/555>y| K$444F/d;;;;;r)   c                   dd}t          |j        t          j                  rdS t	          |j                  dk    rdS t          j        |j                  }t          |t          j                  r|	                                dk    r|
                                }t	          |j                  d	k    }t          |t          j                  ri|                                rW|sWt          j        |t                    s? ||j        d                   s+|                     d
|t                     dS dS dS dS dS dS dS dS )a  Check if a StopIteration exception is raised by the call to next function.

        If the next value has a default value, then do not add message.

        :param node: Check to see if this Call node is a next function
        :type node: :class:`nodes.Call`
        paramr   r   r   c                    t          j        |           }t          |t          j                  r|                                t          v S dS r   )r   rt   r$   r   r  rv   KNOWN_INFINITE_ITERATORS)r  inferreds     r'   _looks_like_infinite_iteratorzmRefactoringChecker._check_raising_stopiteration_in_generator_next_call.<locals>._looks_like_infinite_iterator  sB    '..H(EN33 D~~''+CCC5r)   Nr   zbuiltins.nextr<   r   r  )r  r   r   r   )r$   ru   r   r  r"  r!  r   rt   r[   rv   rZ   r  r  r  r$  r   )r   r&   r  r  rZ   has_sentinel_values         r'   r  zFRefactoringChecker._check_raising_stopiteration_in_generator_next_call  s   	 	 	 	 di11 	Fty>>Q F#DI.. x!233	  O33JJLLE "%TY!!35%"344	&&((	 +	 4T=II		
 65dilCC	   +$9 !     	 	33	 	 	 	 	 	 	 	 	 	r)   NodesWithNestedBlocksc                   t          |                                t          j                  sdS | j        dd         }|j        |                                k    r	|g| _        nt          | j                  D ](}||j        k    r n| j                                         )t          |t          j                  r5| 	                    |          r | j        r| j                                         | j        
                    |           t          |          t          | j                  k    r|                     |           dS dS )z-Update and check the number of nested blocks.N)r$   rG  r   r[   r  re   r?   popr  r  appendr"  r  )r   r&   nested_blocksancestor_nodes       r'   r<  z'RefactoringChecker._check_nested_blocks  sC    $**,,(9:: 	F +AAA.;$**,,&&#'&D "*$*=!>!> * * DK//E#''))))$)) .d.B.B4.H.H .& .'++---&&t,,, }D$7 8 88866}EEEEE 98r)   r  list[NodesWithNestedBlocks]c                    t          |          | j        j        j        k    r>|                     d|d         t          |          | j        j        j        f           d S d S )Nr   r   r   )r"  r   r  max_nested_blocksr$  )r   r  s     r'   r  z8RefactoringChecker._emit_nested_blocks_message_if_needed  sr     } 2 DDD("1%-(($+*<*NO       EDr)   r   r   c                b    |                                 D ]}|                     d|           d S Nr   r   )valuesr$  )r   r   r&   s      r'   r8  z6RefactoringChecker._emit_consider_using_with_if_needed  sB     LLNN 	? 	?D2>>>>	? 	?r)   nodes.BoolOpdict[str, set[str]]c                   t                      t          j        t                     }| j        D ] }t	          |t
          j                  rt          |j                  dk    r6t          j
        |j                  }|rt          j        |          sf|j        dk    rr|j        d                                         }|j        d         }||v r                    |           t	          |t
          j                  rd |                                D             }n|                                g}||                             |           "fd|                                D             S )aF  Get the duplicated types from the underlying isinstance calls.

        :param nodes.BoolOp node: Node which should contain a bunch of isinstance calls.
        :returns: Dictionary of the comparison objects from the isinstance calls,
                  to duplicate values from consecutive calls.
        :rtype: dict
        r/  r$   r   r<   c                6    g | ]}|                                 S r   r  )r%   
class_types     r'   r  zCRefactoringChecker._duplicated_isinstance_types.<locals>.<listcomp>!  s1       /9J((**  r)   c                $    i | ]\  }}|v 	||S r   r   )r%   keyr  duplicated_objectss      r'   
<dictcomp>zCRefactoringChecker._duplicated_isinstance_types.<locals>.<dictcomp>)  s1     
 
 
%3cEW>W>WC>W>W>Wr)   )r   collectionsdefaultdictr
  r$   r   rs   r"  r!  r   rt   ru   is_builtin_objectr_   r  addr~   iteredupdaterj   )r&   	all_typescallr  isinstance_objectisinstance_typeselemsr  s          @r'   _duplicated_isinstance_typesz/RefactoringChecker._duplicated_isinstance_types  s    (+uu<G<STW<X<X	K 	7 	7DdEJ// 3ty>>Q3F3F'	22H 5#:8#D#D },, $	! 6 6 8 8#y| I--"&&'8999*EK88 7 =M=T=T=V=V   *33556'(//6666
 
 
 
)2):):
 
 
 	
r)   c           	     
   |j         dk    rdS |                     |          }|                                D ]K\  }}t          d |D                       }|                     d||d                    |          f           LdS )z4Check isinstance calls which can be merged together.orNc              3     K   | ]}|V  d S r"   r   )r%   r_   s     r'   r(   zHRefactoringChecker._check_consider_merging_isinstance.<locals>.<genexpr>4  s"      88D4888888r)   r   r  r   )opr  rj   r#  r$  r  )r   r&   
first_argsduplicated_nameclass_namesrX  s         r'   "_check_consider_merging_isinstancez5RefactoringChecker._check_consider_merging_isinstance-  s    7d??F66t<<
,6,<,<,>,> 	 	(O[88K88888E-%tyy'7'78     	 	r)   c                   ddd}|j         |vst          |j                  dk     rd S |j        D ]}t          |t          j                  r8t          |j                  dk    s |j        d         d         ||j                  vr d S |j        |j        d         d         fD ] }t          |t          j                  r  d S !g g }}|j        D ]}t                      }|j        |j        d         d         fD ]v}t          |t          j
        t          j        f          r'|                    |                                           |                    |                                           w|                    |           t          d |          }|sd S t!          t#          |                    d         }	t#          t$          j                            |                    }|                    |	           t          |          dk    rd                    |          n
|d         d	z   }
|j         d
k    rdnd}|                     d||	||
ft0                     d S )Nz==z!=)r!  andr/  r<   r   c                ,    |                      |          S r"   )intersection)abs     r'   <lambda>z=RefactoringChecker._check_consider_using_in.<locals>.<lambda>W  s    q~~a/@/@ r)   r  ,r!   znot r   r^  )r#  r"  r
  r$   r   rt  rw  rx  rs   r   rV  r  r  r  r  r   r#  r  r  OrderedDictfromkeysremover  r$  r   )r   r&   allowed_opsr  
comparable	variablesr
  variable_setcommon_variablescommon_variablevalues_string	maybe_nots               r'   _check_consider_using_inz+RefactoringChecker._check_consider_using_in;  sz   !$//7+%%T[)9)9A)=)=F[ 		 		Euem44uy>>Q&&9Q<?+dg*>>>#j%)A,q/9  
j%*55 FFF
 6	[ 	+ 	+E55L#j%)A,q/9 6 6
j5:u*GHH = $$Z%9%9%;%;<<<j22445555\**** ""@"@)LL 	F !&6!7!788;k-66v>>??o&&&-0[[A-=-=		&)))6!9s?'T//BBv	!9m<	 	 	
 	
 	
 	
 	
r)   c                   |j         dk    st          |j                  dk     rdS dd
}t          j        d           }|j        D ](}t          |t          j                  r |||           )|                                D ]}t          |d                             |d                             }t          |d                   }t          |d                   }||k     r ||k     r| 	                    d|            dS dS )a	  Check if there is any chained comparison in the expression.

        Add a refactoring message if a boolOp contains comparison like a < b and b < c,
        which can be chained as a < b < c.

        Care is taken to avoid simplifying a < b < c and b < d.
        r)  r/  Ncomparison_nodenodes.Compareuses;collections.defaultdict[str, dict[str, set[nodes.Compare]]]r   r   c                   | j         }| j        D ]\  }}||fD ]}d }t          |t          j                  r|j        }n!t          |t          j                  r|j        }|J|dv rL||u r"||         d                             |            t||u r!||         d                             |            |dv rK||u r"||         d                             |            ||u r!||         d                             |            |}d S )Nr  lower_boundupper_boundr  )	rx  rw  r$   r   rV  r_   r  r  r  )r>  r@  r  r  right_operandoperandr  s          r'   _find_lower_upper_boundszNRefactoringChecker._check_chained_comparison.<locals>._find_lower_upper_boundst  sM    +/L+:+> - -'- ,m< L LG E!'5:66 . '#GU[99 . '} ;.."l22 K6::?KKKK$55 K6::?KKK![00"l22 K6::?KKKK$55 K6::?KKK,+- -r)   c                 <    t                      t                      dS )N)rC  rD  )r   r   r)   r'   r.  z>RefactoringChecker._check_chained_comparison.<locals>.<lambda>  s    ceeDD r)   rC  rD  r   r   )r>  r?  r@  rA  r   r   )
r#  r"  r
  r  r  r$   r   rt  r+  r$  )	r   r&   rG  r@  r>  bounds
num_sharednum_lower_boundsnum_upper_boundss	            r'   _check_chained_comparisonz,RefactoringChecker._check_chained_comparisoni  s>    7es4;//!33F	- 	- 	- 	-: #DD  	
  ${ 	@ 	@O/5=99 @(($???kkmm 	 	FVM2??}@UVVWWJ"6-#899"6-#899,,,>N1N1N  !5D AAA	 	r)   r  r
  list[nodes.NodeNG]c                l   g }|D ]}d}t          |                    t          j                  d          s*t	          j        |          }|r|                                }t          |t                    s|	                    |           | dk    |k    r|gc S |pt          j
        | dk              gS )a[  Removes irrelevant values or returns short-circuiting values.

        This function applies the following two rules:
        1) an OR expression with True in it will always be true, and the
           reverse for AND

        2) False values in OR expressions are only relevant if all values are
           false, and the reverse for AND
        NFr!  r)  )nextrH  r   rV  r   rt   
bool_valuer$   r   r  r  )r  r
  simplified_valuessubnodeinferred_boolr  s         r'   #_apply_boolean_simplification_rulesz6RefactoringChecker._apply_boolean_simplification_rules  s     13 
	! 
	!G M..uz::EBB : +G44 :$,$7$7$9$9MmT22 !!((1111d"}44y    5 !DU[U1B%C%C$DDr)   bool_opc                r    t          |                                          } fd|D             }                     |j        |          }t	          |          t	          |          k     rd _        t	          |          dk    r|d         S t          j        |          }|                    |           |S )zAttempts to simplify a boolean operation.

        Recursively applies simplification on the operator terms,
        and keeps track of whether reductions have been made.
        c                r    g | ]3}t          |t          j                  r                    |          n|4S r   )r$   r   BoolOp_simplify_boolean_operationr%   r2   r   s     r'   r  zBRefactoringChecker._simplify_boolean_operation.<locals>.<listcomp>  sR     
 
 
  eU\2200777	
 
 
r)   Tr<   r   )r  get_childrenrU  r#  r"  r  copypostinit)r   rV  childrenintermediateresultsimplified_bool_ops   `     r'   rZ  z.RefactoringChecker._simplify_boolean_operation  s     ,,..//
 
 
 
 "
 
 
 99'*lSSv;;X&&)-D&v;;!!9!Yw//##F+++!!r)   c                   t          j        |          sdS d| _        |                     |          }| j        sdS t	          |                    t          j                  d          s@|                     d||	                                |	                                f           dS |                     d||	                                |	                                f           dS )zCheck if a boolean condition can be simplified.

        Variables will not be simplified, even if the value can be inferred,
        and expressions like '3 + 4' will remain expanded.
        NFr   r   r   )
r   is_test_conditionr  rZ  rP  rH  r   rV  r$  r  )r   r&   simplified_exprs      r'   _check_simplifiable_conditionz0RefactoringChecker._check_simplifiable_condition  s    &t,, 	F%*"::4@@) 	FO225:>>FF 	-nn&&(A(A(C(CD       (nn&&(A(A(C(CD      r)   r   r   r   r   r   c                    |                      |           |                     |           |                     |           |                     |           d S r"   )r'  r<  rM  rf  r?  s     r'   visit_boolopzRefactoringChecker.visit_boolop  sZ     	//555%%d+++&&t,,,**400000r)   nodes.NodeNG | Nonec                    t          | t          j                  o[t          | j                  dk    oCt          | j        d         t          j                  ot          | j        t          j                  S Nr<   r   )r$   r   rz   r"  r{   r  r  rV  r   s    r'   _is_simple_assignmentz(RefactoringChecker._is_simple_assignment  sb     tU\** 3DL!!Q&34<?E,<==3 4:uz22		
r)   c                X    |                                 r&|                                                                  sd S ||                                 |                                                                  g}t           fd|D                       sd S t           fd|D                       rd S d |D             }d |D             }|d         |d         k    rK|dd          |d d         k    r7 j                            |           d}                     ||	           d S d S d S )
Nc              3  B   K   | ]}                     |          V  d S r"   )rl  r%   r&   r   s     r'   r(   z;RefactoringChecker._check_swap_variables.<locals>.<genexpr>  s1      LL4--d33LLLLLLr)   c              3  *   K   | ]}|j         v V  d S r"   )r  ro  s     r'   r(   z;RefactoringChecker._check_swap_variables.<locals>.<genexpr>  s+      IITtt00IIIIIIr)   c                2    g | ]}|j         d          j        S )r   )r{   r_   r%   r&   s     r'   r  z<RefactoringChecker._check_swap_variables.<locals>.<listcomp>  s!    ===Q$===r)   c                &    g | ]}|j         j        S r   )r  r_   rr  s     r'   r  z<RefactoringChecker._check_swap_variables.<locals>.<listcomp>  s    999T999r)   r   rh   r<   r   r   )next_siblingr4   r+   r  r  r$  )r   r&   assignmentsrx  rightmessages   `     r'   _check_swap_variablesz(RefactoringChecker._check_swap_variables  s[     "" 	$*;*;*=*=*J*J*L*L 	FT..00$2C2C2E2E2R2R2T2TULLLLLLLLL 	FIIII[IIIII 	F=====99[9997eBiDHcrc
$:$:%,,[999/GW400000  $:$:r)   r   r   r   nodes.Assignc                Z    |                      |           |                     |           d S r"   )!_append_context_managers_to_stackvisit_returnr?  s     r'   visit_assignzRefactoringChecker.visit_assign  s2     	..t444$r)   c                ^   |                      |           |                     |j                  r|                     |j                  \  }}}nd S t	          d ||fD                       rd S t          j        |d          }|t          |t                    rd S |	                                }|du rd}|
                                }nBd}|
                                 d|
                                 d|
                                 }|                     |||ft          	           d S )
Nc              3  J   K   | ]}t          |t          j                  V  d S r"   )r$   r   rt  r%   r  s     r'   r(   z2RefactoringChecker.visit_return.<locals>.<genexpr>-  s?       
 
16Juem,,
 
 
 
 
 
r)   T)compare_constantsFr   r   z if z else r^  )rx  _is_and_or_ternaryr  _and_or_ternary_argumentsr4   r   rt   r$   r   rQ  r  r$  r   )	r   r&   condtruth_valuefalse_valueinferred_truth_valuetruth_boolean_valuerw  
suggestions	            r'   r|  zRefactoringChecker.visit_return!  sa    	""4(((""4:.. 	-1-K-KDJ-W-W*D+{{F 
 
;F:T
 
 
 
 
 	 F$/tTTT': /,
 ,
' F2==??%''3G$..00JJ.G'1133jj9I9IjjQ\QfQfQhQhjjJt:-IVVVVVr)   c                   t          |          rd S t          |j        d         t          j        t          j        t          j        f          rG|j        d         j        }t          j	        |j
                  }|t          |d          sd S |j        }n|j        d         g}|j
        g}t          d ||fD                       rd S t          ||          D ]\  }}t          |t          j                  s!t          j	        |j                  }|rA|                                t"          vs&t          |t          j        t          j        f          s~| j                            |                                          }t          |t          j                  r|j        n|j        }||v r:||         }	t3          j        ||	          r|||<   |                     d|	           |||<   d S )Nr   r  c              3  @   K   | ]}t          |t                    V  d S r"   )r$   r   )r%   ns     r'   r(   zGRefactoringChecker._append_context_managers_to_stack.<locals>.<genexpr>P  s,      KK!z!_--KKKKKKr)   r   r   )ra   r$   r{   r   r~   r   Setr  r   rt   r  r  r+   ziprs   ru   rv    CALLS_RETURNING_CONTEXT_MANAGERSr  
AssignAttrr   r   rZ   r_   r  r\   are_exclusiver$  )
r   r&   	assigneesr  r
  assigneer  r   varnameexisting_nodes
             r'   r{  z4RefactoringChecker._append_context_managers_to_stackA  s   %d++ 	 Fdl1oUZ'KLL 		"Q,I$TZ00E}GE6$:$:}ZFFa)Ij\FKK	67JKKKKK 	F"9f55 	# 	#OHeeUZ00 '
33H>>##+KKK!(U-=u?O,PQQ L 3GG

UUE h(899'& 
 % %g(}== %*E'N  )& !    #E'NN7	# 	#r)   c                J   t          |          st          |          rd S || j                            |                                                                          v rd S t          j        |j                  }|r1t          |t          j        t          j        t          j        f          sd S |                                t           v p*|                                t"          v ot%          |           }|r(t'          |          s|                     d|           d S d S d S r	  )ra   rf   r   r   rZ   r
  r   rt   ru   r$   r   r[   r   r   r^   rv   $CALLS_THAT_COULD_BE_REPLACED_BY_WITHr  rp   rx   r$  )r   r&   r  could_be_used_in_withs       r'   r  z-RefactoringChecker._check_consider_using_witho  sB   %d++ 	/Ed/K/K 	
 F.BB

 fhh  F#DI.. 	zu(%.%:MN 
  
 	 F NN DD    $DD 5.t444 	 ! 	?)H)N)N 	?2>>>>>	? 	? 	? 	?r)   c                   |                                 dk    rkt          j        |j                  }t	          |t
          j                  r:|j        s5|                                dk    r| 	                    d|           dS dS dS dS dS )z7Check if empty list is created by using the literal [].zlist()zbuiltins.listr   r   N)
r  r   rt   ru   r$   r   r   r!  rv   r$  r   r&   r  s      r'   r  z*RefactoringChecker._check_use_list_literal  s    >>x'''	22H(EN33 DDI D>>##66$$%7d$CCCCC	 ('D D D D66r)   c                |   t          |j        t          j                  r|j        j        dk    rdS t          j        |j                  }t          |t          j                  rS|	                                dk    r=|j
        s8|                     d|                     |          f|t                     dS dS dS dS )z1Check if dict is created by using the literal {}.r  Nzbuiltins.dictr   )r!  r&   r_  )r$   ru   r\   rV  r_   r   rt   r   r   rv   r!  r$  _dict_literal_suggestionr   r  s      r'   r  z*RefactoringChecker._check_use_dict_literal  s    $)W\22 	din6N6NF#DI..x00
	  O33I 4 "33D99;$	      
	 
	3333r)   c                   g }| j         D ]j}t          d                    |                    dk    r nA|| j        vr7|                    d|j         d|j                                                    k| j        D ]Y}t          d                    |                    dk    r n0|                    d|j                                                    Zd                    |          }d| t          |          dk    rdnd d	S )
z)Return a suggestion of reasonable length.r  @   "z": z**{z, ... r0  })r  r"  r  kwargsr  r  r  r  )r&   elementskeywordr  s       r'   r  z+RefactoringChecker._dict_literal_suggestion  s    !} 	Q 	QG499X&&''2--dk)) OGK O OGM4K4K4M4M O OPPP{ 	> 	>G499X&&''2--OO<!8!8!:!:<<====YYx((
MJMS__r-A-ArMMMMr)   
str | Nonec                   t          |t          j                  rt          d|j                  S t          |t          j                  sdS d |j        D             }t          |          dk    s%t          |d         j        t          j                  sdS t          |j                  t          |          k    }|r	| j	        sdS t          d|d         j        j                  S )z5Try to extract the name used in a concatenation loop.r  Nc                F    g | ]}t          |t          j                  |S r   )r$   r   FormattedValuer  s     r'   r  z;RefactoringChecker._name_to_concatenate.<locals>.<listcomp>  s:     
 
 
j@T.U.U

 
 
r)   r<   r   )
r$   r   rV  r   r_   	JoinedStrr
  r"  r  r   )r   r&   r
  with_separatorss       r'   _name_to_concatenatez'RefactoringChecker._name_to_concatenate  s    dEJ'' 	1di000$00 	4
 
#{
 
 
 v;;!:fQiouz#J#J4 dk**S[[8 	4#N 	4L&)/"6777r)   
aug_assignnodes.AugAssignc                   |j         }t          |t          j                  rt	          |j                  dk    rdS |                                }t          |t          j                  sdS d |j        D             }|j	        dk    ot          |j
        t          j                  ot	          |j                  dk    os|j
        j        |v oet          |j        t          j                  oFt          |j        j        t                    o'|                     |j                  |j
        j        k    }|r|                     d|           dS dS )zWe start with the augmented assignment and work our way upwards.

        Names of variables for nodes if match successful:
        result = ''  # assign
        for number in ['1', '2', '3']  # for_loop
            result += number  # aug_assign
        r<   Nc                P    h | ]#}t          |t          j                  |j        $S r   r  r  s     r'   	<setcomp>z@RefactoringChecker._check_consider_using_join.<locals>.<setcomp>  s=     
 
 
&%"233
K
 
 
r)   z+=r   r   )re   r$   r   r  r"  r,   previous_siblingrz   r{   r#  r}   r  r_   r  r  r[  r  r$  )r   r  for_loopassignresult_assign_namesis_concat_loops         r'   _check_consider_using_joinz-RefactoringChecker._check_consider_using_join  sm    $(EI.. 	#hm2D2Dq2H2HF**,,&%,// 	F
 
 .
 
 
 MT! T:,e.>??THM""a'T !&*==T 6<55	T
 6<-s33T ))**:;;x?SS 	  	E2DDDDD	E 	Er)   r   c                0    |                      |           d S r"   )r  r?  s     r'   visit_augassignz"RefactoringChecker.visit_augassign  s    ''-----r)   r   nodes.Comprehensionc                    |                      |           |                     |           |                     |           d S r"   ) _check_unnecessary_comprehensionrN  rO  r?  s     r'   visit_comprehensionz&RefactoringChecker.visit_comprehension  sF     	--d33311$77711$77777r)   c                   t          |j        t          j                  s<t	          |j                  dk    s$t	          |j        j                  dk    s|j        rd S t          |j        t          j                  rt          |j        j	        t          j
                  rt          |j        j        t          j
                  r|t          |j        t          j                  r]t          d |j        j        D                       r:|j        j	        j        |j        j        j        g}d |j        j        D             }nt          |j        t          j        t          j        f          r|j        j        }t          |t          j
                  r|j        }nNt          |t          j                  r2t)          d |j        D                       rd S d |j        D             }ng }|j        j        d         j        }t          |t          j                  r|j        n,t          |t          j                  rd |j        D             ng }nd S ||k    r|rd }t-          j        |j                  }t          |j        t          j                  rHt          |t2          j        j                  r)d|j        j        j                                         d	f}nt          |j        t          j                  r9t          |t          j                  rd
|j                                         d	f}nWt          |j        t          j                  r8t          |t          j                   rd|j                                         d	f}|r| !                    d|j        |           d S t          |j        t          j                  rd}nFt          |j        t          j                  rd}n$t          |j        t          j                  rd}nd S | !                    d|j        | d|j                                         d	f           d S d S d S )Nr   r<   c              3  J   K   | ]}t          |t          j                  V  d S r"   )r$   r   r  r%   r  s     r'   r(   zFRefactoringChecker._check_unnecessary_comprehension.<locals>.<genexpr>	  s/      RR#JsE$455RRRRRRr)   c                    g | ]	}|j         
S r   r_   r  s     r'   r  zGRefactoringChecker._check_unnecessary_comprehension.<locals>.<listcomp>  s    @@@38@@@r)   c              3  L   K   | ]}t          |t          j                   V   d S r"   r  r  s     r'   r(   zFRefactoringChecker._check_unnecessary_comprehension.<locals>.<genexpr>  s1      LL3:c5:666LLLLLLr)   c                    g | ]	}|j         
S r   r  r  s     r'   r  zGRefactoringChecker._check_unnecessary_comprehension.<locals>.<listcomp>  s    ;;;#SX;;;r)   c                P    g | ]#}t          |t          j                  |j        $S r   r  r  s     r'   r  zGRefactoringChecker._check_unnecessary_comprehension.<locals>.<listcomp>  s=       %c5+;<<  r)   zdict(r  zlist(zset(r   r   r  r  r   r  )"r$   re   r   GeneratorExpr"  ifs
generatorsis_asyncDictCompr  rV  r  r}   r~   r4   r  r_   r  SetCompr  r+   r  r   rt   iterr\   objects	DictItemsru   exprr  r   r  r$  )	r   r&   	expr_listtarget_listr  r}   r!  r  ru   s	            r'   r  z3RefactoringChecker._check_unnecessary_comprehension  sA   t{E$677	48}}!!4;)**a//} 0 F t{EN33#	4;?EJ77#	 4;,ej99#	 4;44	#	
 RRAQRRRRR#	 -t{/@/EFI@@t{/?@@@KKenem%DEE 	;?D$
++  I		D%+.. LL$)LLLLL F;;;;;			[+A.5F fe&677
 "&%+66  #);     K F##	#&*D'	22H$+u~66 ::'/3< < : C	 3 = = ? ?BBBDDK88 :Z%*> > : 9	 3 3 5 5888:DK77 :J%)= = : 8ty22447779   /dk !    $+u~66 DK88 DK77 +[88	 3 3 5 5888:      = $###r)   c                   t          | t          j                  o| j        dk    ot	          | j                  dk    ot          | j        d         t          j                  ot          | j        d         t          j                   oi| j        d         j        dk    oSt          | j        d         j        d         t          j                   o"t	          | j        d         j                  dk    S )zReturns true if node is 'condition and true_value or false_value' form.

        All of: condition, true_value and false_value should not be a complex boolean expression
        r!  r/  r   r<   r)  )r$   r   rY  r#  r"  r
  r   s    r'   r  z%RefactoringChecker._is_and_or_ternaryL  s     tU\** 040DK  A%0 4;q>5<880 t{1~u|<<<	0
 A!U*0 t{1~4Q7FFF0 DKN)**a/		
r)   /tuple[nodes.NodeNG, nodes.NodeNG, nodes.NodeNG]c                P    | j         d         }| j         d         j         \  }}|||fS rk  )r
  )r&   r  	condition
true_values       r'   r  z,RefactoringChecker._and_or_ternary_arguments]  s/     k!n $A 5	:*k11r)   c                    t          |                    t          j        t          j                            | j        |j        <   d S )NrD  )r  rH  r   rd   r[   r   r_   r?  s     r'   visit_functiondefz$RefactoringChecker.visit_functiondefe  s<    (,9JKK)
 )
49%%%r)   c                   d | j         |j                 D             }|sdS t          |          t          | j         |j                           k    r|                     |          rdS |                     d|           dS )ax  Check that all return statements inside a function are consistent.

        Return statements are consistent if:
            - all returns are explicit and if there is no implicit return;
            - all returns are empty and if there is, possibly, an implicit return.

        Args:
            node (nodes.FunctionDef): the function holding the return statements.
        c                     g | ]}|j         	|S r"   )r  )r%   _nodes     r'   r  z@RefactoringChecker._check_consistent_returns.<locals>.<listcomp>u  s&     
 
 
@WE@W@W@Wr)   Nr   r   )r   r_   r"  _is_node_return_endedr$  )r   r&   explicit_returnss      r'   r  z,RefactoringChecker._check_consistent_returnsj  s    
 
#1$)<
 
 
   	F  Cty)%
 %
 
 
((..
 F9EEEEEr)   c                     t           fd|j        D                       }|j        s                     |          sdS |S t           fd|j        D                       }|o|S )zCheck if the If node ends with an explicit return statement.

        Args:
            node (nodes.If): If node to be checked.

        Returns:
            bool: True if the node ends with an explicit statement, False otherwise.
        c              3  v   K   | ]3}t          |t          j                                      |          V  4d S r"   r$   r   r[   r  )r%   _ifnr   s     r'   r(   z>RefactoringChecker._is_if_node_return_ended.<locals>.<genexpr>  sX       
 
dE$566
&&t,,
 
 
 
 
 
r)   Fc              3  v   K   | ]3}t          |t          j                                      |          V  4d S r"   r  )r%   _orer   s     r'   r(   z>RefactoringChecker._is_if_node_return_ended.<locals>.<genexpr>  sX       "
 "
dE$566"
&&t,,"
 "
 "
 "
 "
 "
r)   )r+   r,   r  _has_return_in_siblings)r   r&   is_if_returningis_orelse_returnings   `   r'   _is_if_node_return_endedz+RefactoringChecker._is_if_node_return_ended  s      
 
 
 
	
 
 
 
 

 { 	# //55 u""! "
 "
 "
 "
"
 "
 "
 
 

 6#66r)   c                    |j         sdS t          j        |          sdS t          j        |j                   }|%t	          |t
                    st          |d          sdS |                                                    d          d         }t          j	        ||          }|t          |          ng }|rt           fd|D                       S dS )zCheck if the Raise node ends with an explicit return statement.

        Args:
            node (nodes.Raise): Raise node to be checked.

        Returns:
            bool: True if the node ends with an explicit statement, False otherwise.
        TNpytypeF.rh   c              3  B   K   | ]}                     |          V  d S r"   r  )r%   _handlerr   s     r'   r(   zARefactoringChecker._is_raise_node_return_ended.<locals>.<genexpr>  s1      UUt11(;;UUUUUUr)   )r  r   is_node_inside_try_exceptrt   r$   r   r  r  splitget_exception_handlersr  r+   )r   r&   r  exc_namer5   s   `    r'   _is_raise_node_return_endedz.RefactoringChecker._is_raise_node_return_ended  s     x 	4.t44 	 4tx((K#// 3))  5::<<%%c**2./h??%-%94>>>r 	V UUUUHUUUUUUtr)   c                    t          |t          j                  rdS t          |t          j                  rM	 |j                                        d         }                     |          rdS n# t          j        $ r Y nw xY wt          |t          j	                  rI|j
                                        rt          |           pt           fd|j        D                       S t          |t          j                  r                     |          S t          |t          j                  r                     |          S t          |t          j                  rxd |                                D             }t+          |                                          |z
  }t           fd|D                       ot-           fd|D                       S t          |t          j                  r-t          |j
        t          j                  r|j
        j        sdS t           fd|                                D                       S )zCheck if the node ends with an explicit return statement.

        Args:
            node (nodes.NodeNG): node to be checked.

        Returns:
            bool: True if the node ends with an explicit statement, False otherwise.
        Tr   c              3  B   K   | ]}                     |          V  d S r"   r  r[  s     r'   r(   z;RefactoringChecker._is_node_return_ended.<locals>.<genexpr>  sJ       S S6;**511S S S S S Sr)   c                F    h | ]}t          |t          j                  |S r   )r$   r   ExceptHandler)r%   _childs     r'   r  z;RefactoringChecker._is_node_return_ended.<locals>.<setcomp>  s;       fe&9::  r)   c              3  B   K   | ]}                     |          V  d S r"   r  r%   r  r   s     r'   r(   z;RefactoringChecker._is_node_return_ended.<locals>.<genexpr>  sB        7=**622     r)   c              3  B   K   | ]}                     |          V  d S r"   r  r  s     r'   r(   z;RefactoringChecker._is_node_return_ended.<locals>.<genexpr>  s1      PPVd0088PPPPPPr)   c              3  B   K   | ]}                     |          V  d S r"   r  r  s     r'   r(   z;RefactoringChecker._is_node_return_ended.<locals>.<genexpr>  s1      XX&4--f55XXXXXXr)   )r$   r   rd   rs   ru   r   _is_function_def_never_returningr\   InferenceErrorWhilers  rQ  r   r+   r  rf  r  r  r  r`  r\  r   r4   Assertr  r  )r   r&   funcdef_noder5   all_but_handlers   `    r'   r  z(RefactoringChecker._is_node_return_ended  s    dEL)) 	4dEJ'' 	#y1133A688FF  4 )   dEK(( 	 I((**J3DT3J3J/J s S S S S?C{S S S P P  dEK(( 	:33D999dEH%% 	700666dEI&& 		Q "//11  H
 "$"3"3"5"566AO    AP     QPPPPxPPPPPQ tU\**	49ek22	 IO	 4XXXXDDUDUDWDWXXXXXXs   4A0 0BBc                    |                                  }|r2t          |t          j                  rdS |                                 }|2dS )zDReturns True if there is at least one return in the node's siblings.TF)rt  r$   r   rd   )r&   rt  s     r'   r  z*RefactoringChecker._has_return_in_siblings  sX     ((** 	7,55 t'4466L  	7 ur)   'nodes.FunctionDef | astroid.BoundMethodc                   t          |t          j        t          j        f          re|j        r^t          |j        t          j                  r|j        j        dk    p.t          |j        t          j                  o|j        j	        dk    S 	 |
                                | j        v S # t          t          f$ r Y dS w xY w)a  Return True if the function never returns, False otherwise.

        Args:
            node (nodes.FunctionDef or astroid.BoundMethod): function definition node to be analyzed.

        Returns:
            bool: True if the function never returns, False otherwise.
        NoReturnF)r$   r   r[   r\   r]   returnsr  r  rV  r_   rv   r   	TypeErrorAttributeErrorr?  s     r'   r  z3RefactoringChecker._is_function_def_never_returning  s     dU.0CDEE 	$, 	4<99 8L)Z74dlEJ77 4L%3		::<<4#BBB>* 	 	 	55	s   B( (B=<B=c                   t          | j        |j                           dk    rdS t          |j                  dk    rdS |j        d         }t	          |t
          j                  rd|j        |                     d|           dS t	          |j        t
          j	                  r'|j        j        |                     d|           dS dS dS dS )a
  Check for presence of a *single* return statement at the end of a
        function.

        "return" or "return None" are useless because None is the
        default return type if they are missing.

        NOTE: produces a message only if there is a single return statement
        in the function body. Otherwise _check_consistent_returns() is called!
        Per its implementation and PEP8 we can have a "return None" at the end
        of the function body if there are other return statements before that!
        r<   Nrh   r   r   )
r"  r   r_   r,   r$   r   rd   r  r$  r  )r   r&   lasts      r'   r  z+RefactoringChecker._check_return_at_the_end  s     t!$),--11Fty>>QFy}dEL)) 	>z!  !1 =====DJ44 >$*:J:R  !1 =====	> 	>
> >:R:Rr)   nodes.For | nodes.Comprehensionc                
   t          |j        t          j                  r*t          |j        j        t          j                  r|j        j        j        dk    rt          j        |j        j                  }t          |t          j
                  sdS |j        j        j                                        }g }t          |t          j                  r|j        n%t          |j                                                  }t$          j                            d |D                       }t+          |d          du}|D ]}|                    t          j                  D ]}	t          |	j        t          j        t          j        f          s/|	j        }
t          |t          j                  rt7          |	          r  dS t          |	j        t          j                  r  dS t          |
t          j                  rFt          |j        t          j                  rZt?          |j        j                   dk     s=|
j!        |j        j         d         j!        k    s||	j                                        k    rt          |t          j                  r6|
"                    |
j!                  d         d         j#        |j#        k    rl|r<|$                    |	|j        j         d                                         d           | %                    d	|	|j        j         d                                         f
           t          |
t          j                  rt          |j        t          j&                  rVt          |
j        t          j                  r7|j        j!        |
j        j!        k    s||	j                                        k    ryt          |t          j                  r@|
j        "                    |
j        j!                  d         d         j#        |j#        k    rt          j        |
j                  }t          |t          j'                  r|j        dk    r|rT|$                    |	d(                    |
                                )                    dd                    d           i| %                    d	|	d(                    |
                                )                    dd                    f
           |D ]-}| %                    d	|d         |d         f
           (dS dS dS dS )z7Add message when accessing dict values by index lookup.rj   Nc              3  l   K   | ]/}|                     t          j        t          j        f          V  0d S r"   rH  r   r  r  r%   r2   s     r'   r(   zJRefactoringChecker._check_unnecessary_dict_index_lookup.<locals>.<genexpr>T  sJ       9 9CH$$ei%=>>9 9 9 9 9 9r)   r/  r   r<   rh   )r&   variabler   r   10)maxsplitr&   r  )*r$   r  r   rs   ru   r  r  r   rt   r\   r]   r  r  r  r,   r  re   r\  rN   chainfrom_iterablerP  rH  ru  r  rV  rv  r   Deleter}   r~   r"  r  r_   lookuprk   r  r$  r  r  r  rsplit)r   r&   r  iterating_object_namemessagesr_  nested_loopshas_nested_loopsr2   	subscriptr  rw  s               r'   rN  z7RefactoringChecker._check_unnecessary_dict_index_lookup/  sJ    ty%*--H	49>5?;;H	 	'722'	77Hh(;<< $(IN$7$A$A$C$C! H dEI..6		$+224455  %?88 9 9LT9 9 9  L  $L$77tC! _ _!&!5!5eo!F!F ^ ^I%io
EO7TUU ! %OE!$	22 7T!8 8 
 !)"2ELAA  "%44 L *4; D D%  #4;#344q88$zT[-=a-@-EEE4	8Q8Q8S8SSS$ 'tUY77% %UZ 8 8 ;B ? F T T %+ $OO,5040@0C0M0M0O0O!" !"    !,, ?%.&*k&6q&9&C&C&E&E%G -     $E5?;; ) *4;8H I I%#-ek5:#F#F%  ${/5;3CCC4	8Q8Q8S8SSS$ 'tUY77	% % 2 25;3C D DQ G K R"k!* !* % $)#3EK#@#@)(EK@@ %HNVWDWDW$+ $OO,503(-(9(9(@(@q(@(Q(Q1& 1&!" !"    !,, ?%.$'HHU__->->-E-EcTU-E-V-V$W$W&" -   q^@ $    3 !*-/ !    IH	 H	 H	 H	 32@ r)   c                z   t          |j        t          j                  r9t          |j        j        t          j                  r|j        j        j        dk    sd S t          }	 t          j	        |j        dd          }n7# t          j
        $ r% t          j        |j        d          }t          }Y nw xY wt          |t          j                  sd S t          |j        t          j                  rt          |j        j                  dk     rd S t          |j        j        d         t          j                  sd S |                     |          \  }}|rd S |t          k    r|n|}|j        }|j        j        d         }g }t          |t          j                  r|j        n%t+          |j                                                  }	t0          j                            d |	D                       }
t7          |
d           d u}t0          j                            d	 |	D                       }t7          |d           d u}|	D ]}|                    t          j                  D ]}t          |t          j                  rt=          |          r  d S t          |j        t          j                  r  d S |j         }t          |t          j                  r*|j        |j        j        d         j        k    s||j!        "                                k    rt          |t          j                  r6|#                    |j                  d         d
         j$        |j$        k    rt          |t          j                  r6|#                    |j                  d         d
         j$        |j$        k    rS|r|%                    |           l|rp| &                    d||j        j        d         j        f|           |D ]1}| &                    d||j        j        d         j        f|           2d S )Nr>   r   iterable)positionr  )r  r/  r<   c              3  l   K   | ]/}|                     t          j        t          j        f          V  0d S r"   r  r  s     r'   r(   zJRefactoringChecker._check_unnecessary_list_index_lookup.<locals>.<genexpr>  sJ       5
 5
?DE  %)U[!9::5
 5
 5
 5
 5
 5
r)   c              3  T   K   | ]#}|                     t          j                  V  $d S r"   )rH  r   r  r  s     r'   r(   zJRefactoringChecker._check_unnecessary_list_index_lookup.<locals>.<genexpr>	  sC       6
 6
/4E  **6
 6
 6
 6
 6
 6
r)   rh   r   r^  )'r$   r  r   rs   ru   rV  r_   r   r   get_argument_from_callNoSuchArgumentErrorinfer_kwarg_from_callr   r}   r~   r"  r  r  _enumerate_with_startr  r,   r  re   r\  rN   r  r  rP  rH  ru  r   r  rv  r  r  r  rk   r  r$  )r   r&   preliminary_confidenceiterable_arghas_start_argr_  r  value_variable	bad_nodesr_  r  r  if_statementshas_if_statementsr2   r  r9   s                    r'   rO  z7RefactoringChecker._check_unnecessary_list_index_lookup  s    49ej11	dinej99	 9>&+55F!%	/ 7	Az  LL ( 	/ 	/ 	/ 6ty*UUUL%."""	/ ,
33 	F$+u{33 	s4;;K7L7Lq7P7PF$+*1-u/?@@ 	 F$($>$>t$D$D!z 	 F
 &22 #" 	 !- 1)!, 	 $	**2DIIdk..0011 	 !44 5
 5
HP5
 5
 5
 
 
  d334? "55 6
 6
8@6
 6
 6
 
 
 !55TA 3	 3	E"11%/BB 2 2	dEI.. 3P4 4 
 FFFi.== FFF!eUZ00 %
dk&6q&9&>>>0IO4M4M4O4OOO  #433!!LL44Q7;BT[PP ! #433!!LL)<==a@DK+& &
 !'  "((3333*  ((;!*"&+"21"5":!<'1	 )   [2h # 	 	I/k&q).0%	     	 	s   #B   1B43B4tuple[bool, Confidence]c                X   t           }t          |j        j                  dk    r9|j        j        d         }|                     |          \  }}|d|fS |dk     |fS |j        j        D ]=}|j        dk    r0|                     |j                  \  }}|d|fc S |dk     |fc S >d|fS )a#  Check presence of `start` kwarg or second argument to enumerate.

        For example:

        `enumerate([1,2,3], start=1)`
        `enumerate([1,2,3], 1)`

        If `start` is assigned to `0`, the default value, this is equivalent to
        not calling `enumerate` with start.
        r<   NFr   rP   )r   r"  r  r!  _get_start_valuer  r  r  )r   r&   r_  	start_arg	start_valr  s         r'   r%  z(RefactoringChecker._enumerate_with_startI	  s     
ty~"" 	q)I$($9$9)$D$D!Iz j(( A~%z11y) 	6 	6G{g%%(,(=(=gm(L(L%	:$ *,,,,$>):5555	 & j  r)   tuple[int | None, Confidence]c                   t          |t          j        t          j        t          j        f          sEt          |t          j                  rSt          |j        t          j        t          j        f          r(t          j        |          }|r|j	        nd }|t          fS t          |t          j                  r|j        j	        t          fS t          |t          j                  r|j	        t          fS d t          fS r"   )r$   r   rV  rs   r  UnaryOprF  r   rt   r  r   r   r  )r   r&   r  r1  s       r'   r/  z#RefactoringChecker._get_start_valuek	  s    tej%*eoFGG	($..	( 4<%/5:)FGG	(
 '--H*2<Ii''dEM** 	,<%t++dEK(( 	$:t##Tzr)   )r   r   r   r   r   )r   r
  )r&   r  r   r   )r&   r  r   r   )r&   r   r   r   )r7   r8   r   r   )r5  r6  r   r   )r&   r.   r   r   )rA  rB  r   r   )r&   rL  r   r   )r&   rQ  r   r   )r&   rT  r   r   )r&   r  rZ  r[  r   r   r   r   )rn  r	   ro  r	   r   r   )r&   r   r   r   )r&   r  r   r   )r&   r  r   r   )r5  r  r   r   )r&   r  r   r   )r  r  r   r   )r&   rW   r   r   )r&   r  r   r   )rG  r  r   r   )r&   r  r   r   )r  r  r   r   )r   r   r   r   )r&   r  r   r  )r&   r  r   r   )r  r[  r
  rN  r   rN  )rV  r  r   r  )r&   ri  r   r   )r&   r  r   r   )r&   ry  r   r   )r&   rW   r   r[  )r&   r   r   r  )r  r  r   r   )r&   r  r   r   )r&   r  r   r   )r&   r  r   r  )r&   r  r   r   r&   r   r   r   )r&   r  r   r   )r&   r
  r   r   )r&   r
  r   r-  )r&   r   r   r2  )[r   r   r   r   r_   msgsoptionsr   r   r	  r   r  staticmethodr  r  r,  r4  r   only_required_for_messagesr:  r@  visit_whilerK  rP  rS  rY  rb  r=  r>  rj  rm  rq  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r<  r  r8  r  r'  r<  rM  rU  rZ  rf  rh  rl  rx  r}  r|  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rN  rO  r%  r/  __classcell__)r   s   @r'   r   r      s         DA 
A 	 
A 	 
A  	 
!A* 	 
+A4 	,$ BCD
5AD 	6'JEFG	
EAP 	 
QA` 	 
aAr 	 
sAD 	 
EAR 	 
SAd 	 
eAr 	 
sA@ 	 
AAN 	 
OA` 	 
aA Ap 	 
qA| 	 	
}AP 	 
QA` 	 
aAl 	 
mA~ 	 
AL 	 
MAX 	 
YAj 	 
kA| 	 
}AH 	 
IAT 	 
UA` 	 
aAj 	 
kAt 	 
uAB 	 
CAP 	 
QA A\


wA A ADH  "T	 	
 (?,2	 	
 4%B	 		
-#GJB B B B B B4 4 4 4
 
 
 
 6 6 6 _6 
 
 
 \

    EU EU EU EUNN N N N" &U%&;<<   =< &U%&>@PQQ1 1 1 RQ1 K   * &U%' ''	 < < < < &U%&EFFA A A GFA &U%')> @ @ @ @L L L LB
 
 
 


 
 
 


 
 
 


 
 
 

 	 	 	 \	M M M M<> > > > &U% #$$
 
9 9 9
 
9S S S Sj &U%&BCC- - - DC-V V V V2 &U% (	 ? ? ? ?  &U%&;<<< < < =<< &U%&=>>: : : ?>:W W W W R R R \R :  :  :  :D" " " "H &U%+*!" + + + + &U%&677I I I 87I( 
 
 
 \
	T 	T 	T 	T< < < <- - - -^F F F F:   ? ? ? ? '
 '
 '
 \'
R   ,
 ,
 ,
 ,
\6 6 6 6p E E E \E8" " " "0   8 &U%% % 1 1 1 1 
 
 
 \
1 1 1 1 &U%% !	         &U%% ! 
W W W 
W6,# ,# ,# ,#\? ? ? ?BD D D D   " N N N \N8 8 8 8(E E E E@ &U%&;<<. . . =<. &U%#'' 
8 8 8 
8
O O O Ob 
 
 
 \
  2 2 2 \2
 
 
 

F F F F,7 7 7 7<# # # #J/Y /Y /Y /Yb    \   .> > > >4P P P PdF F F FP !  !  !  !D       r)   r   )r   r   r   r   r   r   )r&   r.   r   r   r   r   )r7   r8   r9   r:   r   r   )r&   rW   r   r   r5  );
__future__r   r  r]  rN   rA   collections.abcr   	functoolsr   r   rer   typingr   r	   r
   r   r   r\   r   r   astroid.utilr   pylintr   pylint.checkersr   (pylint.checkers.base.basic_error_checkerr   pylint.checkers.utilsr   pylint.interfacesr   r   r   pylint.lintr   r`  r  r  r  r  r  rr   r  r  r  r-   r6   rV   ra   rf   rp   rx   r   r   BaseTokenCheckerr   r   r)   r'   <module>rI     s  
 # " " " " "           $ $ $ $ $ $ - - - - - - - -       > > > > > > > > > > > > > >                  ( ( ( ( ( (       ! ! ! ! ! ! F F F F F F 2 2 2 2 2 2 9 9 9 9 9 9 9 9 9 9 %$$$$$$ eieiIJ -/@A Y/00 '0y( ( $ $-9$ $  ,P P P P   ( ( ( (V         9 9 9 9$   &    Z   8W" W" W" W" W"2 W" W" W" W" W"r)   