Ë
    #´˜jY2  ã                   ób  — d Z ddlmZ ddlZddlmZ  eej                  ej                  z   dz   «      Z	 eej                  dz   «      Z
 ed«      D � cg c]  }  e| «      e	v ‘Œ c} Z ed«      D � cg c]  }  e| «      e
v ‘Œ c} Z G d„ d«      Zed	k(  rdd
lmZ  edd¬«       yyc c} w c c} w )zîProvide advanced parsing abilities for ParenMatch and other extensions.

HyperParser uses PyParser.  PyParser mostly gives information on the
proper indentation of code.  HyperParser gives additional information on
the structure of code.
é    )Ú	iskeywordN)ÚpyparseÚ_é€   c                   óZ   — e Zd Zd„ Zd„ Zd„ Zd„ Zdd„Z eh d£«      Z	e
d„ «       ZdZd	„ Zy
)ÚHyperParserc                 óø  — || _         |j                  x| _        }t        j                  |j                  |j
                  «      }d„ } ||j                  |«      «      }|j                  s–|j                  D ]q  }t        ||z
  d«      }t        |«      dz   }	d|z  }
|j                  |j                  |	|
«      dz   «       |j                  |j                  |	«      «      }|€|dk(  sŒq n |j                  xs d«       nV|j!                  d|«      }|r|d   }	nd	}	d|z  }
|j                  |j                  |	|
«      dz   «       |j                  d«       |j"                  dd
 | _        
| _        |j)                  «       | _        t-        t/        | j*                  «      «      D �cg c]1  }|dkD  xr( | j*                  |   d   | j*                  |dz
     d   kD  ‘Œ3 c}| _        | j3                  |«       yc c}w )z;To initialize, analyze the surroundings of the given index.c                 ó*   — t        t        | «      «      S )N)ÚintÚfloat)Úindexs    ú%lib/python3.12/idlelib/hyperparser.pyÚ
index2linez(HyperParser.__init__.<locals>.index2line"   s   € Ü”u˜U“|Ó$Ð$ó    é   z.0z%d.endz 
Nr   Úconsolez1.0éþÿÿÿ)ÚeditwinÚtextr   ÚParserÚindentwidthÚtabwidthr   Úprompt_last_lineÚnum_context_linesÚmaxÚreprÚset_codeÚgetÚfind_good_parse_startÚ_build_char_in_string_funcÚset_loÚtag_prevrangeÚcodeÚrawtextÚstopatindexÚget_last_stmt_bracketingÚ
bracketingÚrangeÚlenÚisopenerÚ	set_index)Úselfr   r   r   Úparserr   ÚlnoÚcontextÚstartatÚstartatindexr%   ÚbodÚrÚis                 r   Ú__init__zHyperParser.__init__   sê  € ð ˆŒØ"Ÿ<™<Ð'ˆŒ	�Dä—‘ × 3Ñ 3°W×5EÑ5EÓFˆò	%á˜Ÿ™ EÓ*Ó+ˆà×'Ò'Ø"×4Ô4�Ü˜c G™m¨QÓ/�Ü# G›}¨tÑ3�Ø&¨™n�ð
 —‘ §¡¨°{Ó CÀEÑ IÔJØ×2Ñ2Ø!×<Ñ<¸\ÓJóL�à�? g°£lÙð 5ð �M‰M˜#š( Õ#à×"Ñ" 9¨eÓ4ˆAÙØ  ™t‘à$�Ø" S™.ˆKð �O‰O˜DŸH™H \°;Ó?ÀÑEÔFØ�M‰M˜!Ôð —{‘{ 3 BÐ'ˆŒð 'ˆÔØ ×9Ñ9Ó;ˆŒô
 #(¬¨D¯O©OÓ(<Ô"=ó?á"=˜Qð ˜1™ò 1 §¡°Ñ!3°AÑ!6ØŸ™¨¨1©Ñ-¨aÑ0ñ"1ñ 1à"=ñ?ˆŒð 	�‰�uÕùò	?s   Æ'6G7c                 óJ  — t        | j                  «      t        | j                  j                  || j                  «      «      z
  }|dk  rt        d|z  «      ‚|| _        d| _        | j                  t        | j                  «      dz
  k  r“| j                  | j                  dz      d   | j                  k  rg| xj                  dz  c_        | j                  t        | j                  «      dz
  k  r-| j                  | j                  dz      d   | j                  k  rŒg| j                  t        | j                  «      dz
  k  r`| j                  | j                  dz      d   | j                  k(  r3| j                  | j                  dz      s| xj                  dz  c_        yyyy)zgSet the index to which the functions relate.

        The index must be in the same statement.
        r   z(Index %s precedes the analyzed statementr   N)
r)   r$   r   r   r%   Ú
ValueErrorÚindexinrawtextÚindexbracketr'   r*   )r,   r   r8   s      r   r+   zHyperParser.set_indexQ   sy  € ô
 ˜dŸl™lÓ+Ü˜dŸi™iŸm™m¨E°4×3CÑ3CÓDÓEñFˆà˜AÒÜÐGØ$ñ%ó &ð &à,ˆÔàˆÔØ× Ñ ¤3 t§¡Ó#7¸Ñ#9Ò9Ø�‰˜t×0Ñ0°Ñ2Ñ3°AÑ6¸×9LÑ9LÒLØ×Ò Ñ"Õð × Ñ ¤3 t§¡Ó#7¸Ñ#9Ò9Ø�‰˜t×0Ñ0°Ñ2Ñ3°AÑ6¸×9LÑ9LÓLà×Ñ¤ D§O¡OÓ 4°QÑ 6Ò6Ø�O‰O˜D×-Ñ-¨aÑ/Ñ0°Ñ3°t×7JÑ7JÒJØ�}‰}˜T×.Ñ.¨qÑ0Ò1Ø×Ò Ñ"Öð 2ð Kð 7r   c                 óŽ   — | j                   | j                     xr+ | j                  | j                  | j                     d      dv S )z2Is the index given to the HyperParser in a string?r   )Ú"Ú'©r*   r9   r$   r'   ©r,   s    r   Úis_in_stringzHyperParser.is_in_stringf   sH   € ð —‘˜d×/Ñ/Ñ0ò Ø—‘˜TŸ_™_¨T×->Ñ->Ñ?ÀÑBÑCØðð	r   c                 ó�   — | j                   | j                      xs+ | j                  | j                  | j                     d      dvS )z5Is the index given to the HyperParser in normal code?r   )Ú#r;   r<   r=   r>   s    r   Ú
is_in_codezHyperParser.is_in_coden   sI   € à—M‘M $×"3Ñ"3Ñ4Ð4ò 'Ø—‘˜TŸ_™_¨T×->Ñ->Ñ?ÀÑBÑCØ&ð'ð	(r   c                 óŒ  — | j                   | j                     d   }| j                  }| j                  |   r6| j                  | j                   |   d      |vs| j                   |   d   |kD  ro|dz  }|dk  ryt	        || j                   |   d   «      }| j                  |   sŒ7| j                  | j                   |   d      |vrŒY| j                   |   d   |kD  rŒo| j                  dz   }|t        | j                   «      k  rH| j                   |   d   |k\  r3|dz  }|t        | j                   «      k  r| j                   |   d   |k\  rŒ3| j                  j                  d| j                  t        | j                  «      | j                   |   d   z
  fz  «      }|t        | j                   «      k\  s(| j                   |   d   t        | j                  «      kD  r|ry| j                  }||fS | j                  j                  d| j                  t        | j                  «      | j                   |   d   dz
  z
  fz  «      }||fS )a¼  Return bracket indexes or None.

        If the index given to the HyperParser is surrounded by a
        bracket defined in openers (or at least has one before it),
        return the indices of the opening bracket and the closing
        bracket (or the end of line, whichever comes first).

        If it is not surrounded by brackets, or the end of line comes
        before the closing bracket and mustclose is True, returns None.
        r   r   Nz%s-%dc)	r'   r9   r*   r$   Úminr)   r   r   r%   )r,   ÚopenersÚ	mustcloseÚbracketinglevelÚbeforeÚafterÚbeforeindexÚ
afterindexs           r   Úget_surrounding_bracketsz$HyperParser.get_surrounding_bracketst   s6  € ð Ÿ/™/¨$×*;Ñ*;Ñ<¸QÑ?ˆØ×"Ñ"ˆØ—=‘= Ò(Ø�l‰l˜4Ÿ?™?¨6Ñ2°1Ñ5Ñ6¸gÑEØ�o‰o˜fÑ% aÑ(¨?Ò:Ø�a‰KˆFØ˜ŠzØÜ! /°4·?±?À6Ñ3JÈ1Ñ3MÓNˆOð —=‘= Ó(Ø�l‰l˜4Ÿ?™?¨6Ñ2°1Ñ5Ñ6¸gÒEØ�o‰o˜fÑ% aÑ(¨?Ó:ð
 ×!Ñ! AÑ%ˆØ”s˜4Ÿ?™?Ó+Ò+Ø�o‰o˜eÑ$ QÑ'¨?Ò:Ø�Q‰JˆEð ”s˜4Ÿ?™?Ó+Ò+Ø�o‰o˜eÑ$ QÑ'¨?Ó:ð —i‘i—o‘o hØ×Ñœs 4§<¡<Ó0°·±ÀÑ1HÈÑ1KÑKÐLñ'Mó Nˆà”S˜Ÿ™Ó)Ò)Ø�?‰?˜5Ñ! !Ñ$¤s¨4¯<©<Ó'8Ò8ÙØØ×)Ñ)ˆJð ˜JÐ&Ð&ð	 Ÿ™Ÿ™Ø˜D×,Ñ,Ü�T—\‘\Ó" D§O¡O°EÑ$:¸1Ñ$=¸aÑ$?Ñ@ðBñ BóCˆJð ˜JÐ&Ð&r   >   ÚNoneÚTrueÚFalsec                 óÞ  — t         }|}||kD  r[t        ||dz
     «      dk  rG|t        ||dz
     «         r3|dz  }||kD  r)t        ||dz
     «      dk  r|t        ||dz
     «         rŒ3||kD  r¼t        ||dz
     «      dk\  r¨|dz
  |k\  r@d||dz
  | z   j                  «       r'|dz  }|dz
  |k\  rd||dz
  | z   j                  «       rŒ'|dz
  |k\  rd||dz
  | z   j                  «       r|dz  }|dz
  |k\  rd||dz
  | z   j                  «       r|dz  }||| j                  «       sy||k  rt        t        ||   «         sy||k  r t	        ||| «      r||| | j
                  vry||z
  S )zÈGiven a string and pos, return the number of chars in the
        identifier which ends at pos, or 0 if there is no such one.

        This ignores non-identifier eywords are not identifiers.
        r   r   é   Úaé   r   )Ú_IS_ASCII_ID_CHARÚordÚisidentifierÚ_IS_ASCII_ID_FIRST_CHARr   Ú_ID_KEYWORDS)ÚclsÚstrÚlimitÚposÚis_ascii_id_charr4   s         r   Ú_eat_identifierzHyperParser._eat_identifier¢   s³  € ô -Ðð ˆð �%ŠiÜ�C˜˜A™‘J“ #Ò%Ø ¤ S¨¨Q©¡Z£Ò1à�‰FˆAð	 �%ŠiÜ�C˜˜A™‘J“ #Ò%Ø ¤ S¨¨Q©¡Z£Ó1ð ˆuŠ9œ˜S  Q¡™Z›¨CÒ/Ø�a‘%˜5’. c¨C°°A±°c¨NÑ&:×%HÑ%HÔ%JØ�Q‘�ð �a‘%˜5’. c¨C°°A±°c¨NÑ&:×%HÑ%HÕ%Jà�1‰u˜Š~ 3¨¨Q°©U°3¨Ñ#7×"EÑ"EÔ"GØ�Q‘�Ø�1‰u˜Š~ 3¨¨Q°©U°3¨Ñ#7×"EÑ"EÔ"GØ�Q‘�ð �q˜�:×*Ñ*Ô,ØØ�ŠWô +¬3¨s°1©v«;Ò7Øð ˆsŠ7Ü˜#˜a ˜*Ô%Ø�A�c�
 #×"2Ñ"2Ñ2àà�Q‰wˆr   z 	
\c                 ó  — | j                  «       st        d«      ‚| j                  }| j                  }| j                  }||   d   }| j
                  }|}d}	 	 ||kD  r||dz
     | j                  v r|dz  }nO|s||kD  r||dz
     dk(  r|dz  }d}n5||k(  r/|dkD  r*|||dz
     d      dk(  r|dz  }||   d   }||dz      d   }nnŒo|sn´| j                  |||«      }|r
||z
  }|}d}n“||k(  r�||   d   }	|dkD  r'||dz
     d   |	kD  r|dz  }|dkD  r||dz
     d   |	kD  rŒ||   d   |k(  rnP||   d   }|dz  }||   d   }|}||   d	v rn/||   d
v r&|dkD  r||dz
     dv r|dz  }|dkD  r||dz
     dv rŒ|}nn�Œ'||| j
                   S )z‚Return a string with the Python expression which ends at the
        given index, which is empty if there is no real one.
        z?get_expression should only be called if index is inside a code.r   Tr   Ú.rA   rS   Fz([z'"ÚrRbBuU)rB   r7   r$   r'   r9   r8   Ú_whitespace_charsr^   )
r,   r$   r'   Ú
brck_indexÚ
brck_limitr\   Úlast_identifier_posÚpostdot_phaseÚretÚlevels
             r   Úget_expressionzHyperParser.get_expressionÞ   so  € ð �‰Ô Üð :ó ;ð ;ð —,‘,ˆØ—_‘_ˆ
à×&Ñ&ˆ
Ø 
Ñ+¨AÑ.ˆ
Ø×!Ñ!ˆà!ÐØˆààØ�z’> g¨c°!©e¡n¸×8NÑ8NÑ&Nà˜1‘H‘CÙ'Ø˜JÒ&¨7°3°q±5©>¸SÒ+@à˜1‘H�CØ$(‘Mð ˜ZÒ'¨J¸ªNØ˜j¨°A©Ñ6°qÑ9Ñ:¸cÒAà !‘O�JØ!+¨JÑ!7¸Ñ!:�JØ$ Z°¡\Ñ2°1Ñ5‘Cð ð' ñ* !ð à×&Ñ& w°
¸CÓ@ˆCÙà˜C‘i�Ø&)Ð#à %‘ð ˜
Ò"ð # :Ñ.¨qÑ1�Ø  1’n¨°J¸q±LÑ)AÀ!Ñ)DÀuÒ)LØ !‘O�Jð ! 1’n¨°J¸q±LÑ)AÀ!Ñ)DÀuÓ)Là˜jÑ)¨!Ñ,°
Ò:àØ  Ñ,¨QÑ/�Ø˜a‘�
Ø'¨
Ñ3°AÑ6�
Ø&)Ð#Ø˜3‘< 4Ñ'ð ð ˜s‘| uÑ,à! Ašg¨'°#¸±'Ñ*:¸hÑ*FØ 1™H˜Cð " Ašg¨'°#¸±'Ñ*:¸hÒ*Fà.1Ð+Øð ñC ðF Ð*¨4×+>Ñ+>Ð?Ð?r   N)z([{F)Ú__name__Ú
__module__Ú__qualname__r5   r+   r?   rB   rL   Ú	frozensetrX   Úclassmethodr^   rb   ri   © r   r   r   r      sL   „ ò5òn#ò*ò(ó('ñX Ò6Ó7€Làñ6ó ð6ðr "ÐóU@r   r   Ú__main__)Úmainz"idlelib.idle_test.test_hyperparserrS   )Ú	verbosity)Ú__doc__Úkeywordr   ÚstringÚidlelibr   rm   Úascii_lettersÚdigitsÚ_ASCII_ID_CHARSÚ_ASCII_ID_FIRST_CHARSr(   ÚchrrT   rW   r   rj   Úunittestrq   )Úxs   0r   Ú<module>r~      sÏ   ðñõ Û å ñ ˜F×0Ñ0°6·=±=Ñ@À3ÑFÓG€á! &×"6Ñ"6¸Ñ"<Ó=Ð ñ ;@À¼*ÓE¹*°Q‘c˜!“f Ò/¸*ÑEÐ ñ 16°c´
Ó;±
¨1�cˆ!ƒfÐ%Ò%°
Ñ;ð ÷Z@ñ Z@ðz ˆzÒÝÙÐ	-¸Ö;ð ùòI	 Fùò <s   ÁB'Á2B,