ó
    Ð]j¨…  ã                   óÆ  • S r SSKrSSKrSSKJr  SSKrSSKJr  SSKJ	r	  SSK
Jr  SSKJrJr  SSKJr  \R"                  " \5      rS	rS
r\R,                  r\R.                  r\R0                  r\R2                  r\R4                  rS rS rS rS rS rS r S r!S r"S r#S r$S#S jr%S r&S r'S r(S r) " S S\*5      r+S r, " S S5      r- " S S 5      r. " S! S"5      r/g)$aa  
The diff parser is trying to be a faster version of the normal parser by trying
to reuse the nodes of a previous pass over the same file. This is also called
incremental parsing in parser literature. The difference is mostly that with
incremental parsing you get a range that needs to be reparsed. Here we
calculate that range ourselves by using difflib. After that it's essentially
incremental parsing.

The biggest issue of this approach is that we reuse nodes in a mutable way. The
intial design and idea is quite problematic for this parser, but it is also
pretty fast. Measurements showed that just copying nodes in Python is simply
quite a bit slower (especially for big files >3 kLOC). Therefore we did not
want to get rid of the mutable nodes, since this is usually not an issue.

This is by far the hardest software I ever wrote, exactly because the initial
design is crappy. When you have to account for a lot of mutable state, it
creates a ton of issues that you would otherwise not have. This file took
probably 3-6 months to write, which is insane for a parser.

There is a fuzzer in that helps test this whole thing. Please use it if you
make changes here. If you run the fuzzer like::

    test/fuzz_diff_parser.py random -n 100000

you can be pretty sure that everything is still fine. I sometimes run the
fuzzer up to 24h to make sure everything is still ok.
é    N)Ú
namedtuple)Úsplit_lines)ÚParser)Ú	EndMarker)ÚPythonTokenÚBOM_UTF8_STRING)ÚPythonTokenTypesF)ÚINDENTÚERROR_DEDENTÚDEDENTc                 óT   • U R                   S:H  =(       a    U R                  [        ;   $ )NÚ
error_leaf)ÚtypeÚ
token_typeÚ_INDENTATION_TOKENS©Únodes    ÚN/home/mande/repo/quber/.venv/lib/python3.13/site-packages/parso/python/diff.pyÚ_is_indentation_error_leafr   3   s    € Ø�9‰9˜Ñ$×O¨¯©Ô<OÑ)OÐOó    c                 ó†   • U (       a9  [        U 5      (       a)  U R                  5       n U (       a  [        U 5      (       a  M)  U $ ©N)r   Úget_previous_leaf©Úleafs    r   Ú!_get_previous_leaf_if_indentationr   7   s3   € Þ
Ô-¨d×3Ñ3Ø×%Ñ%Ó'ˆö Ô-¨d×3Ó3à€Kr   c                 ó†   • U (       a9  [        U 5      (       a)  U R                  5       n U (       a  [        U 5      (       a  M)  U $ r   )r   Úget_next_leafr   s    r   Ú_get_next_leaf_if_indentationr   =   s3   € Þ
Ô-¨d×3Ñ3Ø×!Ñ!Ó#ˆö Ô-¨d×3Ó3à€Kr   c                 ó2   • [        U R                  S   5      $ ©Né   )Ú_get_indentationÚchildren©Ú	tree_nodes    r   Ú_get_suite_indentationr'   C   s   € Ü˜I×.Ñ.¨qÑ1Ó2Ð2r   c                 ó    • U R                   S   $ r!   )Ú	start_posr%   s    r   r#   r#   G   s   € Ø×Ñ˜qÑ!Ð!r   c                 ót  •  U R                   nU H&  nUR                  U :X  d   X45       e[        U5        M(     g! [         Gaq    U R                  S:X  a<  U R
                  [        ;   a(  U R                  (       a   eU R                  (       a   e g[        U R                  5       5      nUc  U R                  nSnOGUR                  U R                  ::  d   X045       eUR                  U R                  -   nUR                  nSU;   d  SU;   a0  [        U5      nUS   [        U5      -   S-
  nU[        US   5      4nOQUS   US   [        U5      -   4nUR                  [         5      (       a!  U R#                  5       S:X  a  US   US   S-
  4nU R                  U:X  d   U R                  U45       e gf = f)	zr
Checks if the parent/children relationship is correct.

This is a check that only runs during debugging/testing.
r   N)r"   r   Ú
Úr   r"   éÿÿÿÿ)r$   ÚparentÚ_assert_valid_graphÚAttributeErrorr   r   r   ÚvalueÚprefixr   r   Úend_posr)   r   ÚlenÚ
startswithr   Úget_start_pos_of_prefix)	r   r$   ÚchildÚprevious_leafÚcontentÚprevious_start_posÚsplittedÚlineÚactuals	            r   r/   r/   K   s°  € ð%'Ø—=‘=ˆóD ˆEØ—<‘< 4Ó'Ð6¨$¨Ó6Ð'Ü Ö&ò øôC ô Bð �9‰9˜Ó$¨¯©Ô<OÓ)OØ—z—zÐ!�>Ø—{—{Ð"�?Ùô :¸$×:PÑ:PÓ:RÓSˆØÑ Ø—k‘kˆGØ!%Ñà ×(Ñ(¨D¯N©NÓ:ð &ØÐ%ó&Ð:ð $×)Ñ)¨D¯K©KÑ7ˆGØ!.×!8Ñ!8Ðà�7‹?˜d g›oÜ" 7Ó+ˆHØ% aÑ(¬3¨x«=Ñ8¸1Ñ<ˆDØœ3˜x¨™|Ó,Ð,‰Fà'¨Ñ*Ð,>¸qÑ,AÄCÈÃLÑ,PÐPˆFØ×!Ñ!¤/×2Ñ2Ø×4Ñ4Ó6¸&Ó@à ™ F¨1¡I°¡MÐ1�à�~‰~ Ó'ÐA¨$¯.©.¸&Ð)AÓAÒ'ð?Bús   ‚; »AF7ÂD"F7Æ6F7c                 óx  •  U R                   n UR                   n[        X#5       H  u  pE[        XE5        M     [        U5      [        U5      :X  d"   S[        U5      -   S-   [        U5      -   5       eg ! [         a	     X45       ef = f! [         a¤    [        US5      (       a   X45       eU R                  UR                  :X  d   X45       eU R                  UR                  :X  d   X45       eU R
                  UR
                  :X  d   X45       eU R                  UR                  :X  d   X45       e g f = f)Nr$   r+   )r$   r0   Úhasattrr1   r   r2   r)   ÚzipÚ_assert_nodes_are_equalr4   Úrepr)Únode1Únode2Ú	children1Ú	children2Ún1Ún2s         r   rA   rA   y   s*  € ð)Ø—N‘Nˆ	ð	)ØŸ™ˆIô �iÖ+‰ˆÜ Ö'ñ ,äˆy‹>œS ›^Ó+Ð\¨T´D¸³OÑ-CÀdÑ-JÌTÐR[Ë_Ñ-\Ó\Ñ+øô	 ó 	)Ø(˜5˜.Ó(�5ð	)ûô ó Ü˜5 *×-Ñ-Ð=°¨~Ó=Ð-Ø�{‰{˜eŸk™kÓ)Ð9¨E¨>Ó9Ð)Ø�z‰z˜UŸZ™ZÓ'Ð7¨%¨Ó7Ð'Ø�|‰|˜uŸ|™|Ó+Ð;¨e¨^Ó;Ð+Ø�‰ %§/¡/Ó1ÐA°E°>ÓAÐ1Ùðús   ‚B �A5 Á5BÂB+D9Ä8D9c                 óþ   • [        U R                  5       SS9n[        R                  " X#5      n[        R                  " X5      nSS KnSUR
                  < SSR                  U5      < SSR                  U5      < 3$ )NT©Úkeependsr   z=There's an issue with the diff parser. Please report (parso vz) - Old/New:
Ú z
Actual Diff (May be empty):
)r   Úget_codeÚdifflibÚunified_diffÚparsoÚ__version__Újoin)ÚmoduleÚ	old_linesÚ	new_linesÚcurrent_linesÚcurrent_diffÚold_new_diffrP   s          r   Ú_get_debug_error_messagerY   �   sd   € Ü §¡Ó 1¸DÑA€MÜ×'Ò'¨	ÓA€LÜ×'Ò'¨	Ó=€LÜð ×Ô˜bŸg™g lÖ3°R·W±W¸\Õ5Jð	Lðr   c                 ó  • U R                  5       n[        U5      (       a  UR                  S   $ UR                  5       nUR                  S:X  a"  SUR
                  ;   a  UR                  S   S-   $ UR                  S   $ )Nr   Ú	endmarkerr+   r"   )Úget_last_leafÚ_ends_with_newliner)   r   r   r2   r3   )Únode_or_leafÚ	last_leafÚns      r   Ú_get_last_linera   ™   sz   € Ø×*Ñ*Ó,€IÜ˜)×$Ñ$Ø×"Ñ" 1Ñ%Ð%à×#Ñ#Ó%ˆØ�6‰6�[Ó  T¨Q¯X©XÓ%5ð ×$Ñ$ QÑ'¨!Ñ+Ð+Ø× Ñ  Ñ#Ð#r   c                 ó¶   • U bU  U R                   S:X  aE  U R                  S:X  a5  U R                  5       n U b"  U R                   S:X  a  U R                  S:X  a  M5  U $ )Nr   r   )r   r   r   r   s    r   Ú_skip_dedent_error_leavesrc   ª   sQ   € Ø
Ñ
˜tŸy™y¨LÓ8¸T¿_¹_ÐPXÓ=XØ×%Ñ%Ó'ˆð Ñ
˜tŸy™y¨LÓ8¸T¿_¹_ÐPXÕ=Xà€Kr   c                 óð   • [        U 5      n U R                  S:X  a  U R                  R                  5       nOU R                  nUS:H  =(       d)    UR	                  S5      =(       d    UR	                  S5      $ )Nr   Únewliner+   r,   )rc   r   r   ÚlowerÚendswith)r   ÚsuffixÚtyps      r   r]   r]   °   sZ   € Ü$ TÓ*€Dà‡y�y�LÓ Ø�o‰o×#Ñ#Ó%‰à�i‰iˆà�)Ñ×M˜vŸ™¨tÓ4×M¸¿¹ÈÓ8MÐMr   c                 ó:   • U H  nUR                   S;   d  M    g   g)z[
if, while, for and try might not be finished, because another part might
still be parsed.
)Úif_stmtÚ
while_stmtÚfor_stmtÚtry_stmtFT)Únonterminal©Úpgen_grammarÚstackÚ
stack_nodes      r   Ú_flows_finishedrt   »   s%   € ó
 ˆ
Ø×!Ñ!Ð%VÕVÙñ ð r   c                 óâ   • U R                   S:X  a  U R                  S   n U R                   S;   a  U R                  S   n U R                   S;   =(       a    U R                  S   R                   S:H  $ )NÚ	decoratedr-   ©Úasync_funcdefÚ
async_stmt©ÚclassdefÚfuncdefÚsuite)r   r$   r   s    r   Ú_func_or_class_has_suiter~   Æ   s`   € Ø‡y�y�KÓØ�}‰}˜RÑ ˆØ‡y�yÐ3Ó3Ø�}‰}˜RÑ ˆØ�9‰9Ð/Ñ/×U°D·M±MÀ"Ñ4E×4JÑ4JÈgÑ4UÐUr   c                 óÂ   • [        X5      (       d  g[        U5       H?  nUR                  S:X  a    gUR                  S:X  d  M'  [        UR                  5      S:„  s  $    g)NFÚ	decoratorr}   r"   T)rt   Úreversedro   r4   Únodesrp   s      r   Ú_suite_or_file_input_is_validrƒ   Î   sX   € Ü˜<×/Ñ/Øä˜u–oˆ
Ø×!Ñ! [Ó0áà×!Ñ! WÕ,ä�z×'Ñ'Ó(¨1Ñ,Ò,ñ &ð r   c                 óž   • U R                   S:X  a  U R                  S   n  U R                  S   R                  nUS;   $ ! [         a     gf = f)Nry   r"   r   F)ÚifÚforÚwhileÚtryÚwith)r   r$   r1   r0   )r   r1   s     r   Ú_is_flow_noderŠ   ß   sW   € Ø‡y�y�LÓ Ø�}‰}˜QÑˆðØ—‘˜aÑ ×&Ñ&ˆð Ð9Ñ9Ð9øô ó Ùðús   ¡? ¿
AÁAc                   ó   • \ rS rSrSrg)Ú_PositionUpdatingFinishedéé   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__rŽ   r   r   rŒ   rŒ   é   s   † Úr   rŒ   c                 ó¨   • U  H  n UR                   n[        XAU5        M     g ! [         a#    U=R                  U-  sl        X2L a  [        e MM  f = fr   )r$   Ú_update_positionsr0   r<   rŒ   )r‚   Úline_offsetr_   r   r$   s        r   r•   r•   í   sW   € Ûˆð	@Ø—}‘}ˆHô ˜h°YÖ?ò øô ó 	0à�IŠI˜Ñ$�IØÒ Ü/Ð/ò !ð	0ús   ‡$¤)AÁAc                   óR   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rSS jrSrg)Ú
DiffParseréú   zu
An advanced form of parsing a file faster. Unfortunately comes with huge
side effects. It changes the given module.
c                 ó(   • Xl         X l        X0l        g r   )Ú_pgen_grammarÚ
_tokenizerÚ_module)Úselfrq   Ú	tokenizerrS   s       r   Ú__init__ÚDiffParser.__init__ÿ   s   € Ø)ÔØ#ŒØ�r   c                 óT   • SU l         SU l        [        U R                  5      U l        g ©Nr   )Ú_copy_countÚ_parser_countÚ
_NodesTreer�   Ú_nodes_tree©rž   s    r   Ú_resetÚDiffParser._reset  s#   € ØˆÔØˆÔä% d§l¡lÓ3ˆÕr   c           	      ó   • [         R                  S5        SU R                  l        X l        U R                  5         [        U5      n[        R                  " SXR                  5      nUR                  5       n[         R                  S[        U5      < SU< 35        U H�  u  pgp‰n
[         R                  SXgS-   X‰S-   U
5        X£:X  a  US   S:X  a  U
S-  n
US	:X  a  X—-
  nU R                  X·S-   XŠ5        MY  US
:X  a  U R                  U
S9  Mp  US:X  a  U R                  U
S9  M‡  US:X  a  M�   e   U R                  R                  5         [        (       a�   SR                  U5      nU R                  R!                  5       U:X  d   e[#        U R                  5        [%        U R&                  SS9R)                  U R+                  U5      5      n[-        U R                  U5        U R                  R4                  S   nXã:w  a+  [7        SU< SU< S3[3        U R                  X5      -   5      e[         R                  S5        U R                  $ ! [.         a!    [1        [3        U R                  X5      5        e f = f)a‘  
The algorithm works as follows:

Equal:
    - Assure that the start is a newline, otherwise parse until we get
      one.
    - Copy from parsed_until_line + 1 to max(i2 + 1)
    - Make sure that the indentation is correct (e.g. add DEDENT)
    - Add old and change positions
Insert:
    - Parse from parsed_until_line + 1 to min(j2 + 1), hopefully not
      much more.

Returns the new module node.
zdiff parser startNzline_lengths old: z; new: z!-> code[%s] old[%s:%s] new[%s:%s]r"   r-   rL   ÚequalÚreplace)Ú
until_lineÚinsertÚdeleteT©Úerror_recoveryr   Ú(z != z) zdiff parser end)ÚLOGÚdebugr�   Ú_used_namesÚ_parser_lines_newr©   r4   rN   ÚSequenceMatcherÚget_opcodesÚ_copy_from_old_parserÚ_parser§   ÚcloseÚDEBUG_DIFF_PARSERrR   rM   r/   r   r›   Úparserœ   rA   ÚAssertionErrorÚprintrY   r3   Ú	Exception)rž   rT   rU   Úline_lengthÚsmÚopcodesÚ	operationÚi1Úi2Új1Új2r–   ÚcodeÚwithout_diff_parser_moduleÚlast_poss                  r   ÚupdateÚDiffParser.update
  s/  € ô  	�	‰	Ð%Ô&à#'ˆ�‰Ô à!*Ôà�‰Œä˜)“nˆÜ×$Ò$ T¨9×6LÑ6LÓMˆØ—.‘.Ó"ˆÜ�	Š	´S¸¶^Â[ÐQÔRã)0Ñ%ˆI˜2 2Ü�I‰IÐ9Ø a¡¨°!©V°Rô9ð Ó  Y¨r¡]°bÓ%8à�a‘�à˜GÓ#Ø ™g�Ø×*Ñ*¨;¸Q¹ÀÖGØ˜iÓ'Ø—‘ r�Ó*Ø˜hÓ&Ø—‘ r�Ó*à  HÕ,Ð,Ð,ñ! *1ð( 	×Ñ×ÑÔ çÒðØ—w‘w˜yÓ)�Ø—|‘|×,Ñ,Ó.°$Ó6Ð6Ð6Ü# D§L¡LÔ1Ü-3Ø×&Ñ&Ø#'ñ.÷ ‘%˜Ÿ™¨	Ó2Ó3ð +ô (¨¯©Ð6PÔQð
 —<‘<×'Ñ'¨Ñ*ˆØÓ"ÝÛ"*«KÐ8Ü*¨4¯<©<¸ÓNñOóð ô 	�	‰	Ð#Ô$Ø�|‰|Ðøô "ó ÜÔ.¨t¯|©|¸YÓRÔSØðús   ÅBI É+I=c                 óÊ   • U R                   R                  5       SR                  U5      :w  a6  [        R	                  SSR                  U5      SR                  U5      5        g g )NrL   zparser issue:
%s
%s)r�   rM   rR   r´   Úwarning)rž   rT   Ú	lines_news      r   Ú_enabled_debuggingÚDiffParser._enabled_debuggingV  sH   € Ø�<‰<× Ñ Ó" b§g¡g¨iÓ&8Ó8Ü�K‰KÐ/°·±¸Ó1CÀRÇWÁWÈYÓEWÕXð 9r   c                 óþ  • SnX@R                   R                  :”  Gaá  U R                   R                  U-
  nU R                  US-   5      nUc*  U R                  U R                   R                  S-   5        GO4UR                  R
                  nUR                  U5      n	US:X  a8  US   R                  5       R                  R                  [        5      (       a  / n
O8U R                   R                  S-   nU R                   R                  X‰S  UU5      n
U
(       ah  U =R                  S-  sl        U R                   R                  n[        R                  SU
S   R                  S   U
S   R                   S   S-
  WU5        O(U R                  U R                   R                  S-   5        XPR                   R                  :w  d   U5       eU R                   R                  nX@R                   R                  :”  a  GMà  g g )Nr-   r"   r   zcopy old[%s:%s] new[%s:%s])r§   Úparsed_until_lineÚ_get_old_line_stmtr»   r.   r$   ÚindexÚget_first_leafr2   r5   r   Ú
copy_nodesr¤   r´   rµ   r)   r3   )rž   r–   Ústart_line_oldÚuntil_line_oldÚuntil_line_newÚlast_until_lineÚparsed_until_line_oldÚ	line_stmtÚ
p_childrenr×   Úcopied_nodesÚfrom_Útos                r   rº   Ú DiffParser._copy_from_old_parserZ  sÅ  € ØˆØ×/Ñ/×AÑAÔAØ$(×$4Ñ$4×$FÑ$FÈÑ$TÐ!Ø×/Ñ/Ð0EÈÑ0IÓJˆIØÑ ð —‘˜D×,Ñ,×>Ñ>ÀÑBÖCà&×-Ñ-×6Ñ6�
Ø"×(Ñ(¨Ó3�à! QÓ&Ø& q™M×8Ñ8Ó:×AÑA×LÑLÌ_×]Ñ]ð $&‘Là ×,Ñ,×>Ñ>ÀÑB�EØ#'×#3Ñ#3×#>Ñ#>Ø" 6Ð*Ø&Ø#ó$�Lö  Ø×$Ò$¨Ñ)Õ$à×)Ñ)×;Ñ;�Bä—I‘IÐ:Ø*¨1™o×7Ñ7¸Ñ:Ø*¨2Ñ.×6Ñ6°qÑ9¸AÑ=¸uÀbõJð —K‘K × 0Ñ 0× BÑ BÀQÑ FÔGð #×&6Ñ&6×&HÑ&HÓHÐYÈ/ÓYÐHØ"×.Ñ.×@Ñ@ˆOðQ ×/Ñ/×AÑA×AÐAr   c                 ó\  • U R                   R                  US4SS9n[        U5      (       a  UR                  5       nUR	                  5       S   U:X  aY  UnUR
                  R                  S;  a(  UR
                  nUR
                  R                  S;  a  M(  UR                  S   U:¼  a  U$ g )Nr   T)Úinclude_prefixes)Ú
file_inputr}   )r�   Úget_leaf_for_positionr]   r   r6   r.   r   r)   )rž   Úold_liner   r   s       r   rÖ   ÚDiffParser._get_old_line_stmt†  s    € Ø�|‰|×1Ñ1°8¸Q°-ÐRVÐ1ÐWˆä˜d×#Ñ#Ø×%Ñ%Ó'ˆDØ×'Ñ'Ó)¨!Ñ,°Ó8ØˆDØ—+‘+×"Ñ"Ð*AÓAØ—{‘{�ð —+‘+×"Ñ"Ð*AÕAð
 �~‰~˜aÑ  HÓ,Ø�àr   c                 óf  • SnXR                   R                  :”  Ga  U R                  U5      nUR                  nU R                   R	                  X@R
                  5        U R                  b#  U R                  U R                   R                  S'   [        R                  SUS   R                  5       S   U R                   R                  UR                  S   S-
  5        X R                   R                  :w  d   U5       eU R                   R                  nXR                   R                  :”  a  GM  gg)za
Parses at least until the given line, but might just parse more until a
valid state is reached.
r   Nr-   z/parse_part from %s to %s (to %s in part parser)r"   )r§   rÕ   Ú_try_parse_partr$   Úadd_parsed_nodesÚ_keyword_token_indentsÚ_replace_tos_indentÚindentsr´   rµ   r6   r3   )rž   r®   rÝ   r   r‚   s        r   r»   ÚDiffParser._parse—  s   € ð
 ˆØ×+Ñ+×=Ñ=Ô=Ø×'Ñ'¨
Ó3ˆDØ—M‘MˆEà×Ñ×-Ñ-¨e×5PÑ5PÔQØ×'Ñ'Ñ3Ø/3×/GÑ/G�× Ñ ×(Ñ(¨Ñ,ä�I‰IØAØ�a‘×0Ñ0Ó2°1Ñ5Ø× Ñ ×2Ñ2Ø—‘˜Q‘ !Ñ#ô	ð #×&6Ñ&6×&HÑ&HÓHÐYÈ/ÓYÐHØ"×.Ñ.×@Ñ@ˆOð% ×+Ñ+×=Ñ=×=Ð=r   c                 óü   • U =R                   S-  sl         U R                  R                  nU R                  US nU R	                  UUUS9n[        U R                  SS9U l        U R                  R                  US9$ )z’
Sets up a normal parser that uses a spezialized tokenizer to only parse
until a certain position (or a bit longer if the statement hasn't
ended.
r"   N)r–   Tr±   )Útokens)	r¥   r§   rÕ   r·   Ú_diff_tokenizer   r›   Ú_active_parserr¾   )rž   r®   rÕ   Úlines_afterró   s        r   rì   ÚDiffParser._try_parse_part±  s’   € ð 	×Ò˜aÑÕð !×,Ñ,×>Ñ>ÐØ×,Ñ,Ð->Ð-?Ð@ˆØ×$Ñ$ØØØ)ð %ð 
ˆô
 %Ø×ÑØñ
ˆÔð ×"Ñ"×(Ñ(°Ð(Ð7Ð7r   c              #   óø  #   • SnU R                   R                  n[        U5      nU R                  UUS-   S4UUS:H  S9nU R                  R
                  nS U l        0 U l        U GHŽ  n	U	R                  n
U
[        :X  aÁ  [        U5      U:  a±   [        U5      =u  p«pÍn	U
[        [        4;   a  U
[        :X  a  US   S-   U l         OOM<  SU;   d  SU;   a  [        R                  " SS	U5      nO9US   [        U5      :¼  d   [        U5      5       eUS   [        U5      -
  S:X  a  S	n[        [         S	UU5      v •    g OsU
["        :X  a  U	R$                  S   U:¼  a  SnOSU(       aL  Sn[        U5      U:X  a;  ['        U R(                  U5      (       a   [        [         S	U	R$                  S	5      v •    g U
[*        :X  a2  U	R,                  S
;   a"  [/        U5      U R                  U	R$                  '   U	v •  GM‘     g 7f)NFr"   r   )r)   rð   Úis_first_tokenTr+   r,   z
[^\n\r]+\ZrL   )ÚclassÚdef)r§   rð   r4   rœ   rõ   rr   rï   rî   r   r   Únextr   ÚreÚsubrB   r   Ú	ENDMARKERÚNEWLINEr)   rƒ   r›   ÚNAMEÚstringÚlist)rž   Úlinesr®   r–   Úwas_newlinerð   Úinitial_indentation_countró   rr   Útokenri   r  r)   r2   s                 r   rô   ÚDiffParser._diff_tokenizeÇ  sô  é € ØˆØ×"Ñ"×*Ñ*ˆÜ$'¨£LÐ!à—‘ØØ" Q‘¨Ð*ØØ&¨!Ñ+ð	 !ð 
ˆð ×#Ñ#×)Ñ)ˆØ#'ˆÔ Ø&(ˆÔ#äˆEà—*‘*ˆCØ”f‹}Ü�w“<Ð";Ó;ð ÜAEÀfÃÐMÑ6˜ Y¸Ø¤6¬<Ð"8Ó8Ø"¤lÓ2ð <EÀQ¹<È!Ñ;K Ô 8Ø $øà!ñ ð ˜v“~¨°«Ü!#§¢¨°r¸6Ó!B™à(¨™|¬s°6«{Ó:ÐH¼DÀ»LÓHÐ:Ø$ Q™<¬#¨f«+Ñ5¸Ó:Ø%'˜FÜ%Ü! 2Ø!Øóò ñ
 ð5 <ð6 œ“ E§O¡O°AÑ$6¸*Ó$DØ"‘ÞØ#�Ü�w“<Ð#<Ó<ä4°T×5GÑ5GÈ×OÑOÜ)¬)°R¸¿¹È"ÓMÒMÙà”d‹{˜uŸ|™|Ð/?Ó?Ü?CÀG»}�×+Ñ+¨E¯O©OÑ<à�KòY ùs   ‚G8G:)
rõ   r¤   rî   r�   r§   r¥   r·   r›   rï   rœ   N)r   )r�   r�   r‘   r’   Ú__doc__r    r©   rÍ   rÒ   rº   rÖ   r»   rì   rô   r“   rŽ   r   r   r˜   r˜   ú   s:   † ñòò
4òJòXYò*AòXò"Aò48÷,;r   r˜   c                   óV   • \ rS rSr\" SS5      rSS jrS rS r  SS jr	S	 r
S
 rSrg)Ú_NodesTreeNodei  Ú_ChildrenGroupz1prefix children line_offset last_line_offset_leafNc                 óD   • Xl         / U l        X l        / U l        X0l        g r   )r&   Ú_children_groupsr.   Ú_node_childrenÚindentation)rž   r&   r.   r  s       r   r    Ú_NodesTreeNode.__init__
  s"   € Ø"ŒØ "ˆÔØŒØ ˆÔØ&Õr   c                 óz  • / nU R                    HL  u  p#pE[        US   R                  5       5      nX&R                  -   Ul        US:w  a   [	        X4U5        X-  nMN     XR                  l        U H  nU R                  Ul        M     U R                   H  nUR                  5         M     g ! [
         a     Nbf = fr£   )r  r   rØ   r2   r•   rŒ   r&   r$   r.   r  Úfinish)	rž   r$   r2   Úchildren_partr–   Úlast_line_offset_leafÚ
first_leafr   Ú
node_childs	            r   r  Ú_NodesTreeNode.finish  sÅ   € ØˆØIM×I^ÔI^ÑEˆF ;Ü6Ø˜aÑ ×/Ñ/Ó1óˆJð !'×):Ñ):Ñ :ˆJÔØ˜aÓðÜ%Ø%Ð4IôKð Ñ%ŠHñ J_ð #+�‰ÔãˆDØŸ.™.ˆDŽKñ ð ×-Ô-ˆJØ×ÑÖò .øô 1ó Ùðús   ÁB-Â-
B:Â9B:c                 ó:   • U R                   R                  U5        g r   )r  Úappend)rž   Ú
child_nodes     r   Úadd_child_nodeÚ_NodesTreeNode.add_child_node(  s   € Ø×Ñ×"Ñ" :Õ.r   c                 óŠ   • Uc  US   R                  5       nU R                  XX45      nU R                  R                  U5        g ©Nr-   )r\   r  r  r  )rž   r2   r$   r–   r  Úgroups         r   Úadd_tree_nodesÚ_NodesTreeNode.add_tree_nodes+  sF   € à Ñ(Ø$,¨R¡L×$>Ñ$>Ó$@Ð!Ø×#Ñ#Ø˜kó
ˆð 	×Ñ×$Ñ$ UÕ+r   c                 óê  • SnU R                   (       aU  U R                   S   n[        UR                  5      nUR                  S   UR                  -   n[        XA5      (       a  US-  nU[        [        U5      5      S-
  -  nU(       a1  UR                  S5      (       d  UR                  S5      (       d  US-  nU R                  (       a'  [        X R                  S   R                  U5      5      $ U$ )Nr   r-   r"   r+   r,   )r  r   r  r3   r–   r]   r4   r   rg   r  ÚmaxÚget_last_line)rž   rh   r<   Úchildren_groupr_   s        r   r%  Ú_NodesTreeNode.get_last_line4  sÖ   € ØˆØ× × Ø!×2Ñ2°2Ñ6ˆNÜ9Ø×4Ñ4óˆIð ×$Ñ$ QÑ'¨.×*DÑ*DÑDˆDô " )×4Ñ4Ø˜‘	�Ø””K Ó'Ó(¨1Ñ,Ñ,ˆæ˜&Ÿ/™/¨$×/Ñ/¸¿¹È×8MÑ8Mà�A‰IˆDà××Ü�t×0Ñ0°Ñ4×BÑBÀ6ÓJÓKÐKØˆr   c                 óT   • SU R                   R                  < SU R                  < S3$ )NÚ<z: Ú>)Ú	__class__r�   r&   r¨   s    r   Ú__repr__Ú_NodesTreeNode.__repr__L  s   � Ø!Ÿ^™^×4Ô4°d·n´nÐEÐEr   )r  r  r  r.   r&   r£   )r   N)r�   r�   r‘   r’   r   r  r    r  r  r!  r%  r,  r“   rŽ   r   r   r  r    s9   † ÙØØ;ó=€Nô'ò ò./ð <=Ø-1ô,òõ0Fr   r  c                   ó`   • \ rS rSrS r\S 5       rS rS rS r	S r
S rS	 r SS
 jrS rSrg)r¦   iP  c                 ó€   • [        U5      U l        U R                  /U l        Xl        SU l        SU l        S/U l        g )NrL   r   )r  Ú
_base_nodeÚ_working_stackr�   Ú_prefix_remainderr2   rð   )rž   rS   s     r   r    Ú_NodesTree.__init__Q  s:   € Ü(¨Ó0ˆŒØ#Ÿ™Ð/ˆÔØŒØ!#ˆÔØˆŒØ�sˆ�r   c                 óR   • U R                   S   R                  U R                  5      $ r  )r1  r%  r2   r¨   s    r   rÕ   Ú_NodesTree.parsed_until_lineY  s"   € à×"Ñ" 2Ñ&×4Ñ4°T·[±[ÓAÐAr   c                 óÌ   • [        [        U R                  5      5       HB  nUR                  U:  d  X R                  S   L a  Us  $ U R                  R	                  5         MD     g r£   )r�   r  r1  r  Úpop)rž   r  r   s      r   Ú_update_insertion_nodeÚ!_NodesTree._update_insertion_node]  sQ   € ÜœT $×"5Ñ"5Ó6Ö7ˆDØ×Ñ +Ó-°×9LÑ9LÈQÑ9OÒ1OØ’Ø×Ñ×#Ñ#Ö%ò 8r   c                 ód  • U R                   nU R                  U5      nU(       d  X0R                   -   U l         g US   R                  S:w  d   eU R                  US   R                  S   5      nUR
                  R                  S;   d   eUR                  X15        U R                  US   U5        g )Nr   re   r"   )r}   rç   r-   )r2   Ú_remove_endmarkerr   r8  r)   r&   r!  Ú_update_parsed_node_tos)rž   Ú
tree_nodesÚkeyword_token_indentsÚ
old_prefixr   s        r   rí   Ú_NodesTree.add_parsed_nodesc  s¢   € Ø—[‘[ˆ
Ø×+Ñ+¨JÓ7ˆ
ÞØ$§{¡{Ñ2ˆDŒKØà˜!‰}×!Ñ! YÓ.Ð.Ð.à×*Ñ*¨:°a©=×+BÑ+BÀ1Ñ+EÓFˆØ�~‰~×"Ñ"Ð&=Ó=Ð=Ð=Ø×Ñ˜JÔ3à×$Ñ$ Z°¡^Ð5JÕKr   c                 óä  • UR                   S:X  a°  UR                  R                  S   n[        UX#R                     S   S9nUR                  S[        UR                  5      5        U R                  S   R                  U5        U R                  R                  U5        U R                  UR                  S   U5        g [        U5      (       a   U R                  UR                  S   U5        g g )Nr}   r   r-   ©r  rL   )r   r.   r$   r  r)   r!  r  r1  r  r  r<  r~   )rž   r&   r>  Údef_leafÚnew_toss        r   r<  Ú"_NodesTree._update_parsed_node_tosr  sÔ   € Ø�>‰>˜WÓ$Ø ×'Ñ'×0Ñ0°Ñ3ˆHÜ$ØØ1×2DÑ2DÑEÀbÑIñˆGð ×"Ñ" 2¤t¨I×,>Ñ,>Ó'?Ô@à×Ñ Ñ#×2Ñ2°7Ô;Ø×Ñ×&Ñ& wÔ/à×(Ñ(¨×);Ñ);¸BÑ)?ÐAVÕWÜ% i×0Ñ0Ø×(Ñ(¨×);Ñ);¸BÑ)?ÐAVÕWð 1r   c                 ó„  • US   R                  5       nUR                  S:H  nSU l        U(       ak  UR                  n[	        UR                  S5      UR                  S5      5      nUS:”  a/  UR                  SUS-    UR                  US-   S sUl        U l        SU l        U(       a  UR                  U l        USS nU$ )z5
Helps cleaning up the tree nodes that get inserted.
r-   r[   rL   r+   r,   Nr"   )r\   r   r2  r2   r$  Úrfind)rž   r=  r_   Úis_endmarkerr2   Ú
separations         r   r;  Ú_NodesTree._remove_endmarker‚  sÂ   € ð ˜r‘N×0Ñ0Ó2ˆ	Ø —~‘~¨Ñ4ˆØ!#ˆÔÞØ×%Ñ%ˆFÜ˜VŸ\™\¨$Ó/°·±¸dÓ1CÓDˆJØ˜B‹ð
 ×$Ñ$ _ j°1¡nÐ5°y×7GÑ7GÈ
ÐUVÉÈÐ7Xð 9�	Ô  $Ô"8ð ˆŒæØ#×*Ñ*ˆDŒKà# C R˜ˆJØÐr   c              #   óè   #   • [        U5      nU(       a  [        U5      v •  [        U5      n[        U5      nU(       d  XPR                  ;  a  g Uv •  U H  n[        U5      U:w  a    g Uv •  M     g 7fr   )Úiterrü   r#   rð   )rž   r=  Úis_new_suiteÚnode_iteratorÚ
first_nodeÚindentr`   s          r   Ú_get_matching_indent_nodesÚ%_NodesTree._get_matching_indent_nodes›  sg   é € ô
 ˜ZÓ(ˆÞÜ�}Ó%Ò%ä˜-Ó(ˆ
Ü! *Ó-ˆÞ ¯l©lÓ :ØØÒãˆAÜ Ó" fÓ,ÙØŒGò ùs   ‚A0A2c                 ó  • US   R                   S;   a  / $ [        US   5      n[        U R                  5      nU R                  nU R
                  nU R
                   Vs/ s H  oˆU::  d  M
  UPM     snU l        U R                  U5        U R                  [        U R                  5      UUUU R                  5      u  o�l        U l        n
U	(       a  U =R
                  U
-  sl        U	$ XPl        X`l        Xpl        U	$ s  snf )za
Copies tree nodes from the old parser tree.

Returns the number of tree nodes that were copied.
r   ©r   Ú
error_node)r   r#   r  r1  r2   rð   r8  Ú_copy_nodes)rž   r=  r®   r–   r  Úold_working_stackr?  Úold_indentsÚiÚ	new_nodesÚadded_indentss              r   rÙ   Ú_NodesTree.copy_nodes¯  sð   € ð �a‰=×ÑÐ!=Ó=ð ˆIä& z°!¡}Ó5ˆÜ  ×!4Ñ!4Ó5ÐØ—[‘[ˆ
Ø—l‘lˆØ#'§<¢<ÓD¢<˜a¸Ñ3CŸ¡<ÑDˆŒà×#Ñ# KÔ0àEI×EUÑEUÜ�×$Ñ$Ó%ØØØØ�K‰KóF
ÑBˆ	Ô&¨¬°]ö Ø�LŠL˜MÑ)�Lð
 Ðð #4ÔØ$ŒKØ&ŒLØÐùò# Es   Á	C=Á,C=c                 ó  • / n/ n[        U R                  UUS95      nSn	U GH  n
U
R                  S   U:”  a    GOU
R                  S:X  a    OïU
R                  S:X  a  U
R                  S;   a    OÍ[        U
5      U:”  a#  [        U
5      (       a  UR                  U
5          O› U
R                  nU
nUR                  S:X  a  UR                  S   nUR                  S	;   a  UR                  S   nUR                  S
;   a  UR                  S   nOUS   nUR                  S;   a    O UR                  U
5        GM     U(       a¼  U(       aµ  US   nUR                  S;   d  [        US   5      (       aX  Sn	UR                  5         U(       a=  US   nUR                  5       R                  S:X  a  OUR                  5         U(       a  M=  M‡  [        U5      S:”  a%  US   R                  S:X  a  UR                  5         M»   U(       d  / XU4$ US   nUS   nSn[        U5      (       aÌ  UnUR                  S:w  a!  UR                  S   nUR                  S:w  a  M!  [        U5      nUR                  U5        [        U[!        U5      S9nU R#                  UU/-   UR                  X4SS9u  nnn	nUU-  n[        U5      S:  a  UR                  5         Sn	OU(       d   eUR%                  U5        UnSnU(       añ  ['        US   R                  5       5      (       d1  U(       d*  US   R)                  5       R*                  n[-        USS9S   n	U(       ai  US   nUR                  S:X  a  UR                  S   nUR                  S	;   a  UR                  S   nUR                  S   R                  5       nUS:X  d   eOUS   R                  5       nUR/                  XWUU5        U	nSU l        XqXX4$ ! [         a     GNÖf = f)N)rM  rL   r   r[   r   )r   r   rv   r-   rw   rz   rT  re   r"   éþÿÿÿrU  Fr}   rB  T)Ú	is_nestedé   rJ   Ú:)r  rQ  r)   r   r   ra   r~   r  r$   r0   rŠ   r7  r\   r4   r'   r  r#   rV  r  r]   r   r2   r   r!  r2  )rž   Úworking_stackr‚   r®   r–   r2   r_  rZ  r[  Ú
new_prefixr   Úcr`   Ú
suite_nodeÚ	last_nodeÚtosÚhad_valid_suite_lastr}   rP  Ú	suite_tosÚsuite_nodesÚnew_working_stackÚaiÚpÚlastr  s                             r   rV  Ú_NodesTree._copy_nodesÑ  sö  € àˆ	Øˆä�T×4Ñ4ØØ"ð 5ð 
ó ˆð
 ˆ
ÜˆDØ�~‰~˜aÑ  :Ó-Úà�y‰y˜KÓ'Ùà�y‰y˜LÓ(¨T¯_©_Ð@ZÓ-ZÙô ˜dÓ# jÓ0ä+¨D×1Ñ1Ø×$Ñ$ TÔ*ÙðØ—M‘M�ð �Ø—6‘6˜[Ó(ØŸ
™
 2™�AØ—6‘6Ð<Ó<ØŸ
™
 2™�AØ—6‘6Ð4Ó4Ø!"§¡¨B¡‘Jà!" 2¡�Jà—?‘?Ð&BÓBÙð Cð ×Ñ˜T×"ñO öT ÞØ% b™M�	Ø—N‘NÐ&BÓBÜ(¨°2©×7Ñ7ð "$�JØ—M‘M”OÞ#Ø$-¨b¡M˜	Ø$×2Ñ2Ó4×9Ñ9¸YÓFØ!Ø!Ÿ™œ÷	 $˜)ñ
 Ü�y“> AÓ%¨)°B©-×*<Ñ*<ÀÓ*Lð
 —M‘M”OÙØæØ�}¨mÐ;Ð;à˜BÑˆØ˜b‘Mˆ	Ø$Ðä# I×.Ñ.ØˆEØ—*‘* Ó'ØŸ™ rÑ*�ð —*‘* Õ'ô ,¨EÓ2ˆFØ× Ñ  Ô(ä& uÔ:JÈ9Ó:UÑVˆIð >B×=MÑ=MØ  Ñ+¨U¯^©^¸ZØð >Nð >Ñ:ˆKÐ*¨J¸ð ˜RÑˆMÜ�;Ó !Ó#à—‘”Ø‘
æ Ð �yØ×"Ñ" 9Ô-Ø 1�Ø'+Ð$æÜ% i°¡m×&AÑ&AÓ&C×DÑDÖMaØ˜b‘M×/Ñ/Ó1×8Ñ8�ô
 )¨°TÑ:¸1Ñ=�
æ#Ø  ‘}�Ø—9‘9 Ó+ØŸ=™=¨Ñ,�DØ—9‘9Ð ?Ó?ØŸ=™=¨Ñ,�DØ(,¯©°bÑ(9×(GÑ(GÓ(IÐ%Ø,°Ó3Ð3Ñ3à(1°"©×(CÑ(CÓ(EÐ%Ø×ÑØ ;Ð0Eôð  ˆFØ%'ˆDÔ"à¨Ð>Ð>øô] "ó Úðús   Â#O0Ï0
O>Ï=O>c                 óò  • U R                   R                  5          U R                  R                  5       n[	        U5      n[        UR                  5      n[        U R                  5      n[        U5      S:”  d   e[        U5      S:X  aL  US   R                  [        5      (       a  USS/:X  a  US==   S-  ss'   US==   [        US   5      -  ss'   O*US==   [        U5      S-
  -  ss'   [        US   5      US'   [        SUS   US   4U R                  U R                  -   5      nU R                  Ul        U R                  R                   R#                  U5        g ! [         a    SS/n GNf = f)Nr"   r   r-   rL   )r0  r  r�   r\   rc   r  r3   Ú
IndexErrorr   r2   r4   r5   r   r   r2  r.   r$   r  )rž   r_   r3   r  r[   s        r   r¼   Ú_NodesTree.close_  s@  € Ø�‰×ÑÔ ð	.ØŸ™×2Ñ2Ó4ˆIô 2°)Ó<ˆIÜ˜9×,Ñ,Ó-ˆGÜ˜DŸK™KÓ(ˆÜ�5‹z˜A‹~Ðˆ~Üˆu‹:˜‹?Ø�Q‰x×"Ñ"¤?×3Ñ3¸ÀAÀqÀ6Ó8IØ˜“
˜a‘“
Ø�A‹Jœ#˜e A™h›-Ñ'ŒJà�A‹Jœ#˜e›* q™.Ñ(‹JÜ˜U 2™Y›ˆG�A‰Jä˜b 7¨1¡:¨w°q©zÐ":¸D¿K¹KÈ$×J`ÑJ`Ñ<`Óaˆ	ØŸ<™<ˆ	ÔØ�‰×Ñ×$Ñ$ YÕ/øô# ó 	Ø˜!�f‹Gð	ús   œE$ Å$E6Å5E6)r0  r�   r2  r1  rð   r2   N)rL   F)r�   r�   r‘   r’   r    ÚpropertyrÕ   r8  rí   r<  r;  rQ  rÙ   rV  r¼   r“   rŽ   r   r   r¦   r¦   P  sO   † òð ñBó ðBò&òLòXò ò2ò( ðF */ôL?õ\0r   r¦   )rL   )0r	  rý   rN   Úcollectionsr   ÚloggingÚparso.utilsr   Úparso.python.parserr   Úparso.python.treer   Úparso.python.tokenizer   r   Úparso.python.tokenr	   Ú	getLoggerr�   r´   r½   r   r   r   r  r   rÿ   r   r   r   r'   r#   r/   rA   rY   ra   rc   r]   rt   r~   rƒ   rŠ   rÁ   rŒ   r•   r˜   r  r¦   rŽ   r   r   Ú<module>r|     s  ðñó6 
Û Ý "Û å #Ý &Ý 'ß >Ý /à×Ò˜Ó!€ØÐ à8Ð à
×
"Ñ
"€Ø	×	 Ñ	 €Ø×Ñ€Ø×,Ñ,€Ø×&Ñ&€	òPòòò3ò"ò+'ò\]ò(	ò$ò"ôNòòVòò":ô	 	ô 	ò
@÷Hñ H÷VHFñ HF÷Vf0ò f0r   