§
    öyIfªh  ã                  ó`  — U d Z ddlmZ ddlZddlm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 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 h d£Zej        ej         hZ!dddddddddddej"        ifddddœZ#de$d <   d1d)„Z% G d*„ d"¦  «        Z& G d+„ d,ee¦  «        Z'd2d0„Z(dS )3zÎPython code format's checker.

By default, try to follow Guido's style guide :

https://www.python.org/doc/essays/styleguide/

Some parts of the process_token method is based from The Tab Nanny std module.
é    )ÚannotationsN)Úreduce)ÚMatch)ÚTYPE_CHECKINGÚLiteral)Únodes)ÚBaseRawFileCheckerÚBaseTokenChecker)Úonly_required_for_messages)ÚWarningScope)ÚHIGH)ÚMessageDefinitionTuple)Ú	OPTION_POÚPragmaParserErrorÚparse_pragma)ÚPyLinter>   ÚifÚinÚdelÚforÚnotÚelifÚwithÚraiseÚwhileÚyieldÚassertÚexceptÚreturnú=ú:=)zLine too long (%s/%s)úline-too-longz=Used when a line is longer than a given number of characters.)z Too many lines in module (%s/%s)útoo-many-linesz@Used when a module has too many lines, reducing its readability.)zTrailing whitespaceútrailing-whitespacezHUsed when there is whitespace between the end of a line and the newline.)zFinal newline missingúmissing-final-newlinez7Used when the last line in a file is missing a newline.)zTrailing newlinesútrailing-newlinesz3Used when there are trailing blank lines in a file.)z)Bad indentation. Found %s %s, expected %súbad-indentationzUUsed when an unexpected number of indentation's tabulations or spaces has been found.)zUnnecessary semicolonúunnecessary-semicolonzeUsed when a statement is ended by a semi-colon (";"), which isn't necessary (that's python, not C ;).z(More than one statement on a single lineúmultiple-statementsz<Used when more than on statement are found on the same line.Úscope)z#Unnecessary parens after %r keywordúsuperfluous-parenszLUsed when a single item in parentheses follows an if, for, or other keyword.)zMixed line endings LF and CRLFúmixed-line-endingsz@Used when there are mixed (LF and CRLF) newline signs in a file.)zEUnexpected line ending format. There is '%s' while it should be '%s'.úunexpected-line-ending-formatz3Used when there is different newline than expected.)ÚC0301ÚC0302ÚC0303ÚC0304ÚC0305ÚW0311ÚW0301ÚC0321ÚC0325ÚC0327ÚC0328z!dict[str, MessageDefinitionTuple]ÚMSGSÚtokensÚTokenWrapperÚline_endÚintÚtokenÚstrr   Úboolc                óÖ   — |dk    r|                       |dz
  ¦  «        |k    pG|dk    oA|                       |dz
  ¦  «        |k    o%|                      |dz
  ¦  «        t          j        k    S )Nr   é   é   )r>   ÚtypeÚtokenizeÚCOMMENT)r:   r<   r>   s      úJ/var/www/piapp/venv/lib/python3.11/site-packages/pylint/checkers/format.pyÚ_last_token_on_line_isrH   u   st   € à�1Šð 	0Ø�LŠL˜ A™Ñ&Ô&¨%Ò/ð	:à�aŠ<ð :Ø�LŠL˜ A™Ñ&Ô&¨%Ò/ð:à�KŠK˜ 1™Ñ%Ô%­Ô)9Ò9ðó    c                  óB   — e Zd ZdZdd„Zdd
„Zdd„Zdd„Zdd„Zdd„Z	dS )r;   z3A wrapper for readable access to token information.r:   úlist[tokenize.TokenInfo]r   ÚNonec                ó   — || _         d S ©N©Ú_tokens)Úselfr:   s     rG   Ú__init__zTokenWrapper.__init__‚   s   € ØˆŒˆˆrI   Úidxr=   r?   c                ó(   — | j         |         d         S )NrB   rO   ©rQ   rS   s     rG   r>   zTokenWrapper.token…   ó   € ØŒ|˜CÔ  Ô#Ð#rI   c                ó(   — | j         |         d         S )Nr   rO   rU   s     rG   rD   zTokenWrapper.typeˆ   rV   rI   c                ó4   — | j         |         d         d         S )NrC   r   rO   rU   s     rG   Ú
start_linezTokenWrapper.start_line‹   ó   € ØŒ|˜CÔ  Ô# AÔ&Ð&rI   c                ó4   — | j         |         d         d         S )NrC   rB   rO   rU   s     rG   Ú	start_colzTokenWrapper.start_colŽ   rZ   rI   c                ó(   — | j         |         d         S )Né   rO   rU   s     rG   ÚlinezTokenWrapper.line‘   rV   rI   N©r:   rK   r   rL   )rS   r=   r   r?   )rS   r=   r   r=   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__rR   r>   rD   rY   r\   r_   © rI   rG   r;   r;      s’   € € € € € Ø=Ð=ðð ð ð ð$ð $ð $ð $ð$ð $ð $ð $ð'ð 'ð 'ð 'ð'ð 'ð 'ð 'ð$ð $ð $ð $ð $ð $rI   c                  óx  ‡ — e Zd ZdZdZeZddddddœfd	d
ddddœfddddddœfddddddœfddddddœfddddddœfddddd dœfd!d"d#d$g d%¢d&d'œffZdTˆ fd,„ZdUd1„Z	dVd4„Z
dWd7„ZdXd8„ZdYd<„Z ed=¦  «        dZd?„¦   «         Zd[dA„Zd\dC„Zd]dF„Zed^dI„¦   «         Zed_dK„¦   «         Zed`dN„¦   «         ZdadP„ZdbdS„Zˆ xZS )cÚFormatCheckerzvFormatting checker.

    Checks for :
    * unauthorized constructions
    * strict indentation
    * line length
    Úformatzmax-line-lengthéd   r=   z<int>z.Maximum number of characters on a single line.)ÚdefaultrD   ÚmetavarÚhelpzignore-long-linesÚregexpz<regexp>z^\s*(# )?<?https?://\S+>?$z>Regexp for a line that is allowed to be longer than the limit.)rD   rk   rj   rl   zsingle-line-if-stmtFÚynz<y or n>zOAllow the body of an if to be on the same line as the test if there is no else.zsingle-line-class-stmtzfAllow the body of a class to be on the same line as the declaration if body contains single statement.zmax-module-linesiè  z$Maximum number of lines in a module.zindent-stringz    Únon_empty_stringz<string>zSString used as indentation unit. This is usually "    " (4 spaces) or "\t" (1 tab).zindent-after-parenr^   zGNumber of spaces of indent required inside a hanging or continued line.zexpected-line-ending-formatÚchoicez<empty or LF or CRLF>Ú )rq   ÚLFÚCRLFzIExpected format of line ending, e.g. empty (any line ending), LF or CRLF.)rD   rk   rj   Úchoicesrl   Úlinterr   r   rL   c                óf   •— t          ¦   «                              |¦  «         i | _        i | _        d S rN   )ÚsuperrR   Ú_linesÚ_visited_lines)rQ   ru   Ú	__class__s     €rG   rR   zFormatChecker.__init__þ   s0   ø€ Ý‰Œ×Ò˜Ñ Ô Ð Ø&(ˆŒØ8:ˆÔÐÐrI   r:   r;   r<   Ú
line_startc                ó~  — t          ||d¦  «        r*|                      d|                     |¦  «        ¬¦  «         |                     |¦  «        }|                     |¦  «        }|                     |¦  «        t
          vr#|                     d¦  «        d         | j        |<   |                      ||||¦  «         dS )z9A new line has been encountered, process it if necessary.ú;r(   ©r_   ú
r   N)	rH   Úadd_messagerY   r_   rD   Ú_JUNK_TOKENSÚsplitrx   Úcheck_lines)rQ   r:   r<   r{   Úline_numr_   s         rG   Únew_linezFormatChecker.new_line  s·   € å! &¨(°CÑ8Ô8ð 	XØ×ÒÐ4¸6×;LÒ;LÈXÑ;VÔ;VÐÑWÔWÐWà×$Ò$ ZÑ0Ô0ˆØ�{Š{˜:Ñ&Ô&ˆØ�;Š;�zÑ"Ô"­,Ð6Ð6Ø$(§J¢J¨tÑ$4Ô$4°QÔ$7ˆDŒK˜Ñ!Ø×Ò˜ ¨T°8Ñ<Ô<Ð<Ð<Ð<rI   Únodeúnodes.Modulec                ó   — d S rN   re   )rQ   r†   s     rG   Úprocess_modulezFormatChecker.process_module  s   € ØˆrI   rK   Ústartc                ó¬  — ||dz            j         dk    rdS ||         j         dk    r|dk    r||dz
           j         dk    rdS d}d}d}d}d}t          ||         j         ¦  «        }||         j        d         }	t          |t	          |¦  «        dz
  ¦  «        D �]·}
||
         }|j        t          j        k    r dS |j         dk    s|j         ||
dz            j         z   dk    rd	}|}|j         dk    r|dz  }||
dz            j         dk    rd}Œu|j         d
k    r³|dz  }|r$|r||
dz            j         d
k    r|dv rŒ¢ dS |dz  }Œ«||
dz            j         dv s3||
dz            j        t          j        t          j	        t          j
        hv r@|r|dz
  |k    r dS |
|dz   k    r dS |r dS |dk    r dS |                      d|	|¬¦  «          dS |dk    r~|d         dk    r dS |d         dv rd	}�ŒV|d         dk    r dS |d         dk    r dS |d         dk    r7dd„ ||
d…         D ¦   «         v r|                      ||
d…         d¦  «          dS �Œ¹dS )aN  Check that there are not unnecessary parentheses after a keyword.

        Parens are unnecessary if there is exactly one balanced outer pair on a
        line and contains no commas (i.e. is not a tuple).

        Args:
        tokens: The entire list of Tokens.
        start: The position of the keyword in the token list.
        rB   ú(Nr   r   ÚisFr!   Tú)>   r   r   r   >   Ú}r   rŽ   ú:ú]rC   r   r+   ©r_   Úargsú,>   ÚorÚandr   r   Úelsec              3  ó$   K  — | ]}|j         V — Œd S rN   )Ústring)Ú.0Úis     rG   ú	<genexpr>z;FormatChecker._check_keyword_parentheses.<locals>.<genexpr>u  s$   è è € Ð<Ð<¨A˜qœxÐ<Ð<Ð<Ð<Ð<Ð<rI   )r™   r?   rŠ   ÚrangeÚlenrD   rE   ÚNLÚNEWLINEÚ	ENDMARKERrF   r€   Ú_check_keyword_parentheses)rQ   r:   rŠ   Úfound_and_orÚcontains_walrus_operatorÚwalrus_operator_depthÚcontains_double_parensÚdepthÚkeyword_tokenr„   r›   r>   s               rG   r¢   z(FormatChecker._check_keyword_parentheses  sD  € ð �%˜!‘)ÔÔ# sÒ*Ð*ØˆFà�5ŒMÔ  EÒ)Ð)Ø˜’	�	Ø�u˜q‘yÔ!Ô(¨DÒ0Ð0ð ˆFØˆØ#(Ð Ø !ÐØ!"ÐØˆÝ˜F 5œMÔ0Ñ1Ô1ˆØ˜%”=Ô& qÔ)ˆÝ�u�c &™kœk¨A™oÑ.Ô.ð G	ñ G	ˆAØ˜1”IˆEð Œz�Xœ[Ò(Ð(Ø��ð ” Ò$Ð$Ø”< &¨¨Q©¤-Ô"6Ñ6¸$Ò>Ð>à+/Ð(Ø(-Ð%ØŒ|˜sÒ"Ð"Ø˜‘
�Ø˜!˜a™%”=Ô'¨3Ò.Ð.Ø-.Ð*øØ” Ò$Ð$Ø˜‘
�Øð Ø-ð °&¸¸Q¹´-Ô2FÈ#Ò2MÐ2Mà(Ð,?Ð?Ð?Ø$Ø˜˜Ø*¨aÑ/Ð*Øà˜!˜a™%”=Ô'Ð+EÐEÐEÈØ˜‘EôJä�8Ô+­XÔ-?ÅÔAQÐRðJSð JSð 0ð Ð4IÈAÑ4MÐQVÒ4VÐ4VØ˜˜à˜E A™I’~�~Ø˜˜Ø#ð Ø˜˜Ø$¨Ò,Ð,ð ˜˜Ø×$Ò$Ø,°8À-ð %ñ ô ð ð ��Ø˜!’�à˜”8˜s’?�?Ø�F�Fð ˜”8˜}Ð,Ð,Ø#'�L‘Lð ˜1”X Ò(Ð(Ø�F�Fð
 ˜1”X Ò&Ð&Ø�F�Fð ˜1”X Ò'Ð'ØÐ<Ð<°¸¸¸´Ð<Ñ<Ô<Ð<Ð<Ø×7Ò7¸¸q¸r¸r¼
ÀAÑFÔFÐFØ�F�FùðOG	ð G	rI   c                ó°  ‡ — dg}d}d}i ‰ _         i ‰ _        d‰ _        d}t          |¦  «        D �]ã\  }\  }}}	}
}|	d         |k    rj|	d         }|t          j        k    r+‰                      t          |¦  «        |dz
  |dz   ¦  «         n'‰                      t          |¦  «        |dz
  |¦  «         |t          j        k    rd}‰  	                    ||¦  «         nÝ|t          j        k    rAd}‰  
                    ||d         dz   |¦  «         |                     |d         dz   ¦  «         nŒ|t          j        k    rd}t          |¦  «        dk    r|d= nc|t          j        k    r|                     d¦  «        s|}n;|t          j        t          j        fvr!|rd}‰  
                    ||d         |¦  «         |t          j        k    r,|                     d¦  «        r‰                      d	|¬
¦  «         |t*          v r‰                      ||¦  «         �Œå|dz  }|‰ j        j        j        k    r�‰ j        j                             d¦  «        d         }|j        df}t;          t=          dˆ fd„|D ¦   «         ¦  «        d¦  «        }‰                      d|‰ j        j        j        f|¬¦  «         ||k    r|dk    r‰                      d|¬
¦  «         dS dS dS )zÎProcess tokens and search for:

        - too long lines (i.e. longer than <max_chars>)
        - optionally bad construct (if given, bad_construct must be a compiled
          regular expression).
        r   FNrB   Téÿÿÿÿú
Úlzlowercase-l-suffixr~   r#   c              3  óV   •K  — | ]#}‰j         j                             |¦  «        V — Œ$d S rN   )ru   Ú_pragma_linenoÚget)rš   ÚnamerQ   s     €rG   rœ   z/FormatChecker.process_tokens.<locals>.<genexpr>Ã  s6   øè è € ÐUÐUÀt˜dœkÔ8×<Ò<¸TÑBÔBÐUÐUÐUÐUÐUÐUrI   ©r“   r_   r&   )rx   ry   Ú_last_line_endingÚ	enumeraterE   ÚINDENTr…   r;   r    Ú_check_line_endingÚcheck_indent_levelÚappendÚDEDENTrž   rŸ   ÚstriprF   ÚENCODINGÚNUMBERÚendswithr€   Ú_KEYWORD_TOKENSr¢   ru   ÚconfigÚmax_module_linesÚ
msgs_storeÚget_message_definitionsÚmsgidÚnextÚfilter)rQ   r:   ÚindentsÚcheck_equalr„   Úlast_blank_line_numrS   Útok_typer™   rŠ   Ú_r_   Úmessage_definitionÚnamesÚlinenos   `              rG   Úprocess_tokenszFormatChecker.process_tokensy  s9  ø€ ð �#ˆØˆØˆØˆŒØ ˆÔØ-1ˆÔØÐÝ7@ÀÑ7HÔ7Hð 1	=ñ 1	=Ñ3ˆCÑ3�(˜F E¨1¨dØ�QŒx˜8Ò#Ð#Ø  œ8�ð �xœÒ.Ð.Ø—M’M¥,¨vÑ"6Ô"6¸¸a¹ÀÀqÁÑIÔIÐIÐIà—M’M¥,¨vÑ"6Ô"6¸¸a¹ÀÑEÔEÐEà�8Ô+Ò+Ð+ð #�Ø×'Ò'¨°Ñ9Ô9Ð9Ð9Ø�Xœ_Ò,Ð,Ø#�Ø×'Ò'¨°¸´¸a±ÀÑJÔJÐJØ—’˜w rœ{¨Q™Ñ/Ô/Ð/Ð/Ø�Xœ_Ò,Ð,ð
 #�Ý�w‘<”< !Ò#Ð#Ø ˜øØ�Xœ[Ò(Ð(Ø—z’z &Ñ)Ô)ð 3Ø*2Ð'øØ¥(Ô"2µHÔ4EÐ!FÐFÐFð ð IØ"'�KØ×+Ò+¨D°'¸"´+¸xÑHÔHÐHà�8œ?Ò*Ð*¨v¯ª¸sÑ/CÔ/CÐ*Ø× Ò Ð!5¸HÐ ÑEÔEÐEà�Ð(Ð(Ø×/Ò/°¸Ñ<Ô<Ð<ùà�A‰ˆØ�d”kÔ(Ô9Ò9Ð9ð "&¤Ô!7×!OÒ!OØ ñ"ô "àô"Ðð (Ô-Ð/?Ð@ˆEÝÝ�tÐUÐUÐUÐUÈuÐUÑUÔUÑVÔVØñô ˆFð ×ÒØ Ø ¤Ô 2Ô CÐDØð ñ ô ð ð Ð*Ò*Ð*¨x¸!ª|¨|Ø×ÒÐ0°xÐÑ@Ô@Ð@Ð@Ð@ð +Ð*¨|¨|rI   Úline_endingr?   r„   c                ó  — | j         �$|r"|| j         k    r|                      d|¬¦  «         || _         | j        j        j        }|r>t          d„ |d¦  «        }|dk    rdnd}||k    r|                      d||f|¬	¦  «         d S d S d S )
Nr,   r~   c                ó   — | |k    r| |z   n| S rN   re   )ÚxÚys     rG   ú<lambda>z2FormatChecker._check_line_ending.<locals>.<lambda>à  s   € °q¸A²v°v¨a°!©e¨eÀ1€ rI   rq   r   rr   rs   r-   r±   )r²   r€   ru   r¾   Úexpected_line_ending_formatr   )rQ   rÎ   r„   Úexpecteds       rG   rµ   z FormatChecker._check_line_endingÑ  s×   € àÔ!Ð-ð ð F˜{¨dÔ.DÒDÐDØ× Ò Ð!5¸HÐ ÑEÔEÐEà!,ˆÔð ”;Ô%ÔAˆØð 		å Ð!DÐ!DÀkÐSUÑVÔVˆKØ"-°Ò"5Ð"5˜$˜$¸6ˆKØ˜hÒ&Ð&Ø× Ò Ø3Ø% xÐ0Ø!ð !ñ ô ð ð ð ð		ð 		ð 'Ð&rI   r)   únodes.NodeNGc                ó
  — |j         sdS |                     ¦   «         j        sdS |                     ¦   «         }|�|j        }n@t          |j        t          j        ¦  «        rd}n|j         	                    ¦   «         j        }|j        }|s
J |¦   «         ‚||k    r6| j
                             |¦  «        dk    r|                      ||¦  «         dS || j
        v rdS 	 |j        }n# t          $ r
 |j        }Y nw xY w|s
J |¦   «         ‚g }t!          ||dz   ¦  «        D ]d}d| j
        |<   	 |                     | j        |                              ¦   «         ¦  «         Œ@# t(          $ r |                     d¦  «         Y Œaw xY wdS )z8Check the node line number and check it if not yet done.Nr   rC   rB   rq   )Úis_statementÚrootÚpure_pythonÚprevious_siblingÚ
fromlinenoÚ
isinstanceÚparentr   ÚModuleÚ	statementry   r¯   Ú_check_multi_statement_lineÚblockstart_tolinenoÚAttributeErrorÚtolinenor�   r·   rx   ÚrstripÚKeyError)rQ   r†   Ú	prev_siblÚ	prev_liner_   rä   Úliness          rG   Úvisit_defaultzFormatChecker.visit_defaulté  sÑ  € ð Ô ð 	ØˆFØ�yŠy‰{Œ{Ô&ð 	ØˆFØ×)Ò)Ñ+Ô+ˆ	ØÐ Ø!Ô,ˆIˆIÝ˜œ¥U¤\Ñ2Ô2ð 	;ØˆIˆIàœ×-Ò-Ñ/Ô/Ô:ˆIØŒˆØÐÐ�TÑÔÐØ˜ÒÐ Ô!4×!8Ò!8¸Ñ!>Ô!>À!Ò!CÐ!CØ×,Ò,¨T°4Ñ8Ô8Ð8ØˆFØ�4Ô&Ð&Ð&ØˆFð	%ØÔ/ˆHˆHøÝð 	%ð 	%ð 	%Ø”}ˆHˆHˆHð	%øøøàÐÐ˜ÑÔÐØˆÝ˜$ ¨1¡Ñ-Ô-ð 	!ð 	!ˆDØ()ˆDÔ Ñ%ð!Ø—’˜Tœ[¨Ô.×5Ò5Ñ7Ô7Ñ8Ô8Ð8Ð8øÝð !ð !ð !Ø—’˜RÑ Ô Ð Ð Ð ð!øøøð		!ð 	!s$   ÃC& Ã&C:Ã9C:Ä+2EÅF Å?F r_   c                ót  — t          |t          j        ¦  «        rdS t          |j        t          j        ¦  «        r|j        j        s| j        j        j        rdS t          |j        t          j	        ¦  «        r0t          |j        j        ¦  «        dk    r| j        j        j        rdS t          |j        t          j        ¦  «        rNt          |t          j        ¦  «        r4t          |j        t          j        ¦  «        r|j        j        t"          u rdS |                      d|¬¦  «         d| j        |<   dS )z/Check for lines containing multiple statements.NrB   r)   )r†   rC   )rÝ   r   ÚWithrÞ   ÚIfÚorelseru   r¾   Úsingle_line_if_stmtÚClassDefrž   ÚbodyÚsingle_line_class_stmtÚFunctionDefÚExprÚvalueÚConstÚEllipsisr€   ry   )rQ   r†   r_   s      rG   rá   z)FormatChecker._check_multi_statement_line  s'  € õ �d�EœJÑ'Ô'ð 	ØˆFå�t”{¥E¤HÑ-Ô-ð	à”KÔ&ð	ð ”Ô"Ô6ð	ð
 ˆFå�t”{¥E¤NÑ3Ô3ð	å�D”KÔ$Ñ%Ô%¨Ò*Ð*Ø”Ô"Ô9ð +ð ˆFõ �t”{¥EÔ$5Ñ6Ô6ð	å˜4¥¤Ñ,Ô,ð	õ ˜4œ:¥u¤{Ñ3Ô3ð	ð ”
Ô ¥HÐ,Ð,àˆFà×ÒÐ.°TÐÑ:Ô:Ð:Ø$%ˆÔ˜DÑ!Ð!Ð!rI   r›   c                ó¼   — |                      d¦  «        }|t          |¦  «        d…         dvr-|                      d|t          |¦  «        t          ¬¦  «         dS dS )z,Check that there is no trailing white-space.z	
 N)r   r«   r$   )r_   Ú
col_offsetÚ
confidence)rå   rž   r€   r   )rQ   r_   r›   Ústripped_lines       rG   Ú check_trailing_whitespace_endingz.FormatChecker.check_trailing_whitespace_ending*  sv   € ð Ÿš KÑ0Ô0ˆØ•�MÑ"Ô"Ð$Ð$Ô%¨^Ð;Ð;Ø×ÒØ%ØÝ˜}Ñ-Ô-Ýð	 ñ ô ð ð ð ð <Ð;rI   Úchecker_offr@   c                óV  — | j         j        j        }| j         j        j        }|                     ¦   «         }t          |¦  «        |k    r]|                     |¦  «        sJ|r| j                              d|¦  «         dS |                      d|t          |¦  «        |f¬¦  «         dS dS dS )z=Check that the line length is less than the authorized value.r"   r’   N)	ru   r¾   Úmax_line_lengthÚignore_long_linesrå   rž   ÚsearchÚadd_ignored_messager€   )rQ   r_   r›   rý   Ú	max_charsÚignore_long_lines         rG   Úcheck_line_lengthzFormatChecker.check_line_length6  s°   € à”KÔ&Ô6ˆ	Øœ;Ô-Ô?ÐØ�{Š{‰}Œ}ˆÝˆt‰9Œ9�yÒ Ð Ð)9×)@Ò)@ÀÑ)FÔ)FÐ Øð WØ”×/Ò/°ÀÑCÔCÐCÐCÐCà× Ò  °qÅÀDÁ	Ä	È9Ð?UÐ ÑVÔVÐVÐVÐVð	 !Ð Ð Ð rI   Úoptions_pattern_objú
Match[str]c                ó®   — | j         }|d|                      d¦  «        …                              ¦   «         ||                      d¦  «        d…         z   }|S )z-Remove the `# pylint ...` pattern from lines.NrB   )r™   rŠ   rå   Úend)r  ré   Úpurged_liness      rG   Úremove_pylint_option_from_linesz-FormatChecker.remove_pylint_option_from_linesA  sd   € ð $Ô*ˆàÐ0Ð'×-Ò-¨aÑ0Ô0Ð0Ô1×8Ò8Ñ:Ô:ØÐ'×+Ò+¨AÑ.Ô.Ð0Ð0Ô1ñ2ð 	ð ÐrI   Úpylint_pattern_match_objectc                ó¢   — 	 t          |                      d¦  «        ¦  «        D ]}|j        dk    rd|j        v r dS Œn# t          $ r Y nw xY wdS )z2Return True if the line length check is activated.rC   Údisabler"   FT)r   ÚgroupÚactionÚmessagesr   )r  Úpragmas     rG   Úis_line_length_check_activatedz,FormatChecker.is_line_length_check_activatedK  s|   € ð	Ý&Ð'B×'HÒ'HÈÑ'KÔ'KÑLÔLð !ð !�Ø”= IÒ-Ð-°/ÀVÄ_Ð2TÐ2TØ ˜5˜5øð!øõ !ð 	ð 	ð 	àˆDð	øøøð ˆts   ‚9? ½? ¿
AÁAré   ú	list[str]c                óš   — h d£}g }d}|                       d¦  «        D ],}|d         |vr|                     ||z   ¦  «         d}Œ'||z  }Œ-|S )z]Split lines according to universal newlines except those in a specific
        sets.
        >   õ   â€¨õ   â€©õ   Â…úúúúúrq   Trª   )Ú
splitlinesr·   )ré   Úunsplit_endsÚresÚbufferÚatomic_lines        rG   Úspecific_splitlinesz!FormatChecker.specific_splitlinesW  sz   € ð
	
ð 	
ð 	
ˆð ˆØˆØ ×+Ò+¨DÑ1Ô1ð 	&ð 	&ˆKØ˜2Œ lÐ2Ð2Ø—
’
˜6 KÑ/Ñ0Ô0Ð0Ø��à˜+Ñ%��Øˆ
rI   rÌ   c                ó   ‡— | j         j        j        Š|                      |¦  «        }t	          |¦  «        D ]q\  }}|                     d¦  «        s|                      d||z   ¬¦  «         Œ5|                     |¦  «        t          j	        k    r|  
                    |||z   ¦  «         Œrt          ˆfd„|D ¦   «         ¦  «        }|sdS t          j        |¦  «        }	d}
|	r,|                      |	¦  «        sd}
|                      |	¦  «        }t	          |                      |¦  «        ¦  «        D ]\  }}|                      |||z   |
¦  «         Œ dS )z¿Check given lines for potential messages.

        Check if lines have:
        - a final newline
        - no trailing white-space
        - less than a maximum number of characters
        r   r%   r~   c              3  ó>   •K  — | ]}t          |¦  «        ‰k    V — Œd S rN   )rž   )rš   r_   r  s     €rG   rœ   z,FormatChecker.check_lines.<locals>.<genexpr>’  s?   øè è € ð ,
ð ,
Ø&*�C�‰IŒI˜	Ò!ð,
ð ,
ð ,
ð ,
ð ,
ð ,
rI   NFT)ru   r¾   rÿ   r#  r³   r¼   r€   rD   rE   ÚSTRINGrü   Úanyr   r  r  r  r  )rQ   r:   r{   ré   rÌ   Úsplit_linesÚoffsetr_   Úpotential_line_length_warningÚmobjrý   r  s              @rG   rƒ   zFormatChecker.check_linesp  s™  ø€ ð$ ”KÔ&Ô6ˆ	à×.Ò.¨uÑ5Ô5ˆå% kÑ2Ô2ð 	Mð 	M‰LˆF�DØ—=’= Ñ&Ô&ð Ø× Ò Ð!8¸vÈ¹Ð ÑOÔOÐOØð �{Š{˜:Ñ&Ô&­(¬/Ò9Ð9Ø×5Ò5°d¸FÀV¹OÑLÔLÐLøõ ),ð ,
ð ,
ð ,
ð ,
Ø.9ð,
ñ ,
ô ,
ñ )
ô )
Ð%ð -ð 	ØˆFõ Ô Ñ&Ô&ˆØˆØð 	?Ø×6Ò6°tÑ<Ô<ð #Ø"�à×8Ò8¸Ñ>Ô>ˆEõ & d×&>Ò&>¸uÑ&EÔ&EÑFÔFð 	Gð 	G‰LˆF�DØ×"Ò" 4¨°&©¸+ÑFÔFÐFÐFð	Gð 	GrI   r™   rÕ   c                ó¤  — | j         j        j        }|dk    rd}d}t          |¦  «        }|d|…         |k    r||d…         }|dz  }|d|…         |k    °d}|r+|d         dv r!||d         z  }|dd…         }|r
|d         dv °!||k    s|rCd}|d         dk    rd	}|                      d
|||z  t          |¦  «        z   |||z  f¬¦  «         dS dS )z&Return the indent level of the string.z\tú	r   NrB   rq   z 	ÚspacesÚtabsr'   r’   )ru   r¾   Úindent_stringrž   r€   )	rQ   r™   rÕ   r„   ÚindentÚlevelÚ	unit_sizeÚsupplÚi_types	            rG   r¶   z FormatChecker.check_indent_level¨  s=  € à”Ô#Ô1ˆØ�UŠ?ˆ?ØˆFØˆÝ˜‘K”Kˆ	Ø�Z�i�ZÔ  FÒ*Ð*Ø˜I˜J˜JÔ'ˆFØ�Q‰JˆEð �Z�i�ZÔ  FÒ*Ð*ð ˆØð 	 ˜ œ eÐ+Ð+Ø�V˜A”YÑˆEØ˜A˜B˜B”ZˆFð ð 	 ˜ œ eÐ+Ð+ð �HÒÐ ÐØˆFØ�aŒy˜DÒ Ð Ø�Ø×ÒØ!ØØ˜iÑ'­#¨e©*¬*Ñ4°f¸hÈÑ>RÐSð ñ ô ð ð ð ð	 ÐrI   ©ru   r   r   rL   )r:   r;   r<   r=   r{   r=   r   rL   )r†   r‡   r   rL   )r:   rK   rŠ   r=   r   rL   r`   )rÎ   r?   r„   r=   r   rL   )r†   rÖ   r   rL   )r†   rÖ   r_   r=   r   rL   )r_   r?   r›   r=   r   rL   )r_   r?   r›   r=   rý   r@   r   rL   )r  r  r   r?   )r  r  r   r@   )ré   r?   r   r  )
r:   r;   r{   r=   ré   r?   rÌ   r=   r   rL   )r™   r?   rÕ   r=   r„   r=   r   rL   )ra   rb   rc   rd   r°   r9   ÚmsgsÚoptionsrR   r…   r‰   r¢   rÍ   rµ   r   rê   rá   rü   r  Ústaticmethodr  r  r#  rƒ   r¶   Ú__classcell__)rz   s   @rG   rg   rg   •   sÞ  ø€ € € € € ðð ð €Dà€Dð
 àØØ"ØHð	ð ð	
ð  à Ø%Ø8àTðð ð
	
ð "à ØØ%ð<ðð ð	
ð %à ØØ%ð(ð	ð 	ð	
ð àØØ"Ø>ð	ð ð	
ð à!Ø*Ø%ð6ð	ð ð		
ð !àØ"Øð%ð	ð ð		
ð *à Ø2ØØ-Ð-Ð-ð@ð	ð 	ð	
ðWX€Gðt;ð ;ð ;ð ;ð ;ð ;ð
	=ð 	=ð 	=ð 	=ðð ð ð ðeð eð eð eðNVAð VAð VAð VAðpð ð ð ð0  ÐÐ 5Ñ6Ô6ð!ð !ð !ñ 7Ô6ð!ðB&ð &ð &ð &ð>
ð 
ð 
ð 
ð	Wð 	Wð 	Wð 	Wð ðð ð ñ „\ðð ð	ð 	ð 	ñ „\ð	ð ðð ð ñ „\ðð06Gð 6Gð 6Gð 6Gðpð ð ð ð ð ð ð rI   rg   ru   r   rL   c                óJ   — |                       t          | ¦  «        ¦  «         d S rN   )Úregister_checkerrg   )ru   s    rG   Úregisterr=  Á  s$   € Ø
×Ò�M¨&Ñ1Ô1Ñ2Ô2Ð2Ð2Ð2rI   )r:   r;   r<   r=   r>   r?   r   r@   r6  ))rd   Ú
__future__r   rE   Ú	functoolsr   Úrer   Útypingr   r   Úastroidr   Úpylint.checkersr	   r
   Úpylint.checkers.utilsr   Úpylint.constantsr   Úpylint.interfacesr   Úpylint.typingr   Úpylint.utils.pragma_parserr   r   r   Úpylint.lintr   r½   rF   rŸ   r�   ÚNODEr9   Ú__annotations__rH   r;   rg   r=  re   rI   rG   ú<module>rL     s9  ðð
ð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )à Ð Ð Ð Ð Ð à @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø <Ð <Ð <Ð <Ð <Ð <Ø )Ð )Ð )Ð )Ð )Ð )Ø "Ð "Ð "Ð "Ð "Ð "Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ Qàð %Ø$Ð$Ð$Ð$Ð$Ð$ðð ð €ð" Ô  (¤+Ð.€ðð
ð
ð
ð
ð
ðð 	3ØØFØ	�,Ô#Ð$ð	ððð
ðo<+ð <+€ð <ð <ð <ñ <ð~ð ð ð ð$ð $ð $ð $ð $ñ $ô $ð $ð,ið ið ið ið iÐ$Ð&8ñ iô ið iðX3ð 3ð 3ð 3ð 3ð 3rI   