§
    ÷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¸�J�uÐ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ð 	(ð 	(‰OˆH�eàŒz�XÔ-Ò-Ð-Ø˜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ÔÐÐF 9Ô#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   øøø€ ð �5ŒM€EØÔ�8œ>Ò)Ð)ØˆuåÔ" 6¨5°1©9°dÑ;Ô;€KàÐØ&ð ð ˆØÔ  Ô# u¤{°1¤~Ò5Ð5Ø"&Ðð Ô#­HÔ,<½hÔ>NÐ+OÐOÐOØ�u�uøàð Øˆ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   € Ø�JŠJ‰LŒL€EÝØ•Ô!¥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]   € Ø�JŠJ‰LŒL€EØ×%Ò%Ñ'Ô'ð ð ˆØ�Uˆ?ˆ?ØˆEÝ�f�eœlÑ+Ô+ð 	Ø�4�4ð	àˆ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 )zˆChecks 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œ   € ð �JŠJ‰LŒL€EØ€GØ
�UÒ
Ð
Ý�g�uœzÑ*Ô*ð 	;Ø!œ-¨Ô*¨1Ô-Ô4ˆKØœ bÔ)¨!Ô,Ô5ˆIØ $¤+Ð:Ð:Ò:Ð:°Ò:Ð:Ð:Ð:Ð:Ø”.ˆð �UÒ
Ð
ð ˆ5r)   c                óÒ   — t          d¦  «        }t          | j        t          j        ¦  «        sdS t          j        | j        j        ¦  «        }|sdS |                     ¦   «         |v S )zŸChecks 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   € õ %.ð	
ñ%ô %Ð!õ �d”k¥5¤:Ñ.Ô.ð ØˆuÝÔ˜DœKÔ,Ñ-Ô-€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 )zéCheck 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”{Ô)Ò)Ð)å�$”+¥¤­U¬ZÐ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   è è € ØÔ'¨Ô)9¸4Ô;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   € õ �e�UÔ.Ñ/Ô/ð 	'ØÔ&Ð&Ý�e�Uœ^Ñ,Ô,ð 	$ØÔ#Ð#ØÔ Ð 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Ø�KŠK‰MŒMˆMˆMð	ð 	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Ð-Ð-Ð-Ñ-Ø.0€NÐ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        d€dd�d‚¦  «        �dd„„¦   «         Z ej        d€¦  «        �dd†„¦   «         Z ej        d€dv¦  «        �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dzd˜d™dšd›dœd�¦	  «	        �ddž„¦   «         Z"�ddŸ„Z# ej        d ¦  «        �dd¢„¦   «         Z$�dd£„Z% ej        dd¤d¥dv¦  «        �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        dªd´dµd¶d·d¸dvd¹dºd»¦
  «
        �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        dÛdÜdÝdÞdß¦  «        �d)dà„¦   «         Z=e�d,dâ„¦   «         Z>�d-dã„Z? ej        dädådædv¦  «        �d.dè„¦   «         Z@ ej        dädådæ¦  «        �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        död�d‚¦  «        �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 (;  ÚRefactoringCheckerzàLooks 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-localzóUsed 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-returnzÜUsed 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-returnzÇAccording 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-statementszüAccording 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-returnz¿Emitted 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-variableszšYou 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-inzêTo 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-getz³Using 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-comparisonz‰This 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-comprehensionzÆAlthough 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-raisezÚUsed 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-exitzˆContrary 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-breakzÚUsed 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-continuezàUsed 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-argumentsz’Emitted 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-withzºEmitted 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-lookupz–Emitted 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-literalzŒEmitted 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-literalz�Emitted 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>zâComplete 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>zœLet '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ˆÔ'Ø�
Š
‰ŒˆÝ47±E´EˆÔ'Ø<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:±u´uˆÔ!Ø+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   € å˜$œ*¥e¤kÑ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   € õ �d”k¥5¤8Ñ,Ô,ð 	 Ø”[Ô'ˆFàð  ˜& T FÒ*Ð*Ø”K ¤Ð1°T´[Ð@Ð@Ø˜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}n¯t	          |t
          j        ¦  «        r“t	          |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=   € ð $ð $ð $àÝ˜f¥eÔ&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=   € ð #ð #ð #àÝ˜f¥eÔ&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¨¬	¡N¤N°aÒ$7Ð$7ØˆFð ”y ”|ˆØ”k !”nˆÝ�l¥E¤LÑ1Ô1ð 	Ý˜k­5¬<Ñ8Ô8ð Ø�Ø#'×#6Ò#6°|Ñ#DÔ#DÐ Ø"&×"5Ò"5°kÑ"BÔ"BÐØ.ˆJˆJÝ˜¥e¤lÑ3Ô3ð 	Ý˜k­5¬<Ñ8Ô8ð Ø�ð$ð $à*Ô2ð$ñ $ô $Ð ð
#ð #à)Ô1ð#ñ #ô #Ðð
 (ð Ð/Bð Ø�ÝÐ*Ñ+Ô+­vÐ6IÑ/JÔ/JÒJÐJØ�à#'×#6Ò#6°|Ñ#DÔ#DÐ Ø"&×"5Ò"5°kÑ"BÔ"BÐØ-ˆJˆJàˆFà#ð 	Ð+>ð 	ØˆFØÔ!Ô'ð 	ð ˆFà×ÒÐ4¸4ÀzÀmÐÑ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‰LˆE�5Ø  œ8ˆLØ˜vÒ%Ð%ð ”×"Ò" E¨!¤H¨f°U¸Q±YÔ.?ÀÔ.BÐ#CÑDÔDÐDÐDØ”×/Ò/Ø&ñô ð Nå$ V¨UÑ3Ô3ðNð × Ò Ð!7¸e¼kÈ!¼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Ò4°Y´^Ñ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Ò5°dÑ;Ô;Ð;Ð;ð	<ð 	<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� D¤I­uÔ/?Ñ@Ô@ð 	AØ×5Ò5°d´iÑ@Ô@Ð@Ð@Ð@ð	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»   € ð œ*ð 	@ð 	@‰JˆC�Ý˜#�uœzÑ*Ô*ð Ø!Ô<ð ð �Eð ”x 5Ð(Ð(Ø! #¤(˜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,  € õ �d�EœIÑ&Ô&ð 	¨4¬>ð 	àˆFàŒ{ð 	àˆFà×Ò Ñ%Ô%ð 	àˆFõ �t�UœXÑ&Ô&ð	Lå1°$Ð8LÑMÔMð	Lõ �t�UœYÑ'Ô'ð		Lð
 ”Nð	Lõ 6°dÐ<PÑQÔQð	Lð ”[ ”^ˆFØ”˜vÔ0Ð1°T´[Ð@Ð@ØF��àU�Ø×Ò˜V¨$°TÅdÐÑ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²   € å�f�eœjÑ)Ô)ð 	.­j¸ÅÄÑ.LÔ.Lð 	.Ø”; &¤+Ò-Ð-Ý�f�eÔ.Ñ/Ô/ð 	.µJØ•EÔ$ñ5
ô 5
ð 	.ð ”; &¤+Ò-Ð-Ý�f�eœkÑ*Ô*ð 	0­z¸&Å%Ä+Ñ/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õ ˆtŒy‰>Œ>˜QÒÐØ�5ð Œy˜Œ|ˆå�t�Uœ\Ñ*Ô*ð	å�D”I˜a”LÔ(Ñ)Ô)¨QÒ.Ð.Ý˜4œ9 Qœ<Ô/°Ô2µEÔ4DÑEÔEð /å˜4œ:¥u¤Ñ7Ô7ð /ð �5ð ”jÔ&ˆà×)Ò)¨$¬*Ô*:¸D¼I¼MÈ!Ô<LÈQÔ<OÑPÔPð	à×-Ò-¨k¸4¼9¼>ÑJÔJð	ð �5õ �%Ô*¨4¬9¬=¸Ô+;¸AÔ+>Ñ?Ô?ÅÄÑLÔLÐLr)   c                óþ  — |                       |¦  «        }|r |j        s|                      d|¬¦  «         d S |r»t          |j        ¦  «        dk    r¥t	          |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¸ÐÑ=Ô=Ð=Ð=Ð=àð		>å�D”KÑ Ô  AÒ%Ð%Ý˜4œ; qœ>­5¬<Ñ8Ô8ð &à×-Ò-Ø”˜A”Ô& qÔ)¨4¬9°Q¬<Ô+?ÀÔ+Bñô ð &õ
 �D”K ”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Ò2°4Ñ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åˆtŒy‰>Œ>˜QÒÐØˆFð
	$ð 
	$ð 
	$ð 
	$ð Œy˜Œ|ˆå�t˜YÑ'Ô'ð 	­3¨t¬|Ñ+<Ô+<ÀÒ+AÐ+AØˆFà”˜a”ˆå�t”y¥%¤-Ñ0Ô0ð	å˜v¥u¤Ñ7Ô7ð	õ ˜tœyœ~­u¬Ñ?Ô?ð	õ ˜4¥¤Ñ.Ô.ð		ð ˆFõ
 �6˜6Ñ"Ô"ð 	Ø!'¤ÐÐÝ�V˜ZÑ(Ô(ð 	Ø!'¤ÐÐàˆFåˆtŒyŒ}ÑÔ Ò!Ð!ØˆFØ$(¤I¤M°!Ô$4Ñ!ˆ�/à"�] 4¤:Ñ.Ô.ˆ
Ø$�} T¤Y¤^Ñ4Ô4ˆØ - ¨oÑ >Ô >ÐàÐ-Ò-Ð-àØ"Ð&8Ò8Ð8åÔ3°HÑ=Ô=ˆHˆHàˆFàÐ3°\ÐBÐBÐBØˆFà�{Ð"Ð"à%ÐQÐQÐ.@ÐQÐQÀJÐQÐQÐQð ð ×ÒØ,°4¸z¸mð ñ ô ð ð ð ð ˜Ð$Ð$à%ÐQÐQÐ.@ÐQÐQÀJÐQÐQÐQð ð ×ÒØ,°4¸z¸mð ñ ô ð ð ð ð	 %Ð$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å�d”i¥¤Ñ/Ô/ð 	+Ø$ˆOˆOà*ˆOàŒIŒO˜Tœ[Ô.Ð/°=Ò@Ð@Ø/˜_Ð/Ð/Ð/ˆJˆJØŒiŒo˜tœ{Ô0Ð1°]ÒBÐBØ%ˆJˆJàˆFà×ÒÐ5¸DÈ
À}ÐÑ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Ò2°4Ô3FÑGÔGÐGà ˆÔà×&Ò& tÑ,Ô,Ð,à×%Ò% dÑ+Ô+Ð+Ø(*ˆÔ˜4œ9Ñ%à×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Ò3°DÑ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ÝÔ˜tœxÑ(Ô(ˆØð 	�* S­5¬>½5¼>Ð*JÑKÔKð 	ØˆFØ×;Ò;¸CÑ@Ô@ð 	WØ×ÒÐ4¸4ÍIÐÑ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ÐQ¸V�6—<’<‘>”>Ð%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ÐQÀsÇwÂwÁyÄyÐQÑQÔQÑQÔQÐQr)   rW   c                óö  — t          |j        t          j        ¦  «        �rÒ|j        �rÌt          |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¦  «        rÙt          |j
        j        ¦  «        dk    r¼t          |j        t          j        t          j        f¦  «        r‘t          |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Ø  € å�t”y¥%¤*Ñ-Ô-ñ	:à”	ñ	:õ ˜4œ9 Qœ<­¬Ñ8Ô8ñ	:ð
 ŒyŒ~ Ò'Ñ'Øœ) Aœ,Ô*�Ý˜g¥u¤zÑ2Ô2ð Ø�Fõ
 ˜w­¬Ñ4Ô4ñå" 7¤<µ%´+½u¼zÐ1JÑKÔKðõ ˜GœLÔ-Ñ.Ô.°!Ò3Ð3Ý" 7¤>µE´KÅÄÐ3LÑMÔMð 4å˜GœNÔ/Ñ0Ô0°AÒ5Ð5à#*¤<Ô#4‘L�D˜&Ø#*¤>Ô#6‘L�D˜&àŸšÑ(Ô(¨D¯NªNÑ,<Ô,<Ò<Ð<Ø"×,Ò,Ñ.Ô.°&×2BÒ2BÑ2DÔ2DÒ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 rët          |j        ¦  «        dk    rÕt          |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ˆå�t�UœZÑ(Ô(ñ	à”	ñ	õ ˜4œ9¥e¤jÑ1Ô1ð	ð ”	” ,Ð.Ð.õ �4”9‰~Œ~ Ò"Ð"¥z°$´)¸A´,ÅÄÑ'OÔ'OÐ"à"œi¨œl×4Ò4Ñ6Ô6°q¸°tÔ<�Ø”=ð UØ"4 kÐ"4Ð"4Ð"4�KØ 4Ñ'�KØ 4§9¢9Ð,TÐ,TÀdÄmÐ,TÑ,TÔ,TÑ#TÔ#TÑT�KØ œIœN�	Ø Ð.Ð.Ø×$Ò$Ø)Ø!Ø'¨Ð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È   € å˜$œ*¥e¤jÑ1Ô1ð 	ØˆFà”Ô#ˆå˜6¥5¤9Ñ-Ô-ð	å˜&¥%¤.Ñ1Ô1ð	õ �6”;ÑÔ 1Ò$Ð$àˆFàŒ=Ô ¤¤Ò0Ð0ØˆFå�d—j’j‘l”l¥EÔ$:Ñ;Ô;ð 	Øˆ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�* Y¨q¤\µEÔ4DÅeÄlÐ3SÑ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ª   € Ý�d”i¥¤Ñ,Ô,ð 	T°´´ÕCUÐ1UÐ1Uð Ÿ*š*™,œ,ˆKØ×&Ò& {Ñ3Ô3ð °t×7NÒ7NØ—	’	‘”ñ8ô 8ð ð �Ø×ÒÐ6¸TÍdÐÑSÔSÐSÐSÐSð	Tð 	TÐ1UÐ1Ur)   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ÐH°s•z #¥u¤zÑ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Ä   € Ý˜$œ)¥U¤ZÑ0Ô0ð 	°D´I´NÀgÒ4MÐ4MØˆFõ �”	‰NŒN˜aÒÐÝÐHÐH¸d¼iÐ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Ý˜(¥E¤NÑ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„  € ð	ð 	ð 	ð 	õ �d”i¥¤Ñ1Ô1ð 	àˆFåˆtŒy‰>Œ>˜QÒÐð ˆFåÔ# D¤IÑ.Ô.ˆõ �x¥Ô!2Ñ3Ô3ð	à—’Ñ Ô  OÒ3Ð3à—J’J‘L”LˆEõ "% T¤Y¡¤°!Ò!3Ðå˜5¥%Ô"3Ñ4Ô4ð	à×&Ò&Ñ(Ô(ð	ð +ð	õ Ô4°T½=ÑIÔIð		ð
 6Ð5°d´iÀ´lÑCÔCð	ð × Ò Ø+°$Å9ð !ñ ô ð ð ð ð	ð 	à3Ð3ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r)   ÚNodesWithNestedBlocksc                ó�  — t          |                     ¦   «         t          j        ¦  «        sdS | j        dd…         }|j        |                     ¦   «         k    r	|g| _        n¦t          | 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ð Ô+¨A¨A¨AÔ.ˆØŒ;˜$Ÿ*š*™,œ,Ò&Ð&Ø#' &ˆDÔÐõ "*¨$Ô*=Ñ!>Ô!>ð *ð *�Ø  D¤KÒ/Ð/Ø�EØÔ#×'Ò'Ñ)Ô)Ð)Ð)å˜$¥¤Ñ)Ô)ð .¨d×.BÒ.BÀ4Ñ.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   € ð —L’L‘N”Nð 	?ð 	?ˆ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   € ð ð ð Ø/9�J×(Ò(Ñ*Ô*ðð ð r)   c                ó$   •— i | ]\  }}|‰v ¯	||“ŒS rœ   rœ   )r%   Úkeyr  Úduplicated_objectss      €r'   ú
<dictcomp>zCRefactoringChecker._duplicated_isinstance_types.<locals>.<dictcomp>)  s1   ø€ ð 
ð 
ð 
Ù%˜3 ¸cÐEWÐ>WÐ>WˆC�Ð>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†  ø€ õ (+¡u¤uÐÝ<GÔ<SÕTWÑ<XÔ<Xˆ	à”Kð 	7ñ 	7ˆDÝ˜d¥E¤JÑ/Ô/ð µ3°t´y±>´>ÀQÒ3FÐ3FØåÔ'¨¬	Ñ2Ô2ˆHØð ¥5Ô#:¸8Ñ#DÔ#Dð ØàŒ} Ò,Ð,Øà $¤	¨!¤× 6Ò 6Ñ 8Ô 8ÐØ#œy¨œ|Ðà  IÐ-Ð-Ø"×&Ò&Ð'8Ñ9Ô9Ð9åÐ*­E¬KÑ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Ð8 D˜4Ð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§   € àŒ7�dŠ?ˆ?ØˆFà×6Ò6°tÑ<Ô<ˆ
Ø,6×,<Ò,<Ñ,>Ô,>ð 	ð 	Ñ(ˆO˜[ÝÐ8Ð8¨KÐ8Ñ8Ô8Ñ8Ô8ˆEØ×ÒØ-ØØ% t§y¢y°Ñ'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Ô)9¸AÒ)=Ð)=ØˆFà”[ð 		ð 		ˆEå˜u¥e¤mÑ4Ô4ðå�u”y‘>”> QÒ&Ð&Ø”9˜Q”< ”?¨+°d´gÔ*>Ð>Ð>à��Ø#œj¨%¬)°A¬,°q¬/Ð9ð ð �
Ý˜j­%¬*Ñ5Ô5ð Ø�F�F�Fððð
  �6ˆ	Ø”[ð 	+ð 	+ˆEÝ™5œ5ˆLØ#œj¨%¬)°A¬,°q¬/Ð9ð 6ð 6�
Ý˜j­5¬:µ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Ò6°vÑ>Ô>Ñ?Ô?ˆØ�Š�oÑ&Ô&Ð&Ý-0°©[¬[¸AÒ-=Ð-=˜Ÿ	š	 &Ñ)Ô)Ð)À6È!Ä9ÈsÁ?ˆØœ' Tš/˜/�B�B¨vˆ	Ø×ÒØØØ! 9¨mÐ<Ýð	 	ñ 	
ô 	
ð 	
ð 	
ð 	
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ð .Ø '¤˜˜Ý# G­U¬[Ñ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   € ­©¬½c¹e¼eÐ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>  € ð Œ7�eÒÐ�s 4¤;Ñ/Ô/°!Ò3Ð3ØˆFð	-ð 	-ð 	-ð 	-õ: Ô#ØDÐDñô ð 	ð
  $œ{ð 	@ð 	@ˆOÝ˜/­5¬=Ñ9Ô9ð @Ø(Ð(¨¸$Ñ?Ô?Ð?øà—k’k‘m”mð 	ð 	ˆFÝ˜V MÔ2×?Ò?ÀÀ}Ô@UÑVÔVÑWÔWˆJÝ" 6¨-Ô#8Ñ9Ô9ÐÝ" 6¨-Ô#8Ñ9Ô9ÐØÐ,Ò,Ð,°Ð>NÒ1NÐ1NØ× Ò Ð!5¸DÐ Ñ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Ý˜×.Ò.­u¬zÑ:Ô:¸EÑBÔBð :Ý Ô+¨GÑ4Ô4�Øð :Ø$,×$7Ò$7Ñ$9Ô$9�Må˜m­TÑ2Ô2ð !Ø!×(Ò(¨Ñ1Ô1Ð1Ð1Ø˜dÒ" }Ò4Ð4Ø�yÐ Ð Ð ð 5ð !ÐD¥U¤[°¸UÒ1BÑ%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 )z³Attempts 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   ø€ ð 
ð 
ð 
ð õ ˜e¥U¤\Ñ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ÐÝ!œY wÑ/Ô/ÐØ×#Ò# 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 )zÁCheck 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Ò2µ5´:Ñ>Ô>ÀÑFÔFð 	Ø×ÒØ-ØØ—n’nÑ&Ô&¨×(AÒ(AÑ(CÔ(CÐDð ñ ô ð ð ð ð ×ÒØ(ØØ—n’nÑ&Ô&¨×(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   € õ �t�Uœ\Ñ*Ô*ð 3Ý�D”LÑ!Ô! QÒ&ð3å˜4œ<¨œ?­EÔ,<Ñ=Ô=ð3õ ˜4œ:¥u¤zÑ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ÐI°Tˆt�tÔ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Ð9 T�””Ð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°$×2CÒ2CÑ2EÔ2E×2RÒ2RÑ2TÔ2TÐ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ˆØ�Œ7�e˜B”iÒÐ D¨¨¨¤H°°c°r°c´
Ò$:Ð$:ØÔ%×,Ò,¨[Ñ9Ô9Ð9Ø/ˆGØ×Ò˜W¨4ÐÑ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?   è è € ð 
ð 
Ø16�J�u�eœmÑ,Ô,ð
ð 
ð 
ð 
ð 
ð 
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Ò-KÈDÌJÑ-WÔ-WÑ*ˆD�+˜{˜{àˆFåð 
ð 
Ø;FÈÐ:Tð
ñ 
ô 
ñ 
ô 
ð 	ð ˆFå$Ô/°ÈtÐTÑTÔTÐØÐ'­:Ø ¥/ñ,
ô ,
Ð'ð ˆFØ2×=Ò=Ñ?Ô?Ðà %Ð'Ð'Ø3ˆGØ$×.Ò.Ñ0Ô0ˆJˆJà.ˆGØ'×1Ò1Ñ3Ô3ÐjÐj¸¿ºÑ9IÔ9IÐjÐjÐQ\×QfÒQfÑQhÔQhÐjÐjˆJØ×Ò˜ 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Ý�d”l 1”o­¬µU´ZÅÄÐ'KÑLÔLð 		"Øœ QœÔ,ˆIÝÔ$ T¤ZÑ0Ô0ˆEØˆ}¥G¨E°6Ñ$:Ô$:ˆ}à�Ø”ZˆFˆFàœ aœÐ)ˆIØ”j�\ˆFÝÐKÐK¸	À6Ð7JÐKÑKÔKÑKÔKð 	ØˆFÝ" 9¨fÑ5Ô5ð 	#ñ 	#‰OˆH�eÝ˜e¥U¤ZÑ0Ô0ð ØÝÔ'¨¬
Ñ3Ô3ˆHàðà—>’>Ñ#Ô#Õ+KÐKÐKÝ! (­UÔ-=½uÔ?OÐ,PÑQÔQð Lð ØÔ3×GÒGÈÏ
Ê
ÉÌÑUÔUˆEõ ˜h­Ô(8Ñ9Ô9ð'�”�àÔ&ð ð
 ˜%ÐÐØ % g¤�ÝÔ(¨¨}Ñ=Ô=ð à%*�E˜'‘NØà× Ò Ø)Ø&ð !ñ ô ð ð #ˆE�'‰N‰Nð7	#ð 	#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Ñ+Ô+ð 	Õ/EÀdÑ/KÔ/Kð 	ð
 ˆFàØÔ.×BÒBØ—
’
‘”ñô çŠf‰hŒhðð ð ˆFÝÔ# D¤IÑ.Ô.ˆØð 	�zØ•uÔ(­%¬.½%Ô:MÐNñ 
ô  
ð 	ð ˆFð �NŠNÑÔÕ 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Ô2ˆHÝ˜(¥E¤NÑ3Ô3ð D¸D¼Ið DØ—>’>Ñ#Ô# Ò6Ð6Ø×$Ò$Ð%7¸dÐ$Ñ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ð 	°d´i´nÈÒ6NÐ6NØˆFÝÔ# D¤IÑ.Ô.ˆå�x¥¤Ñ0Ô0ð
	à—’Ñ Ô  OÒ3Ð3Ø”Ið 4ð ×ÒØ"Ø×3Ò3°DÑ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Ý�4—9’9˜XÑ&Ô&Ñ'Ô'¨2Ò-Ð-Ø�Ø˜dœkÐ)Ð)Ø—’Ð O G¤KÐ OÐ O°G´M×4KÒ4KÑ4MÔ4MÐ OÐ OÑPÔPÐPøØ”{ð 	>ð 	>ˆGÝ�4—9’9˜XÑ&Ô&Ñ'Ô'¨2Ò-Ð-Ø�Ø�OŠOÐ< ¤×!8Ò!8Ñ!:Ô!:Ð<Ð<Ñ=Ô=Ð=Ð=Ø—Y’Y˜xÑ(Ô(ˆ
ØM�JÐM­S°©_¬_¸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Ü   € å�d�EœJÑ'Ô'ð 	1Ý˜ d¤iÑ0Ô0Ð0Ý˜$¥¤Ñ0Ô0ð 	Ø�4ð
ð 
Ø#œ{ð
ñ 
ô 
ˆõ ˆv‰;Œ;˜!ÒÐ¥:¨f°Q¬i¬o½u¼zÑ#JÔ#JÐØ�4õ ˜dœkÑ*Ô*­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    oªt          |j
        t          j        ¦  «        o‹t	          |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 )zÿWe 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  € ð Ô$ˆÝ˜(¥E¤IÑ.Ô.ð 	µ#°h´mÑ2DÔ2DÀqÒ2HÐ2HØˆFØ×*Ò*Ñ,Ô,ˆÝ˜&¥%¤,Ñ/Ô/ð 	ØˆFð
ð 
à œ.ð
ñ 
ô 
Ðð ŒM˜TÒ!ð TÝ˜:Ô,­eÔ.>Ñ?Ô?ðTå�H”MÑ"Ô" 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        ¦  «        rÄt          |j        j	        t          j
        ¦  «        r t          |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ú|�rùd }t-          j        |j        ¦  «        }t          |j        t          j        ¦  «        rHt          |t2          j        j        ¦  «        r)d|j        j        j                             ¦   «         › d	�f}n¯t          |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¸#•J˜s¥EÔ$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   € Ð@Ð@Ð@¨˜3œ8Ð@Ð@Ð@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ÐL¸3�: c­5¬:Ñ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   € Ð;Ð;Ð;¨#˜SœXÐ;Ð;Ð;r)   c                óP   — g | ]#}t          |t          j        ¦  «        ¯|j        ‘Œ$S rœ   r  r¿  s     r'   r  zGRefactoringChecker._check_unnecessary_comprehension.<locals>.<listcomp>  s=   € ð ð ð àÝ% c­5Ô+;Ñ<Ô<ðØœðð ð 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ð	å�4”8‰}Œ} Ò!Ð!Ý�4”;Ô)Ñ*Ô*¨aÒ/Ð/ØŒ}ð 0ð ˆFõ �t”{¥E¤NÑ3Ô3ð#	å˜4œ;œ?­E¬JÑ7Ô7ð#	õ ˜4œ;Ô,­e¬jÑ9Ô9ð#	õ ˜4œ;­¬Ñ4Ô4ð	#	õ
 ÐRÐRÀÄÔAQÐRÑRÔRÑRÔRð#	ð œœÔ-¨t¬{Ô/@Ô/EÐFˆIØ@Ð@¨t¬{Ô/?Ð@Ñ@Ô@ˆK‰Kå˜œ¥e¤nµe´mÐ%DÑEÔEð 	Ø”;”?ˆDÝ˜$¥¤
Ñ+Ô+ð Ø œI�	�	Ý˜D¥%¤+Ñ.Ô.ð ÝÐLÐLÀ$Ä)ÐLÑLÔLÑLÔLð Ø�FØ;Ð;°´Ð;Ñ;Ô;�	�	à�	Ø”[Ô+¨AÔ.Ô5ˆFõ ˜f¥eÔ&6Ñ7Ô7ð
�”�õ " &­%¬+Ñ6Ô6ðð ð à#)¤;ðñ ô ð ð ð ˆKð ˆFØ˜Ò#Ñ#¨	Ñ#Ø&*ˆDÝÔ'¨¬	Ñ2Ô2ˆHÝ˜$œ+¥u¤~Ñ6Ô6ð :½:Ø�'œ/Ô3ñ<ô <ð :ð C ¤	¤Ô 3× =Ò =Ñ ?Ô ?ÐBÐBÐBÐD��Ý˜DœK­¬Ñ8Ô8ð :½ZØ�%œ*ñ>ô >ð :ð 9 ¤	× 3Ò 3Ñ 5Ô 5Ð8Ð8Ð8Ð:��Ý˜DœK­¬Ñ7Ô7ð :½JØ�%œ)ñ=ô =ð :ð 8˜tœy×2Ò2Ñ4Ô4Ð7Ð7Ð7Ð9�Øð Ø× Ò Ø/°d´kÈð !ñ ô ð ð �å˜$œ+¥u¤~Ñ6Ô6ð Ø��Ý˜DœK­¬Ñ8Ô8ð Ø��Ý˜DœK­¬Ñ7Ô7ð Ø��à�à×ÒØ+Ø”[ØÐ8Ð8 ¤	× 3Ò 3Ñ 5Ô 5Ð8Ð8Ð8Ð:ð ñ ô ð ð ð ð= $Ð#Ð#Ð#r)   c                óæ  — t          | t          j        ¦  «        o×| j        dk    oÌt	          | j        ¦  «        dk    o´t          | j        d         t          j        ¦  «        o�t          | 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 )z²Returns 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×   € õ �t�Uœ\Ñ*Ô*ð 0Ø”˜4’ð0å�D”KÑ Ô  AÒ%ð0õ ˜4œ; qœ>­5¬<Ñ8Ô8ð0õ ˜tœ{¨1œ~­u¬|Ñ<Ô<Ð<ð	0ð
 ”˜A”Ô! UÒ*ð0õ ˜tœ{¨1œ~Ô4°QÔ7½¼ÑFÔFÐFð0õ �D”K ”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ñ)
ô )
ˆÔ˜4œ9Ñ%Ð%Ð%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&   € ð 
ð 
ð 
ØÀÄÐ@WˆEÐ@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ØÔ˜tœyÔ)ñ%
ô %
ò 
ð 
à×(Ò(¨Ñ.Ô.ð
ð ˆ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 )zïCheck 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   øè è € ð 
ð 
àÝ˜d¥EÔ$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   øè è € ð "
ð "
àÝ˜d¥EÔ$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 )zøCheck 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ÝÔ˜tœxÑ(Ô(ˆàˆKÝ˜#�Ñ/Ô/ð å˜3 Ñ)Ô)ð ð �5Ø—:’:‘<”<×%Ò% cÑ*Ô*¨2Ô.ˆÝÔ/°°hÑ?Ô?ˆØ%-Ð%9•4˜‘>”>�>¸rˆØð 	Võ ÐUÐUÐUÐUÈHÐ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 )zíCheck 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;   € ð ð ð àÝ˜f¥eÔ&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ÐP¸V�d×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‘  ø€ õ �d�EœLÑ)Ô)ð 	Ø�4Ý�d�EœJÑ'Ô'ð 	ðØ#œy×1Ò1Ñ3Ô3°AÔ6�Ø×8Ò8¸ÑFÔFð  Ø˜4ð øåÔ)ð ð ð Ø�ðøøøå�d�EœKÑ(Ô(ð 	ð ”I×(Ò(Ñ*Ô*ÐJÕ3DÀTÑ3JÔ3JÐ/Jð Ísð Sð Sð Sð SØ?C¼{ðSñ Sô Sñ Pô Pð õ �d�EœKÑ(Ô(ð 	:Ø×3Ò3°DÑ9Ô9Ð9Ý�d�EœHÑ%Ô%ð 	7Ø×0Ò0°Ñ6Ô6Ð6Ý�d�EœIÑ&Ô&ð 		Qðð à"×/Ò/Ñ1Ô1ðñ ô ˆHõ
 " $×"3Ò"3Ñ"5Ô"5Ñ6Ô6¸ÑAˆOÝð ð ð ð ØAPðñ ô ñ ô ð QåÐPÐPÐPÐPÀxÐPÑPÔPÑPÔPðQõ �t�Uœ\Ñ*Ô*ð	å˜4œ9¥e¤kÑ2Ô2ð	ð ”I”Oð	ð �4åÐXÐXÐXÐXÀD×DUÒDUÑDWÔDWÐ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Ô6ˆLð ð 	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¼   € õ �d�UÔ.µÔ0CÐDÑEÔEð 	È$Ì,ð 	å˜4œ<­¬Ñ9Ô9ð 8Ø”LÔ)¨ZÒ7ð4å˜dœl­E¬JÑ7Ô7ð 4Ø”LÔ%¨Ò3ð	ð	Ø—:’:‘<”< 4Ô#BÐBÐBøÝ�>Ð*ð 	ð 	ð 	Ø�5�5ð	øøø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ÝˆtŒy‰>Œ>˜QÒÐØˆFàŒy˜Œ}ˆÝ�d�EœLÑ)Ô)ð 	>àŒzÐ!Ø× Ò Ð!1¸Ð Ñ=Ô=Ð=Ð=Ð=å˜DœJ­¬Ñ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    �rót          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        ¦  «        �rºt          |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�×$Ò$¥e¤iµ´Ð%=Ñ>Ô>ð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  € õ �t”y¥%¤*Ñ-Ô-ñH	å˜4œ9œ>­5¬?Ñ;Ô;ñH	ð ”	”Ô'¨7Ò2Ñ2åÔ'¨¬	¬Ñ7Ô7ˆHÝ˜h­Ô(;Ñ<Ô<ð Ø�Ø$(¤I¤NÔ$7×$AÒ$AÑ$CÔ$CÐ!ð ˆHõ ˜d¥E¤IÑ.Ô.ð6�”	�	å˜$œ+×2Ò2Ñ4Ô4Ñ5Ô5ð õ %œ?×8Ò8ð 9ð 9ØLTð9ñ 9ô 9ñ ô ˆLõ  $ L°$Ñ7Ô7¸tÐCÐà!ð _ñ _�Ø!&×!5Ò!5µe´oÑ!FÔ!Fð ^ñ ^�IÝ% i¤o½¼
ÅEÄOÐ7TÑUÔUð !Ø à%œO�Eå! $­¬	Ñ2Ô2ð Õ7TØ!ñ8ô 8ð ð
 ˜˜˜å! )Ô"2µE´LÑAÔAð à˜˜˜õ " %­¬Ñ4Ô4ñ Lå *¨4¬;½¼Ñ DÔ Dð%õ  # 4¤;Ô#3Ñ4Ô4°qÒ8Ð8Ø$œz¨T¬[Ô-=¸aÔ-@Ô-EÒEÐEØ4¸	¼×8QÒ8QÑ8SÔ8SÒSÐSá$õ ' t­U¬YÑ7Ô7ð%à %§¢¨U¬ZÑ 8Ô 8¸Ô ;¸BÔ ?Ô FÈÌÒ TÐ Tñ %à+ð Ø$ŸOšOà,5Ø04´Ô0@ÀÔ0C×0MÒ0MÑ0OÔ0Oð!"ð !"ñô ð ñ ð !×,Ò,Ø ?Ø%.Ø&*¤kÔ&6°qÔ&9×&CÒ&CÑ&EÔ&EÐ%Gð -ñ ô ð ñ õ $ E­5¬?Ñ;Ô;ñ )å *¨4¬;½Ô8HÑ IÔ Ið%å#-¨e¬k½5¼:Ñ#FÔ#Fð%ð  $œ{Ô/°5´;Ô3CÒCÐCØ4¸	¼×8QÒ8QÑ8SÔ8SÒSÐSá$õ ' t­U¬YÑ7Ô7ð	%à %¤× 2Ò 2°5´;Ô3CÑ DÔ DÀQÔ GÈÔ KÔ RØ"œkò!*ð !*ñ %õ $)Ô#3°E´KÑ#@Ô#@˜Ý)¨(µE´KÑ@Ô@ð %ÀHÄNÐVWÒDWÐDWÙ$à+ð Ø$ŸOšOà,5Ø03·²Ø(-¯ªÑ(9Ô(9×(@Ò(@ÀÈqÐ(@Ñ(QÔ(Qñ1&ô 1&ð!"ð !"ñô ð ñ ð !×,Ò,Ø ?Ø%.à$'§H¢H¨U¯_ª_Ñ->Ô->×-EÒ-EÀcÐTUÐ-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
Ø?DˆE× Ò ¥%¤)­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
Ø/4ˆE× Ò ¥¤Ñ*Ô*ð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Š  € õ ˜4œ9¥e¤jÑ1Ô1ð	å˜dœiœn­e¬jÑ9Ô9ð	ð ”9”>Ô&¨+Ò5Ð5àˆFå!%Ðð	/Ý Ô7Ø”	 A¨zðñ ô ˆLˆLøõ Ô(ð 	/ð 	/ð 	/Ý Ô6°t´yÈ*ÐUÑUÔUˆLÝ%.Ð"Ð"Ð"ð	/øøøõ ˜,­¬
Ñ3Ô3ð 	ØˆFå˜$œ+¥u¤{Ñ3Ô3ð 	µs¸4¼;Ô;KÑ7LÔ7LÈqÒ7PÐ7PàˆFå˜$œ+Ô*¨1Ô-­uÔ/?Ñ@Ô@ð 	ð ˆFà$(×$>Ò$>¸tÑ$DÔ$DÑ!ˆ�zØð 	ð ˆFð
 &­Ò2Ð2ð #Ð"àð 	ð !-Ô 1ÐØœÔ)¨!Ô,ˆð ˆ	õ ˜$¥¤	Ñ*Ô*ð2ˆDŒIˆIå�d”k×.Ò.Ñ0Ô0Ñ1Ô1ð 	õ !”×4Ò4ð 5
ð 5
ØHPð5
ñ 5
ô 5
ñ 
ô 
ˆõ   ¨dÑ3Ô3¸4Ð?Ðõ "œ×5Ò5ð 6
ð 6
Ø8@ð6
ñ 6
ô 6
ñ 
ô 
ˆõ ! °Ñ5Ô5¸TÐAÐàð 3	ñ 3	ˆEØ"×1Ò1µ%´/ÑBÔBð 2ñ 2�	Ý˜d¥E¤IÑ.Ô.ð Õ3PØñ4ô 4ð ð
 �F�F�Få˜iÔ.µ´Ñ=Ô=ð à�F�F�Fà!œ�Ý˜e¥U¤ZÑ0Ô0ñ %àœ
 d¤kÔ&6°qÔ&9Ô&>Ò>Ð>Ø0°I´O×4MÒ4MÑ4OÔ4OÒOÐOà õ # 4­¬Ñ3Ô3ð!à!ŸLšL¨¬Ñ4Ô4°QÔ7¸Ô;ÔBÀTÄ[ÒPÐPñ !õ # 4­¬Ñ3Ô3ð!à!ŸLšL¨Ô)<Ñ=Ô=¸aÔ@ÀÔDÔKØœ+ò&ð &ñ
 !à'ð ð "×(Ò(¨Ñ3Ô3Ð3Ñ3Ø*ð Ù à×(Ò(Ø;Ø!*Ø"&¤+Ô"2°1Ô"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ç   € õ ˆ
åˆtŒyŒ~ÑÔ Ò"Ð"ð œ	œ qÔ)ˆIØ$(×$9Ò$9¸)Ñ$DÔ$DÑ!ˆI�zØÐ Ø˜jÐ(Ð(Ø  A’~Ð% zÐ1Ð1à”yÔ)ð 	6ð 	6ˆGØŒ{˜gÒ%Ð%Ø(,×(=Ò(=¸g¼mÑ(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Ð   € å�t�eœj­%¬*µe´oÐFÑGÔGð	(å˜$¥¤Ñ.Ô.ð	(õ ˜4œ<­%¬/½5¼:Ð)FÑGÔGð	(õ
 Ô'¨Ñ-Ô-ˆHØ*2Ð<˜œ˜¸ˆIØ�iÐ'Ð'Ý�d�EœMÑ*Ô*ð 	,Ø”<Ô%¥tÐ+Ð+Ý�d�EœKÑ(Ô(ð 	$Ø”:�tÐ#Ð#Ø•TˆzÐ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€DðH  àØØ"ØTð	ð ð	
ð (à?ØØ,ð2ð	ð ð	
ð 4àØØ%ðBð	ð 	ð	
ð-#€GñJ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àð %Ø$Ð$Ð$Ð$Ð$Ð$ð ˜eœi¨¬°e´iÀÄÐIÔJÐ à-Ð/@ÐAÐ Ø�YÐ/Ñ0Ô0Ð Ø'0 yðñ(ô (Ð $ð $- 9ðñ$ô $Ð  ð,Pð Pð Pð Pðð ð ð ð(ð (ð (ð (ðVð ð ð ðð ð ð ðð ð ð ð9ð 9ð 9ð 9ð$ð ð ð ð&ð ð ð ð ˜Zñ ô ð ð8W"ð W"ð W"ð W"ð W"˜Ô2ñ W"ô W"ð W"ð W"ð W"r)   