Ë
    pPêjø³  ã                  óè  — U d Z ddlmZ ddlZddlmZ ddlmZmZ ddlm	Z	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 ddlmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA e+ez  ZBdeCd<   eDee#gdf   ee9geEf   f   ZFdeCd<   eGeDeHeHf   eeI   f   ZJdeCd<   d1d„ZKd2d„ZL eK«       ZMdeCd<    eLd«      ZNdeCd<    eLd«      ZOdeCd<   dZPdeCd<   h d£ZQdeCd <   h d!£ZRdeCd"<   h d#£ZSdeCd$<   h d%£ZTdeCd&<   h d'£ZUdeCd(<    G d)„ d*«      ZVd3d+„ZW	 d4	 	 	 	 	 	 	 	 	 d5d,„ZX	 	 	 	 	 	 	 	 d6d-„ZY G d.„ d/«      ZZd7d0„Z[y)8aå  
Format expression type checker.

This file is conceptually part of ExpressionChecker and TypeChecker. Main functionality
is located in StringFormatterChecker.check_str_format_call() for '{}'.format(), and in
StringFormatterChecker.check_str_interpolation() for printf-style % interpolation.

Note that although at runtime format strings are parsed using custom parsers,
here we use a regexp-based approach. This way we 99% match runtime behaviour while keeping
implementation simple.
é    )ÚannotationsN)ÚCallable)ÚMatchÚPattern)ÚFinalÚ	TypeAliasÚcast)Úmessage_registry)ÚTypeCheckerSharedApi)ÚErrors)Úmap_instance_to_supertype)ÚMessageBuilder)Ú	ARG_NAMEDÚARG_POSÚARG_STARÚ	ARG_STAR2Ú	BytesExprÚCallExprÚContextÚDictExprÚ
ExpressionÚExpressionStmtÚ	IndexExprÚIntExprÚ
MemberExprÚMypyFileÚNameExprÚStarExprÚStrExprÚTempNodeÚ	TupleExpr)Úparse)Ú
is_subtype)Úcustom_special_method)ÚAnyTypeÚInstanceÚLiteralTypeÚ	TupleTypeÚTypeÚ	TypeOfAnyÚTypeVarTupleTypeÚTypeVarTypeÚ	UnionTypeÚ
UnpackTypeÚfind_unpack_in_listÚget_proper_typeÚget_proper_typesÚ
_TypeAliasÚFormatStringExprÚCheckersÚMatchMapc                 ól   — d} d}d}d}d}d}d| z   |z   |z   |z   |z   |z   }t        j                  |«      S )zìConstruct regexp to match format conversion specifiers in % interpolation.

    See https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting
    The regexp is intentionally a bit wider to report better errors.
    z(\((?P<key>[^)]*)\))?z(?P<flags>[#0\-+ ]*)z(?P<width>[1-9][0-9]*|\*)?z (?:\.(?P<precision>\*|[0-9]+)?)?z[hlL]?ú(?P<type>.)?ú%©ÚreÚcompile)Úkey_reÚflags_reÚwidth_reÚprecision_reÚlength_mod_reÚtype_reÚ	format_res          úX/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/mypy/checkstrformat.pyÚcompile_format_rerD   G   sT   € ð &€FØ&€HØ,€HØ6€LØ€MØ€GØ�f‘˜xÑ'¨(Ñ2°\ÑAÀMÑQÐT[Ñ[€IÜ�:‰:�iÓ Ð ó    c                ór   — d}d}| sd}d}d}d|z   |z   |z   dz   }nd}t        j                  ||z   |z   «      S )	a  Construct regexps to match format conversion specifiers in str.format() calls.

    See After https://docs.python.org/3/library/string.html#formatspec for
    specifications. The regexps are intentionally wider, to report better errors,
    instead of just not matching.
    z%(?P<field>(?P<key>[^.[!:]*)([^:!]+)?)z(?P<conversion>![^:])?z(?P<fill_align>.?[<>=^])?z?(?P<flags>[+\- ]?#?0?)(?P<width>\d+)?[_,]?(?P<precision>\.\d+)?r7   z(?P<format_spec>:z)?z(?P<format_spec>:.*)?r9   )Úcustom_specÚfieldÚ
conversionÚ
fill_alignÚnum_specÚ	conv_typeÚformat_specs          rC   Úcompile_new_format_rerN   W   sa   € ð 5€Eð +€Jñ à1ˆ
ð Vˆà#ˆ	Ø*¨ZÑ7¸(ÑBÀYÑNÐQVÑV‰ð /ˆä�:‰:�e˜jÑ(¨;Ñ6Ó7Ð7rE   r   Ú	FORMAT_REFÚFORMAT_RE_NEWTÚFORMAT_RE_NEW_CUSTOMÚ__dummy_name__ÚDUMMY_FIELD_NAME>   ÚEÚFÚGÚXÚdÚeÚfÚgÚiÚoÚuÚxÚNUMERIC_TYPES_OLD>   rT   rU   rV   rW   ÚbrX   rY   rZ   r[   Únr]   r_   r8   ÚNUMERIC_TYPES_NEW>   rW   r]   r_   ÚREQUIRE_INT_OLD>   rW   ra   rX   r]   r_   ÚREQUIRE_INT_NEW>   rT   rU   rV   rY   rZ   r[   ÚFLOAT_TYPESc                  ó6   — e Zd Z	 d	 	 	 	 	 	 	 dd„Zdd„Zdd„Zy)ÚConversionSpecifierc                óê  — |j                  «       | _        || _        |j                  «       }|j	                  d«      | _        |j	                  d«      xs d| _        |j	                  d«      xs d| _        |j	                  d«      xs d| _        |j	                  d«      xs d| _	        |j	                  d«      | _
        || _        |j	                  d«      | _        |j	                  d	«      | _        y )
NÚkeyÚtypeÚ ÚflagsÚwidthÚ	precisionrM   rI   rH   )ÚgroupÚ	whole_seqÚ	start_posÚ	groupdictÚgetrj   rL   rm   rn   ro   rM   Únon_standard_format_specrI   rH   )ÚselfÚmatchrr   ru   Úm_dicts        rC   Ú__init__zConversionSpecifier.__init__‰   sÇ   € ð Ÿ™›ˆŒØ"ˆŒà—‘Ó"ˆØ—:‘:˜eÓ$ˆŒð  Ÿ™ FÓ+Ò1¨rˆŒØ—Z‘Z Ó(Ò.¨BˆŒ
Ø—Z‘Z Ó(Ò.¨BˆŒ
ØŸ™ KÓ0Ò6°BˆŒð "Ÿ:™: mÓ4ˆÔØ(@ˆÔ%à Ÿ*™* \Ó2ˆŒð —Z‘Z Ó(ˆ�
rE   c                ó   — | j                   d uS ©N©rj   ©rv   s    rC   Úhas_keyzConversionSpecifier.has_key¡   s   € Ø�x‰x˜tÐ#Ð#rE   c                óB   — | j                   dk(  xs | j                  dk(  S )NÚ*)rn   ro   r}   s    rC   Úhas_starzConversionSpecifier.has_star¤   s   € Ø�z‰z˜SÑ Ò9 D§N¡N°cÑ$9Ð9rE   N)éÿÿÿÿF)rw   z
Match[str]rr   Úintru   ÚboolÚreturnÚNone)r…   r„   )Ú__name__Ú
__module__Ú__qualname__ry   r~   r�   © rE   rC   rh   rh   ˆ   s4   „ àW\ð)Øð)Ø,/ð)ØPTð)à	ó)ó0$ô:rE   rh   c                óœ   — g }t        j                  t        | «      D ],  }|j                  t	        ||j                  «       ¬«      «       Œ. |S )zFParse c-printf-style format string into list of conversion specifiers.©rr   )r:   ÚfinditerrO   Úappendrh   Ústart)Ú
format_strÚ
specifiersÚms      rC   Úparse_conversion_specifiersr“   ¨   sE   € à,.€JÜ�[‰[œ JÓ/ò GˆØ×ÑÔ-¨a¸1¿7¹7»9ÔEÕFðGàÐrE   c                óò  — t        | ||«      }|€yg }|D �]^  \  }}t        j                  |«      }|rt        ||¬«      }	nJt        j                  |«      }
|
rt        |
|d¬«      }	n$|j                  d|t        j                  ¬«        y|	j                  r@d|	j                  v sd|	j                  v r$|j                  d	|t        j                  ¬«        y|j                  |	«       |	j                  sŒà|	j                  sŒíd|	j                  v sd|	j                  v s�Œ|r$|j                  d
|t        j                  ¬«        yt        |	j                  ||d¬«      }|€ y|j                  |«       �Œa |S )zÑParse format string into list of conversion specifiers.

    The specifiers may be nested (two levels maximum), in this case they are ordered as
    '{0:{1}}, {2:{3}{4}}'. Return None in case of an error.
    NrŒ   T)rr   ru   z-Invalid conversion specifier in format string©Úcodeú{ú}z(Conversion value must not contain { or }z2Formatting nesting must be at most two levels deep)Únested)Úfind_non_escaped_targetsrP   Ú	fullmatchrh   rQ   ÚfailÚcodesÚSTRING_FORMATTINGrj   rŽ   rM   ru   Úparse_format_valueÚextend)Úformat_valueÚctxÚmsgr™   Útop_targetsÚresultÚtargetrr   rw   Ú	conv_specÚcustom_matchÚsub_conv_specss               rC   rŸ   rŸ   °   sp  € ô +¨<¸¸cÓB€KØÐØà(*€FØ(ó '*Ñˆ�	Ü×'Ñ'¨Ó/ˆÙÜ+¨E¸YÔG‰Iä/×9Ñ9¸&ÓAˆLÙÜ/Ø ¨IÐPTô‘	ð —‘ØCØÜ×0Ñ0ð ô ñ
 à�=Š=˜c Y§]¡]Ñ2°c¸Y¿]¹]Ñ6JØ�H‰HÐ?ÀÌ5×KbÑKbˆHÔcÙØ�‰�iÔ ð ×!Ó!Ø×2Ó2Ø˜	×-Ñ-Ñ-°¸	×8MÑ8MÓ1MáØ—‘ØHØÜ×0Ñ0ð ô ñ
 Ü/°	×0EÑ0EÀsÈCÐX\Ô]ˆNØÐ%ÙØ�M‰M˜.Ö)ðO'*ðP €MrE   c                ó  — g }d}d}d}|t        | «      k  rË| |   }|ss|dk(  r$|t        | «      dz
  k  r| |dz      dk(  r|dz  }nd}|dk(  r‚|t        | «      dz
  k  r| |dz      dk(  r|dz  }n`|j                  d|t        j                  ¬«       y|dk(  r|dz  }|dk(  r|dz  }|r||z  }n!|j	                  ||t        |«      z
  f«       d}|dz  }|t        | «      k  rŒË|r#|j                  d	|t        j                  ¬«       y|S )
am  Return list of raw (un-parsed) format specifiers in format string.

    Format specifiers don't include enclosing braces. We don't use regexp for
    this because they don't work well with nested/repeated patterns
    (both greedy and non-greedy), and these are heavily used internally for
    representation of f-strings.

    Return None in case of an error.
    rl   r   r—   é   r˜   z;Invalid conversion specifier in format string: unexpected }r•   Nz:Invalid conversion specifier in format string: unmatched {)Úlenrœ   r�   rž   rŽ   )r¡   r¢   r£   r¥   Ú	next_specÚposÚnestingÚcs           rC   rš   rš   è   sT  € ð €FØ€IØ
€CØ€GØ
”�LÓ!Ò
!Ø˜ÑˆÙà�CŠxØœ˜\Ó*¨QÑ.Ò.°<ÀÀaÁÑ3HÈCÒ3OØ˜1‘H‘Cà�GØ�CŠxØœ˜\Ó*¨QÑ.Ò.°<ÀÀaÁÑ3HÈCÒ3OØ˜1‘H‘Cà—H‘HØUØÜ"×4Ñ4ð ô ð
  ð �CŠxØ˜1‘�Ø�CŠxØ˜1‘�ÙØ˜Q‘‘	à—‘˜y¨#´°I³Ñ*>Ð?Ô@Ø�	Øˆq‰ˆð= ”�LÓ!Ó
!ñ> Ø�‰ØHØÜ×(Ñ(ð 	ô 	
ð
 Ø€MrE   c                  ó¾  — e Zd ZU dZded<   ded<   d d„Zd!d„Z	 	 	 	 	 	 	 	 d"d„Z	 	 	 	 	 	 	 	 	 	 	 	 d#d	„Zd$d
„Z	d%d„Z
d&d„Zd'd„Z	 	 	 	 	 	 	 	 d(d„Z	 	 	 	 	 	 	 	 	 	 d)d„Zd*d„Z	 	 	 	 	 	 d+d„Z	 	 	 	 	 	 	 	 d,d„Z	 	 	 	 	 	 	 	 d,d„Zd-d„Z	 	 	 	 	 	 	 	 d.d„Z	 	 	 	 	 	 	 	 d/d„Zd0d„Zd1d„Z	 	 	 	 	 	 	 	 d2d„Zd3d„Z	 	 	 	 	 	 	 	 d4d„Z	 d5	 	 	 	 	 	 	 	 	 d6d„Zd7d„Zd8d9d„Zy):ÚStringFormatterCheckerzxString interpolation/formatter type checker.

    This class works closely together with checker.ExpressionChecker.
    r   Úchkr   r£   c                ó    — || _         || _        y)z%Construct an expression type checker.N)r³   r£   )rv   r³   r£   s      rC   ry   zStringFormatterChecker.__init__,  s   € àˆŒØˆ�rE   c                ó„   — t        ||| j                  «      }|€y| j                  ||«      sy| j                  |||«       y)a÷  Perform more precise checks for str.format() calls when possible.

        Currently the checks are performed for:
          * Actual string literals
          * Literal types with string values
          * Final names with string values

        The checks that we currently perform:
          * Check generic validity (e.g. unmatched { or }, and {} in invalid positions)
          * Check consistency of specifiers' auto-numbering
          * Verify that replacements can be found for all conversion specifiers,
            and all arguments were used
          * Non-standard format specs are only allowed for types with custom __format__
          * Type check replacements with accessors applied (if any).
          * Verify that specifier type is known and matches replacement type
          * Perform special checks for some specifier types:
            - 'c' requires a single character string
            - 's' must not accept bytes
            - non-empty flags are only allowed for numeric types
        N)rŸ   r£   Úauto_generate_keysÚcheck_specs_in_format_call)rv   Úcallr¡   Ú
conv_specss       rC   Úcheck_str_format_callz,StringFormatterChecker.check_str_format_call1  sD   € ô* (¨°d¸D¿H¹HÓEˆ
ØÐØØ×&Ñ& z°4Ô8ØØ×'Ñ'¨¨j¸,ÕGrE   c           
     óÎ  — t        d„ |D «       «      sJ d«       ‚| j                  ||D �cg c]  }t        t        |j                  «      ‘Œ c}«      }t        |«      t        |«      k(  sJ ‚t        ||«      D �]f  \  }}| j                  |||¬«      }t        |t        «      r|j                  n| j                  j                  |«      }|€J ‚|j                  r€|j                  rtd|j                  v sfd|j                  v sXt        |dd¬	«      r|j                   r>| j"                  j%                  d
|j                  dd › d�|t&        j(                  ¬«       Œâ|j*                  st-        t.        j0                  «      }	n�t        |j2                  t4        «      sJ ‚t        |j2                  j6                  t8        «      r|j2                  j6                  }
nt9        |«      }
| j;                  |j*                  ||
d¬«      }	|j                   �_|j                   d   dvr=| j"                  j%                  d|j                   d   › d�|t&        j(                  ¬«       | j=                  d«      }|	€�Œøt?        |«      }t        |t@        «      rtC        |jD                  «      n|g}|D ]7  }t        |d«      rŒ| jG                  ||	|«       | jI                  |||||	«       Œ9 �Œi yc c}w )zœPerform pairwise checks for conversion specifiers vs their replacements.

        The core logic for format checking is implemented in this method.
        c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr{   r|   ©Ú.0Úss     rC   ú	<genexpr>zDStringFormatterChecker.check_specs_in_format_call.<locals>.<genexpr>T  s   è ø€ Ò(˜Q�1—5•5Ñ(ùs   ‚ú"Keys must be auto-generated first!©r¢   Nr—   r˜   Ú
__format__T)Ú	check_allz#Unrecognized format specification "r«   ú"r•   ©Úformat_callÚrsazInvalid conversion type "z!", must be one of "r", "s" or "a"úbuiltins.str)%ÚallÚfind_replacements_in_callr	   Ústrrj   r¬   ÚzipÚapply_field_accessorsÚ
isinstancer    rk   r³   Úlookup_typerM   ru   r$   rI   r£   rœ   r�   rž   rL   r%   r*   Úspecial_formÚcalleer   Úexprr   Úconversion_typeÚ
named_typer0   r-   r1   ÚitemsÚcheck_placeholder_typeÚperform_special_format_checks)rv   r¸   Úspecsr¡   r¿   ÚreplacementsÚspecÚreplÚactual_typeÚexpected_typer�   Úa_typeÚactual_itemss                rC   r·   z1StringFormatterChecker.check_specs_in_format_callM  s·  € ô Ñ( %Ô(Ô(ÐNÐ*NÓNÐ(Ø×5Ñ5°dÐW\Ö<]ÐRS¼TÄ#ÀqÇuÁuÕ=MÒ<]Ó^ˆÜ�<Ó ¤C¨£JÒ.Ð.Ð.Ü˜e \Ó2ó =	\‰JˆD�$Ø×-Ñ-¨d°D¸dÐ-ÓCˆDÜ'1°$¼Ô'A˜$Ÿ)š)ÀtÇxÁx×G[ÑG[Ð\`ÓGaˆKØÐ*Ð*Ð*ð × Ò Ø×1Ò1ð ˜D×,Ñ,Ñ,°°t×7GÑ7GÑ0Gô .¨k¸<ÐSWÕXØ—’ð —H‘H—M‘MØ=¸d×>NÑ>NÈqÈrÐ>RÐ=SÐSTÐUØÜ"×4Ñ4ð "ô ð
 à—>’>Ü-4´Y×5KÑ5KÓ-L‘ä! $§+¡+¬zÔ:Ð:Ð:Ü˜dŸk™k×.Ñ.´Ô8Ø!%§¡×!1Ñ!1‘Jä!(¨Ó!6�JØ $× 4Ñ 4Ø—N‘N D¨*À$ð !5ó !�ð �‰Ð*à—?‘? 1Ñ%¨UÑ2Ø—H‘H—M‘Mà7¸¿¹ÈÑ8JÐ7Kð L=ð >ð Ü"×4Ñ4ð "ô ð #Ÿo™o¨nÓ=�ð Ð$Ùä$ [Ó1ˆFä2<¸VÄYÔ2OÔ  §¡Ô.ÐV\ÐU]ð ð 'ò \�Ü(¨°Ô>ØØ×+Ñ+¨F°MÀ4ÔHØ×2Ñ2°4¸¸tÀVÈ]Õ[ò	\ñs=	\ùò =^s   ª!K"
c                ó6  — |j                   dk(  röt        |t        t        f«      r5t	        |j
                  «      dk7  r| j                  j                  |d¬«       t        | j                  j                  |«      «      }t        |t        «      r|j                  r|j                  }t        |t        «      rOt        |j
                  t        «      r5t	        |j
                  «      dk7  r| j                  j                  |d¬«       |j                   r|j                   dk(  rP|j                  sDt!        |d«      r8t#        |d«      s,| j                  j%                  d|t&        j(                  ¬	«       |j*                  r�t-        | j/                  d
«      | j/                  d«      g«      }|j                   r|j                   t0        vs$|j                   sGt3        ||«      s:t#        |d«      s-| j                  j%                  d|t&        j4                  ¬	«       y y y y y )Nr°   r«   TrÆ   r¿   úbuiltins.bytesÚ__str__z¤If x = b'abc' then f"{x}" or "{}".format(x) produces "b'abc'", not "abc". If this is desired behavior, use f"{x!r}" or "{!r}".format(x). Otherwise, decode the bytesr•   úbuiltins.intúbuiltins.floatrÃ   z0Numeric flags are only allowed for numeric types)rL   rÏ   r   r   r¬   Úvaluer£   Úrequires_int_or_charr0   r³   rÐ   r&   Úlast_known_valuer'   rÌ   rI   Úhas_type_componentr$   rœ   r�   ÚSTR_BYTES_PY3rm   r-   rÕ   rc   r#   rž   )rv   rÛ   r¸   rÜ   rÝ   rÞ   Úc_typÚnumeric_typess           rC   rØ   z4StringFormatterChecker.perform_special_format_checks–  s­  € ð �>‰>˜SÒ Ü˜$¤¬)Ð 4Ô5¼#¸d¿j¹j»/ÈQÒ:NØ—‘×-Ñ-¨dÀÐ-ÔEÜ# D§H¡H×$8Ñ$8¸Ó$>Ó?ˆEÜ˜%¤Ô*¨u×/EÒ/EØ×.Ñ.�Ü˜%¤Ô-´*¸U¿[¹[Ì#Ô2NÜ�u—{‘{Ó# qÒ(Ø—H‘H×1Ñ1°$ÀDÐ1ÔIØ—’ $§.¡.°CÒ"7ÀÇÂÜ! +Ð/?Ô@ÔI^Ø˜YôJð —‘—‘ð2ð Ü×,Ñ,ð ô ð �:Š:Ü%Ø—‘ Ó0°$·/±/ÐBRÓ2SÐTóˆMð —’Ø—N‘NÔ*;Ñ;Ø—~’~Ü" ;°Ô>Ü-¨k¸<ÔHà—‘—‘ØFØÜ×0Ñ0ð õ ð Ið ?ð &ð rE   c                ó"  — g }t        «       }|D �]  }|j                  «       ro| j                  t        |«      |«      }|s¸| j                  j                  d|› �|t        j                  ¬«       t        t        t        j                  «      «      }nf| j                  ||«      }|sR| j                  j                  d|› d�|t        j                  ¬«       t        t        t        j                  «      «      }|j                  |«       t        |t        «      r�Œ|j                  |«       �Œ t!        |j"                  D �cg c]  }|t$        t&        fv sŒ|‘Œ c}«      }t!        |«      |k  r| j                  j)                  |«       |S c c}w )z‚Find replacement expression for every specifier in str.format() call.

        In case of an error use TempNode(AnyType).
        z8Cannot find replacement for positional format specifier r•   z4Cannot find replacement for named format specifier "rÅ   )ÚsetÚ	isdecimalÚget_expr_by_positionrƒ   r£   rœ   r�   rž   r    r%   r*   Ú
from_errorÚget_expr_by_namerŽ   rÏ   Úaddr¬   Ú	arg_kindsr   r   Ú$too_many_string_formatting_arguments)	rv   r¸   Úkeysr¥   Úusedrj   rÓ   ÚkindÚtotal_explicits	            rC   rË   z0StringFormatterChecker.find_replacements_in_callÄ  sQ  € ð
 $&ˆÜ #£ˆØó 	ˆCØ�}‰}ŒØ×0Ñ0´°S³¸4Ó@�ÙØ—H‘H—M‘MØRÐSVÐRWÐXØÜ"×4Ñ4ð "ô ô
 $¤G¬I×,@Ñ,@Ó$AÓB‘Dà×,Ñ,¨S°$Ó7�ÙØ—H‘H—M‘MØNÈsÈeÐSTÐUØÜ"×4Ñ4ð "ô ô
 $¤G¬I×,@Ñ,@Ó$AÓB�DØ�M‰M˜$ÔÜ˜d¤HÖ-Ø—‘˜–ð+	ô0 ¨t¯~©~Ö^ tÀÌ'ÔS\ÐI]ÒA]šdÒ^Ó_ˆÜˆt‹9�~Ò%Ø�H‰H×9Ñ9¸$Ô?Øˆùò _s   ÅFÅFc                óâ  — t        |j                  |j                  «      D ��cg c]  \  }}|t        k(  sŒ|‘Œ }}}|t	        |«      k  r||   S t        |j                  |j                  «      D ��cg c]  \  }}|t
        k(  sŒ|‘Œ }}}|sy|d   }t        | j                  j                  |«      «      }t        |t        «      r|j                  j                  d«      s"t        t        t        j                   «      «      S | j                  j#                  dt        t        j                   «      g«      j                  }	t        t%        ||	«      j                  d   «      S c c}}w c c}}w )zÁGet positional replacement expression from '{0}, {1}'.format(x, y, ...) call.

        If the type is from *args, return TempNode(<item type>). Return None in case of
        an error.
        Nr   ztyping.Sequence)rÍ   Úargsrô   r   r¬   r   r0   r³   rÐ   rÏ   r&   rk   Úhas_baser    r%   r*   rÑ   Únamed_generic_typer   )
rv   r®   r¸   Úargrø   Úpos_argsÚ	star_argsÚstar_argÚvarargs_typeÚ	iter_infos
             rC   rð   z+StringFormatterChecker.get_expr_by_positionè  s3  € ô *-¨T¯Y©Y¸¿¹Ó)G×[™I˜C È4ÔSZË?’CÐ[ˆÑ[Ø”�X“ÒØ˜C‘=Ð Ü*-¨d¯i©i¸¿¹Ó*H×]™Y˜S $ÈDÔT\ÓL\’SÐ]ˆ	Ñ]ÙØð ˜Q‘<ˆÜ& t§x¡x×';Ñ';¸HÓ'EÓFˆÜ˜,¬Ô1¸×9JÑ9J×9SÑ9SØô:
ô œG¤I×$:Ñ$:Ó;Ó<Ð<Ø—H‘H×/Ñ/Ø¤¬	×(>Ñ(>Ó ?Ð@ó
ç
‰$ð 	ô Ô1°,À	ÓJ×OÑOÐPQÑRÓSÐSùó% \ùó ^s   ¤E%¶E%Á3E+ÂE+c                óö  — t        |j                  |j                  |j                  «      D ���cg c]  \  }}}|t        k(  r||k(  r|‘Œ }}}}|r|d   S t        |j                  |j                  «      D ��cg c]  \  }}|t
        k(  sŒ|‘Œ }}}|sy|d   }t        | j                  j                  |«      «      }	t        |	t        «      r|	j                  j                  d«      s"t        t        t        j                   «      «      S t        t        j                   «      }
| j                  j#                  d|
|
g«      j                  }t        t%        |	|«      j                  d   «      S c c}}}w c c}}w )z¼Get named replacement expression from '{name}'.format(name=...) call.

        If the type is from **kwargs, return TempNode(<item type>). Return None in case of
        an error.
        r   Nztyping.Mappingr«   )rÍ   rû   rô   Ú	arg_namesr   r   r0   r³   rÐ   rÏ   r&   rk   rü   r    r%   r*   rÑ   rý   r   )rv   rj   r¸   rþ   rø   ÚnameÚ
named_argsÚstar_args_2Ú
star_arg_2Úkwargs_typeÚany_typeÚmapping_infos               rC   rò   z'StringFormatterChecker.get_expr_by_name  sI  € ô $' t§y¡y°$·.±.À$Ç.Á.Ó#Q÷
ð 
á��T˜4Ø”yÒ  T¨S¢[ò ð
ˆ
ò 
ñ
 Ø˜a‘=Ð Ü,/°·	±	¸4¿>¹>Ó,J×`™y˜s DÈdÔV_ÓN_’sÐ`ˆÑ`ÙØØ  ‘^ˆ
Ü% d§h¡h×&:Ñ&:¸:Ó&FÓGˆÜ˜+¤xÔ0¸×8HÑ8H×8QÑ8QØô9
ô œG¤I×$:Ñ$:Ó;Ó<Ð<Üœ9×1Ñ1Ó2ˆØ—x‘x×2Ñ2Ð3CÀhÐPXÐEYÓZ×_Ñ_ˆÜÔ1°+¸|ÓL×QÑQÐRSÑTÓUÐUùô'
ùó as   °E.Á9E5ÂE5c                ó^  — t        d„ |D «       «      }t        d„ |D «       «      }|r/|s-| j                  j                  d|t        j
                  ¬«       y|ryd}|D ]N  }|j                  rŒt        |«      }||_        |j                  s||_        n||j                  z   |_        |dz  }ŒP y)	z•Translate '{} {name} {}' to '{0} {name} {1}'.

        Return True if generation was successful, otherwise report an error and return false.
        c              3  ól   K  — | ],  }|j                   xr |j                   j                  «       –— Œ. y ­wr{   )rj   rï   r½   s     rC   rÀ   z<StringFormatterChecker.auto_generate_keys.<locals>.<genexpr>"  s'   è ø€ ÒJ¸1˜1Ÿ5™5Ò6 Q§U¡U§_¡_Ó%6Ó6ÑJùs   ‚24c              3  óF   K  — | ]  }t        |j                  «      –— Œ y ­wr{   )r„   rj   r½   s     rC   rÀ   z<StringFormatterChecker.auto_generate_keys.<locals>.<genexpr>#  s   è ø€ Ò9¨!œ$˜qŸu™uŸ+Ñ9ùs   ‚!zGCannot combine automatic field numbering and manual field specificationr•   FTr   r«   )	ÚanyrÊ   r£   rœ   r�   rž   rj   rÌ   rH   )rv   Ú	all_specsr¢   Úsome_definedÚall_definedÚ
next_indexrÛ   Ú	str_indexs           rC   r¶   z)StringFormatterChecker.auto_generate_keys  s¯   € ô
 ÑJÀ	ÔJÓJˆÜÑ9¨yÔ9Ó9ˆÙ¡Ø�H‰H�M‰MØYØÜ×,Ñ,ð ô ð
 ÙØØˆ
Øò 		 ˆDØ—8“8Ü 
›O�	Ø$�”à—z’zØ!*�D•Jà!*¨T¯Z©ZÑ!7�D”JØ˜a‘‘
ð		 ð rE   c                óª  — |j                   sJ d«       ‚|j                  |j                   k(  r|S |j                  sJ ‚t        | j                  j                  «      }t
        |j                  t        |j                   «      d z   }t        |dd| j                  j                  |d¬«      }|j                  «       r\| j                  j                  d|j                  › d�|t        j                  ¬«       t        t        t        j                   «      «      S t#        |t$        «      sJ ‚|j&                  d	   }t#        |t(        «      sJ ‚|j*                  }| j-                  ||||¬
«      s"t        t        t        j                   «      «      S |j.                  |_        |j0                  |_        | j                  j2                  j5                  |«       |S )z”Transform and validate expr in '{.attr[item]}'.format(expr) into expr.attr['item'].

        If validation fails, return TempNode(AnyType).
        rÁ   Nz<format>T)ÚfnamÚmoduleÚoptionsÚerrorsÚeagerz"Syntax error in format specifier "rÅ   r•   r   rÂ   )rj   rH   r   r³   r  rS   r¬   r"   Ú	is_errorsr£   rœ   r�   rž   r    r%   r*   rñ   rÏ   r   Údefsr   rÓ   Ú validate_and_transform_accessorsÚlineÚcolumnÚexpr_checkerÚaccept)rv   rÛ   rÜ   r¢   Útemp_errorsÚdummyÚtemp_asts          rC   rÎ   z,StringFormatterChecker.apply_field_accessors:  s€  € ð �xŠxÐ=Ð=Ó=ˆxØ�:‰:˜Ÿ™Ò!ØˆKØ�zŠzÐˆzä˜TŸX™X×-Ñ-Ó.ˆÜ  4§:¡:¬c°$·(±(«m¨oÐ#>Ñ>ˆÜØØØØ—H‘H×$Ñ$ØØô
ˆð × Ñ Ô"Ø�H‰H�M‰MØ4°T·Z±Z°LÀÐBØÜ×,Ñ,ð ô ô
 œG¤I×$8Ñ$8Ó9Ó:Ð:ô ˜(¤HÔ-Ð-Ð-Ø—=‘= Ñ#ˆÜ˜(¤NÔ3Ð3Ð3Ø—=‘=ˆØ×4Ñ4°X¸tÀTÈsÐ4ÔSÜœG¤I×$8Ñ$8Ó9Ó:Ð:ð Ÿ™ˆŒØŸ*™*ˆŒØ�‰×Ñ×$Ñ$ XÔ.ØˆrE   c                óæ  — t        |t        t        f«      sF| j                  j	                  dj                  |j                  «      |t        j                  ¬«       yt        |t        «      r|j                  }nç|j                  }t        |j                  t        t        f«      s}|j                  sJ d«       ‚|j                  sJ ‚| j                  j	                  dj                  |j                  t        |j                  «      d «      |t        j                  ¬«       yt        |j                  t        «      r$t!        |j                  j"                  «      |_        t        |t        «      rK|j"                  t$        k(  r8t        |t        t        f«      sJ ‚t        |t        «      r||_
        y||_	        y|j&                  |_        |j(                  |_        | j+                  ||||¬«      S )	aË  Validate and transform (in-place) format field accessors.

        On error, report it and return False. The transformations include replacing the dummy
        variable with actual replacement expression and translating any name expressions in an
        index into strings, so that this will work:

            class User(TypedDict):
                name: str
                id: int
            u: User
            '{[id]:d} -> {[name]}'.format(u)
        zQOnly index and member expressions are allowed in format field accessors; got "{}"r•   Fz1Call this method only after auto-generating keys!z6Invalid index expression in format field accessor "{}"NT)Úoriginal_replrÛ   r¢   )rÏ   r   r   r£   rœ   ÚformatrH   r�   rž   rÓ   ÚbaseÚindexr   r   rj   r¬   r   r  rS   r  r   r  )rv   r%  r'  rÛ   r¢   Únodes         rC   r  z7StringFormatterChecker.validate_and_transform_accessorsg  s�  € ô& ˜(¤Z´Ð$;Ô<Ø�H‰H�M‰Mð4ß4:±F¸4¿:¹:Ó4FØÜ×,Ñ,ð	 ô ð Ü�h¤
Ô+Ø—=‘=‰Dà—=‘=ˆDÜ˜hŸn™n¬x¼Ð.AÔBØ—x’xÐTÐ!TÓT�xØ—z’zÐ!�zØ—‘—‘ØL×SÑSØŸ
™
¤3 t§x¡x£= ?Ð3óð Ü×0Ñ0ð ô ð Ü˜(Ÿ.™.¬(Ô3Ü!(¨¯©×)<Ñ)<Ó!=�”Ü�dœHÔ%¨$¯)©)Ô7GÒ*Gä˜h¬´JÐ(?Ô@Ð@Ð@Ü˜(¤IÔ.Ø -�”ð ð !.�”ØØ—H‘HˆŒ	Ø—j‘jˆŒØ×4Ñ4Ø °D¸cð 5ó 
ð 	
rE   c                óz  — | j                   j                  j                  |«       t        |j                  «      }| j                  ||«      }|€n)|r| j                  |||«       n| j                  |||«       t        |t        «      r| j                  d«      S t        |t        «      r| j                  d«      S J ‚)zpCheck the types of the 'replacements' in a string interpolation
        expression: str % replacements.
        râ   rÉ   )r³   r!  r"  r“   ræ   Úanalyze_conversion_specifiersÚcheck_mapping_str_interpolationÚcheck_simple_str_interpolationrÏ   r   rÕ   r   )rv   rÓ   rÚ   r‘   Úhas_mapping_keyss        rC   Úcheck_str_interpolationz.StringFormatterChecker.check_str_interpolation£  s¥   € ð 	�‰×Ñ×$Ñ$ TÔ*Ü0°·±Ó<ˆ
Ø×=Ñ=¸jÈ$ÓOÐØÐ#ØÙØ×0Ñ0°¸\È4ÕPà×/Ñ/°
¸LÈ$ÔOä�dœIÔ&Ø—?‘?Ð#3Ó4Ð4Ü˜œgÔ&Ø—?‘? >Ó2Ð2à�5rE   c                óò   — t        d„ |D «       «      }t        d„ |D «       «      }t        d„ |D «       «      }|r|r| j                  j                  |«       y |r|s| j                  j	                  |«       y |S )Nc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr{   )r�   ©r¾   Ú	specifiers     rC   rÀ   zGStringFormatterChecker.analyze_conversion_specifiers.<locals>.<genexpr>»  s   è ø€ ÒH°	�y×)Ñ)×+ÑHùó   ‚c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr{   )r~   r4  s     rC   rÀ   zGStringFormatterChecker.analyze_conversion_specifiers.<locals>.<genexpr>¼  s   è ø€ ÒF¨i�i×'Ñ'×)ÑFùr6  c              3  ó^   K  — | ]%  }|j                  «       xs |j                  d k(  –— Œ' y­w)r8   N)r~   rL   r4  s     rC   rÀ   zGStringFormatterChecker.analyze_conversion_specifiers.<locals>.<genexpr>½  s1   è ø€ ò 
ØBKˆI×ÑÓÒ= 9×#6Ñ#6¸#Ñ#=Ó=ñ
ùs   ‚+-)r  rÊ   r£   Ú&string_interpolation_with_star_and_keyÚ,string_interpolation_mixing_key_and_non_keys)rv   r‘   Úcontextr�   r~   Úall_have_keyss         rC   r-  z4StringFormatterChecker.analyze_conversion_specifiers¸  sv   € ô ÑH¸ZÔHÓHˆÜÑF¸:ÔFÓFˆÜñ 
ØOYô
ó 
ˆñ ‘xØ�H‰H×;Ñ;¸GÔDØÙ™=Ø�H‰H×AÑAÀ'ÔJØØˆrE   c                óˆ  — | j                  |||«      }|€yt        | j                  |«      «      }g }t        |t        «      rß|j
                  }t        |«      }|��tt        dt        |«      t        |«      z
  dz   «      }||   }	t        |	t        «      sJ ‚t        |	j                  «      }	t        |	t        «      rt        |	j                  «      }	t        |	t        «      r|	j                  j                  dk(  sJ ‚|	j                  d   g|z  }
|d| |
z   ||dz   d z   }n¯t        |t         «      ryt        |t        «      r6|j                  j                  dk(  r|j                  d   gt        |«      z  }nXt        |t"        «      rE|j%                  «       D ]1  }t'        |«      }|j(                  |_        | j+                  |||«       Œ3 y|g}t        |«      t        |«      kD  rRt-        || j.                  j1                  d«      «      rt        |t        «      sy| j2                  j5                  |«       yt        |«      t        |«      k  r| j2                  j7                  |«       yt        |«      dk(  rO|d   \  }}t        |t        «      r.t        |j
                  «      dk(  r ||j
                  d   «       y ||«       yt        |t8        «      rHt;        d„ |j
                  D «       «      s,t=        ||j
                  «      D ]  \  }}|\  }} ||«       Œ yt=        ||«      D ]  \  }}|\  }} ||«       Œ y)zOCheck % string interpolation with positional specifiers '%s, %d' % ('yes, 42').Nr   r«   zbuiltins.tupleztyping.Iterablec              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr{   )rÏ   r   )r¾   Úitems     rC   rÀ   zHStringFormatterChecker.check_simple_str_interpolation.<locals>.<genexpr>  s   è ø€ ò AØ/3”
˜4¤×*ñAùr6  )Úbuild_replacement_checkersr0   r"  rÏ   r(   rÖ   r/   Úmaxr¬   r.   rk   r+   Úupper_boundr&   Úfullnamerû   r%   r-   Úrelevant_itemsr    r  r/  r#   r³   rÕ   r£   Ú#too_few_string_formatting_argumentsrõ   r!   r  rÍ   )rv   r‘   rÚ   rÓ   ÚcheckersÚrhs_typeÚ	rep_typesÚunpack_indexÚextrasÚunpackedÚunpack_itemsÚtypÚ	temp_nodeÚ
check_nodeÚ
check_typeÚchecksÚrep_nodeÚrep_types                     rC   r/  z5StringFormatterChecker.check_simple_str_interpolationÉ  s  € ð ×2Ñ2°:¸|ÈTÓRˆØÐØä" 4§;¡;¨|Ó#<Ó=ˆØ "ˆ	Ü�h¤	Ô*Ø Ÿ™ˆIÜ.¨yÓ9ˆLØÑ'ô ˜Q¤ H£´°I³Ñ >ÀÑ BÓC�Ø$ \Ñ2�Ü! (¬JÔ7Ð7Ð7Ü*¨8¯=©=Ó9�Ü˜hÔ(8Ô9Ü.¨x×/CÑ/CÓD�Hä˜x¬Ô2°x·}±}×7MÑ7MÐQaÒ7aðØaà (§¡¨aÑ 0Ð1°FÑ:�Ø% m |Ð4°|ÑCÀiÐP\Ð_`ÑP`ÐPbÐFcÑc‘	Ü˜¤'Ô*ØÜ˜¤(Ô+°·±×0FÑ0FÐJZÒ0Zà!Ÿ™ qÑ)Ð*¬S°«]Ñ:‰IÜ˜¤)Ô,Ø×.Ñ.Ó0ò Q�Ü$ S›M�	Ø!-×!2Ñ!2�	”Ø×3Ñ3°JÀ	È4ÕPðQð à!˜
ˆIäˆx‹=œ3˜y›>Ò)ä˜( D§H¡H×$7Ñ$7Ð8IÓ$JÔKÔT^Øœ)ôUð à—‘×<Ñ<¸\ÕJÜ�‹]œS ›^Ò+Ø�H‰H×9Ñ9¸,ÕGä�8‹} Ò!Ø)1°!©Ñ&�
˜JÜ˜h¬	Ô2´s¸8¿>¹>Ó7JÈaÒ7OÙ˜xŸ~™~¨aÑ0Õ1á˜|Õ,Ü˜L¬)Ô4¼Sñ AØ7C×7IÑ7IôAô >ô ),¨H°l×6HÑ6HÓ(Iò )Ñ$�F˜HØ-3Ñ*�J 
Ù˜xÕ(ñ)ô ),¨H°iÓ(@ò )Ñ$�F˜HØ-3Ñ*�J 
Ù˜xÕ(ñ)rE   c                óV  — t        |t        «      �r¸t        d„ |j                  D «       «      �r›i }|j                  D ]  \  }}t        |t        «      r<t        |t        «      s,| j
                  j                  d|t        j                  ¬«       t        t        |«      j                  }| j                  |«      ||<   Œ� |D �]  }|j                  dk(  rŒ|j                  €J ‚|j                  |vr(| j
                  j                  |j                  |«        y||j                     }	|j                  €J ‚| j!                  |j                  ||«      }
|
€ y| j"                  j%                  |	|
|t&        j(                  dd|j                  › d�t        j                  ¬«       |j                  d	k(  sŒò| j+                  ||	|«       �Œ y| j                  |«      }	| j-                  |«      }| j"                  j%                  |	||t&        j.                  dd
t        j                  ¬«       y)zQCheck % string interpolation with names specifiers '%(name)s' % {'name': 'John'}.c              3  óN   K  — | ]  \  }}t        |t        t        f«      –— Œ y ­wr{   )rÏ   r   r   )r¾   ÚkÚvs      rC   rÀ   zIStringFormatterChecker.check_mapping_str_interpolation.<locals>.<genexpr>  s%   è ø€ ò 6
Ù48°A°qŒJ�qœ7¤IÐ.×/ñ6
ùs   ‚#%z>Dictionary keys in bytes formatting must be bytes, not stringsr•   r8   Núexpression has typezplaceholder with key 'z
' has typer¿   zexpected type for mapping is)rÏ   r   rÊ   rÖ   r   r£   rœ   r�   rž   r	   r3   ræ   r"  rL   rj   Úkey_not_in_mappingrÔ   r³   Úcheck_subtyper
   Ú'INCOMPATIBLE_TYPES_IN_STR_INTERPOLATIONÚcheck_s_special_casesÚbuild_dict_typeÚFORMAT_REQUIRES_MAPPING)rv   r‘   rÚ   rÓ   ÚmappingrV  rW  Úkey_strr5  rS  rÞ   Ú	dict_types               rC   r.  z6StringFormatterChecker.check_mapping_str_interpolation  s  € ô �l¤HÕ-´#ñ 6
Ø<H×<NÑ<Nô6
õ 3
ð (*ˆGØ$×*Ñ*ò 
2‘��1Ü˜d¤IÔ.ä% a¬Ô3ØŸ™Ÿ™Ø\Ø Ü!&×!8Ñ!8ð &ô ô
 Ô/°Ó3×9Ñ9�Ø#'§;¡;¨q£>�˜Ò ð
2ð (ó E�	Ø×&Ñ&¨#Ò-àØ —}‘}Ð0Ð0Ð0Ø—=‘=¨Ñ/Ø—H‘H×/Ñ/°	·±¸|ÔLÙØ" 9§=¡=Ñ1�Ø ×*Ñ*Ð6Ð6Ð6Ø $× 4Ñ 4°Y×5HÑ5HÈ,ÐX\Ó ]�Ø Ð(ÙØ—‘×&Ñ&ØØ!Ø Ü$×LÑLØ)Ø,¨Y¯]©]¨O¸:ÐFÜ×0Ñ0ð 'ô ð ×&Ñ&¨#Ó-Ø×.Ñ.¨t°X¸tÖDñ/Eð2 —{‘{ <Ó0ˆHØ×,Ñ,¨TÓ2ˆIØ�H‰H×"Ñ"ØØØÜ ×8Ñ8Ø%Ø.Ü×,Ñ,ð #õ rE   c                ój  — t        t        j                  «      }t        |t        «      r:| j
                  j                  dg «      }| j
                  j                  d||g«      S t        |t        «      r:| j
                  j                  dg «      }| j
                  j                  d||g«      S J d«       ‚)z>Build expected mapping type for right operand in % formatting.râ   z _typeshed.SupportsKeysAndGetItemrÉ   ÚUnreachable)r%   r*   rÑ   rÏ   r   r³   rý   r   )rv   rÓ   r  Ú
bytes_typeÚstr_types        rC   r]  z&StringFormatterChecker.build_dict_typeN  s£   € äœ9×1Ñ1Ó2ˆÜ�dœIÔ&ØŸ™×4Ñ4Ð5EÀrÓJˆJØ—8‘8×.Ñ.Ø2°ZÀÐ4Jóð ô ˜œgÔ&Ø—x‘x×2Ñ2°>À2ÓFˆHØ—8‘8×.Ñ.Ø2°X¸xÐ4Hóð ð (˜-Ó'�5rE   c                óh   — g }|D ]*  }| j                  |||«      }|€ y |j                  |«       Œ, |S r{   )Úreplacement_checkersr    )rv   r‘   r;  rÓ   rF  r5  Úcheckers          rC   r@  z1StringFormatterChecker.build_replacement_checkers^  sG   € ð $&ˆØ#ò 	%ˆIØ×/Ñ/°	¸7ÀDÓIˆGØˆÙØ�O‰O˜GÕ$ð		%ð
 ˆrE   c                óâ  — g }|j                   dk(  r |j                  | j                  |«      «       |j                  dk(  r |j                  | j                  |«      «       |j                  dk(  r3| j                  |j                  ||«      }|€y|j                  |«       |S |j                  �@|j                  dk7  r1| j                  |j                  ||«      }|€y|j                  |«       |S )a  Returns a list of tuples of two functions that check whether a replacement is
        of the right type for the specifier. The first function takes a node and checks
        its type in the right type context. The second function just checks a type.
        r€   r°   Nr8   )rn   rŽ   Úcheckers_for_starro   rL   Úcheckers_for_c_typeÚcheckers_for_regular_type)rv   r5  r;  rÓ   rF  r°   s         rC   rg  z+StringFormatterChecker.replacement_checkersi  sâ   € ð $&ˆà�?‰?˜cÒ!Ø�O‰O˜D×2Ñ2°7Ó;Ô<Ø×Ñ #Ò%Ø�O‰O˜D×2Ñ2°7Ó;Ô<à×Ñ #Ò%Ø×(Ñ(¨×)<Ñ)<¸gÀtÓLˆAØˆyØØ�O‰O˜AÔð ˆð × Ñ Ð,°×1DÑ1DÈÒ1KØ×.Ñ.¨y×/BÑ/BÀGÈTÓRˆAØˆyØØ�O‰O˜AÔØˆrE   c                óR   ‡ ‡‡‡— ‰ j                  d«      Šdˆˆ fd„Šdˆˆˆ fd„}|‰fS )z›Returns a tuple of check functions that check whether, respectively,
        a node or a type is compatible with a star in a conversion specifier.
        rä   c                ó‚   •— ‰j                  d«      }‰j                  j                  | |‰dt        j                  ¬«      S )Nrä   z* wants intr•   )rÕ   r³   rZ  r�   rž   )rk   Úexpectedr;  rv   s     €€rC   rP  z<StringFormatterChecker.checkers_for_star.<locals>.check_type‰  s>   ø€ Ø—‘ ~Ó6ˆHØ—8‘8×)Ñ)Ø�h ¨¼U×=TÑ=Tð *ó ð rE   c                ó:   •— ‰j                  | ‰«      } ‰|«       y r{   ©r"  )rÓ   rk   rP  ro  rv   s     €€€rC   Ú
check_exprz<StringFormatterChecker.checkers_for_star.<locals>.check_expr�  s   ø€ Ø—;‘;˜t XÓ.ˆDÙ�tÕrE   ©rk   r)   r…   r„   ©rÓ   r   r…   r†   )rÕ   )rv   r;  rr  rP  ro  s   `` @@rC   rj  z(StringFormatterChecker.checkers_for_starƒ  s*   û€ ð —?‘? >Ó2ˆö	÷	ð ˜:Ð%Ð%rE   c           	     ó~   — | j                   j                  |||t        j                  ddt        j
                  ¬«      S )NrX  zplaceholder has typer•   )r³   rZ  r
   r[  r�   rž   )rv   rM  rÞ   r;  s       rC   r×   z-StringFormatterChecker.check_placeholder_type•  s?   € Ø�x‰x×%Ñ%ØØØÜ×DÑDØ!Ø"Ü×(Ñ(ð &ó 
ð 	
rE   c                óf   ‡ ‡‡‡‡‡— ‰ j                  ‰‰‰«      Š‰€ydˆˆˆˆˆ fd„Šdˆˆˆ fd„}|‰fS )z¢Returns a tuple of check functions that check whether, respectively,
        a node or a type is compatible with 'type'. Return None in case of an error.
        Nc                ój   •— ‰€J ‚‰j                  | ‰‰«      }|r‰dk(  r‰j                  ‰| ‰«      }|S )Nr¿   )r×   r\  )rM  Úretr;  rL   rÞ   rÓ   rv   s     €€€€€rC   rP  zDStringFormatterChecker.checkers_for_regular_type.<locals>.check_typeª  sF   ø€ Ø Ð,Ð,Ð,Ø×-Ñ-¨c°=À'ÓJˆCÙ�y CÒ'Ø×0Ñ0°°s¸GÓD�ØˆJrE   c                ó:   •— ‰j                  | ‰«      } ‰|«       y r{   rq  )rÓ   rk   rP  rÞ   rv   s     €€€rC   rr  zDStringFormatterChecker.checkers_for_regular_type.<locals>.check_expr±  s   ø€ Ø—;‘;˜t ]Ó3ˆDÙ�tÕrE   )rM  r)   r…   r„   rt  ©rÔ   )rv   rL   r;  rÓ   rr  rP  rÞ   s   ```` @@rC   rl  z0StringFormatterChecker.checkers_for_regular_type   s>   ý€ ð ×,Ñ,¨Y¸ÀÓFˆØÐ Ø÷	ñ 	÷	ð ˜:Ð%Ð%rE   c                ó(  — t        |t        «      r9t        |d«      r-| j                  j	                  d|t
        j                  ¬«       yt        |t        «      r9t        |d«      r-| j                  j	                  d|t
        j                  ¬«       yy)z;Additional special cases for %s in bytes vs string context.râ   zIf x = b'abc' then "%s" % x produces "b'abc'", not "abc". If this is desired behavior use "%r" % x. Otherwise, decode the bytesr•   FrÉ   z,On Python 3 b'%s' requires bytes, not stringT)	rÏ   r   ré   r£   rœ   r�   rê   r   rž   )rv   rÓ   rM  r;  s       rC   r\  z,StringFormatterChecker.check_s_special_cases·  sƒ   € ä�dœGÔ$ä! #Ð'7Ô8Ø—‘—‘ð\àÜ×,Ñ,ð	 ô ð Ü�dœIÔ&ä! # ~Ô6Ø—‘—‘ØBØÜ×0Ñ0ð ô ð
 ØrE   c                óf   ‡ ‡‡‡‡— ‰ j                  |‰‰«      Š‰€ydˆˆˆˆ fd„Šdˆˆˆˆˆ fd„}|‰fS )zšReturns a tuple of check functions that check whether, respectively,
        a node or a type is compatible with 'type' that is a character type.
        Nc                ó”   •— ‰€J ‚t        ‰t        «      rd}nd}‰j                  j                  | ‰‰|dt        j
                  ¬«      S )Nz7"%c" requires an integer in range(256) or a single bytez"%c" requires int or charrX  r•   )rÏ   r   r³   rZ  r�   rž   )rk   Úerr_msgr;  rÞ   Úformat_exprrv   s     €€€€rC   rP  z>StringFormatterChecker.checkers_for_c_type.<locals>.check_typeØ  sW   ø€ Ø Ð,Ð,Ð,Ü˜+¤yÔ1ØS‘à5�Ø—8‘8×)Ñ)ØØØØØ%Ü×,Ñ,ð *ó ð rE   c                óz  •— ‰j                  | ‰«      } ‰|«      r t        ‰t        «      rDt        | t        «      r4t        | j                  «      dk7  r‰j
                  j                  ‰«       yt        | t        t        f«      r5t        | j                  «      dk7  r‰j
                  j                  ‰«       yyyy)zint, or str with length 1r«   N)	r"  rÏ   r   r¬   ræ   r£   Úrequires_int_or_single_byter   rç   )rÓ   rk   rP  r;  rÞ   r  rv   s     €€€€€rC   rr  z>StringFormatterChecker.checkers_for_c_type.<locals>.check_exprç  s•   ø€ à—;‘;˜t ]Ó3ˆDñ ˜$Ôô ˜{¬IÔ6Ü" 4¬Ô3Ü˜DŸJ™J›¨1Ò,à—H‘H×8Ñ8¸ÕAÜ ¤w´	Ð&:Ô;ÄÀDÇJÁJÃÐSTÒ@TØ—H‘H×1Ñ1°'Õ:ð AUÐ;ð  rE   rs  rt  rz  )rv   rk   r;  r  rr  rP  rÞ   s   ` `` @@rC   rk  z*StringFormatterChecker.checkers_for_c_typeÎ  sC   ü€ ð ×,Ñ,¨T°7¸KÓHˆØÐ Ø÷	ð 	÷	;ñ 	;ð  ˜:Ð%Ð%rE   c                ó¢  — |rt         nt        }|rt        nt        }|dk(  rP|sNt	        |t
        «      s-| j                  j                  d|t        j                  ¬«       y| j                  d«      S |dk(  rt        t        j                  «      S |dv rt        t        j                  «      S ||v r™||v r| j                  d«      g}nm| j                  d«      | j                  d	«      g}|sI|t        v r!|j                  | j                  d
«      «       n |j                  | j                  d«      «       t!        j"                  |«      S |dv rft	        |t
        «      r+t!        | j                  d«      | j                  d«      g«      S t!        | j                  d«      | j                  d«      g«      S | j                  j%                  ||«       y)a�  Return the type that is accepted for a string interpolation conversion specifier type.

        Note that both Python's float (e.g. %f) and integer (e.g. %d)
        specifier types accept both float and integers.

        The 'format_call' argument indicates whether this type came from % interpolation or from
        a str.format() call, the meaning of few formatting types are different.
        ra   z8Format character "b" is only supported on bytes patternsr•   Nrâ   Úa)r¿   Úrrä   rå   ztyping.SupportsFloatztyping.SupportsInt)r°   rÉ   )rc   r`   re   rd   rÏ   r   r£   rœ   r�   rž   rÕ   r%   r*   rÑ   rf   rŽ   r-   Ú
make_unionÚunsupported_placeholder)rv   Úpr;  rÓ   rÇ   ÚNUMERIC_TYPESÚ	INT_TYPESrì   s           rC   rÔ   z&StringFormatterChecker.conversion_typeù  sŸ  € ñ .9Õ)Ô>OˆÙ'2•O¼ˆ	Ø�Š8™KÜ˜d¤IÔ.Ø—‘—‘ØNØÜ×0Ñ0ð ô ð
 Ø—?‘?Ð#3Ó4Ð4Ø�#ŠXäœ9×1Ñ1Ó2Ð2Ø�*‰_Üœ9×1Ñ1Ó2Ð2Ø�-ÑØ�I‰~Ø!%§¡°Ó!@Ð A‘ð —O‘O NÓ3Ø—O‘OÐ$4Ó5ð!�ñ #ØœKÑ'Ø%×,Ñ,¨T¯_©_Ð=SÓ-TÕUà%×,Ñ,¨T¯_©_Ð=QÓ-RÔSÜ×'Ñ'¨Ó6Ð6Ø�%‰ZÜ˜$¤	Ô*Ü Ø—_‘_ ^Ó4°d·o±oÐFVÓ6WÐXóð ô !Ø—_‘_ ^Ó4°d·o±oÀnÓ6UÐVóð ð �H‰H×,Ñ,¨Q°Ô8ØrE   c                ó8   — | j                   j                  |«      S )z}Return an instance type with type given by the name and no type
        arguments. Alias for TypeChecker.named_type.
        )r³   rÕ   )rv   r  s     rC   rÕ   z!StringFormatterChecker.named_type3  s   € ð �x‰x×"Ñ" 4Ó(Ð(rE   Nc                óN   — | j                   j                  j                  ||«      S )z0Type check a node. Alias for TypeChecker.accept.)r³   r!  r"  )rv   rÓ   r;  s      rC   r"  zStringFormatterChecker.accept9  s   € à�x‰x×$Ñ$×+Ñ+¨D°'Ó:Ð:rE   )r³   r   r£   r   r…   r†   )r¸   r   r¡   rÌ   r…   r†   )r¸   r   rÙ   úlist[ConversionSpecifier]r¡   rÌ   r…   r†   )rÛ   rh   r¸   r   rÜ   r   rÝ   r)   rÞ   r)   r…   r†   )r¸   r   rö   z	list[str]r…   zlist[Expression])r®   rƒ   r¸   r   r…   úExpression | None)rj   rÌ   r¸   r   r…   r�  )r  rŒ  r¢   r   r…   r„   )rÛ   rh   rÜ   r   r¢   r   r…   r   )
r%  r   r'  r   rÛ   rh   r¢   r   r…   r„   )rÓ   r3   rÚ   r   r…   r)   )r‘   rŒ  r;  r   r…   zbool | None)r‘   rŒ  rÚ   r   rÓ   r3   r…   r†   )rÓ   r3   r…   r)   )r‘   rŒ  r;  r   rÓ   r3   r…   úlist[Checkers] | None)r5  rh   r;  r   rÓ   r3   r…   rŽ  )r;  r   r…   r4   )rM  r)   rÞ   r)   r;  r   r…   r„   )rL   rÌ   r;  r   rÓ   r3   r…   úCheckers | None)rÓ   r3   rM  r)   r;  r   r…   r„   )rk   rÌ   r;  r   r  r3   r…   r�  ©F)
r‡  rÌ   r;  r   rÓ   r3   rÇ   r„   r…   úType | None)r  rÌ   r…   r&   r{   )rÓ   r   r;  r‘  r…   r)   )r‡   rˆ   r‰   Ú__doc__Ú__annotations__ry   rº   r·   rØ   rË   rð   rò   r¶   rÎ   r  r1  r-  r/  r.  r]  r@  rg  rj  r×   rl  r\  rk  rÔ   rÕ   r"  rŠ   rE   rC   r²   r²   !  sj  … ñð 
Óà	Óóó
Hð8G\ØðG\Ø%>ðG\ØNQðG\à	óG\ðR,à!ð,ð ð,ð ð	,ð
 ð,ð ð,ð 
ó,ó\"óHTó4Vó6ð:+Ø'ð+Ø/9ð+Ø@Gð+à	ó+ðZ8
àð8
ð "ð8
ð "ð	8
ð
 ð8
ð 
ó8
óxð*Ø3ðØ>Eðà	óð"G)à-ðG)ð !ðG)ð ð	G)ð
 
óG)ðR:à-ð:ð !ð:ð ð	:ð
 
ó:óx(ð 	Ø3ð	Ø>Eð	ØM]ð	à	ó	ðØ,ðØ7>ðØFVðà	óó4&ó$	
ð&Øð&Ø'.ð&Ø6Fð&à	ó&ó.ð.)&Øð)&Ø")ð)&Ø8Hð)&à	ó)&ðX UZð4Øð4Ø&ð4Ø.>ð4ØMQð4à	ó4ót)õ;rE   r²   c                ób  ‡— t        | «      } t        | t        «      r| j                  j	                  ‰«      S t        | t
        «      r6t        | j                  ‰«      xs t        ˆfd„| j                  D «       «      S t        | t        «      r"t        ˆfd„| j                  «       D «       «      S y)aM  Is this a specific instance type, or a union that contains it?

    We use this ad-hoc function instead of a proper visitor or subtype check
    because some str vs bytes errors are strictly speaking not runtime errors,
    but rather highly counter-intuitive behavior. This is similar to what is used for
    --strict-equality.
    c              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wr{   ©ré   )r¾   rW  rC  s     €rC   rÀ   z%has_type_component.<locals>.<genexpr>J  s    øè ø€ ò D
Ø01Ô˜q (×+ñD
ùó   ƒc              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wr{   r–  )r¾   ÚtrC  s     €rC   rÀ   z%has_type_component.<locals>.<genexpr>N  s   øè ø€ ÒQ°qÔ% a¨×2ÑQùr—  F)r0   rÏ   r&   rk   rü   r,   ré   rB  r  Úvaluesr-   rD  )rM  rC  s    `rC   ré   ré   >  s”   ø€ ô ˜#Ó
€CÜ�#”xÔ Ø�x‰x× Ñ  Ó*Ð*Ü	�CœÔ	%Ü! #§/¡/°8Ó<ò 
Äó D
Ø58·Z±ZôD
ó A
ð 	
ô 
�CœÔ	#ÜÓQ¸C×<NÑ<NÓ<PÔQÓQÐQØrE   )r…   úPattern[str])rG   r„   r…   r›  )r�   rÌ   r…   rŒ  r�  )
r¡   rÌ   r¢   r   r£   r   r™   r„   r…   z list[ConversionSpecifier] | None)r¡   rÌ   r¢   r   r£   r   r…   zlist[tuple[str, int]] | None)rM  r)   rC  rÌ   r…   r„   )\r’  Ú
__future__r   r:   Úcollections.abcr   r   r   Útypingr   r   r2   r	   Úmypy.errorcodesÚ
errorcodesr�   Úmypyr
   Úmypy.checker_sharedr   Úmypy.errorsr   Úmypy.maptyper   Úmypy.messagesr   Ú
mypy.nodesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   Ú
mypy.parser"   Úmypy.subtypesr#   Úmypy.typeopsr$   Ú
mypy.typesr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r3   r“  Útupler„   r4   Údictrƒ   rÌ   r5   rD   rN   rO   rP   rQ   rS   r`   rc   rd   re   rf   rh   r“   rŸ   rš   r²   ré   rŠ   rE   rC   ú<module>r­     sÆ  ðò
õ #ã 	Ý $ß ß 7Ñ 7å Ý !Ý 4Ý Ý 2Ý (÷÷ ÷ ÷ ÷ ñ õ* Ý $Ý .÷÷ ÷ õ ð   '¨Ñ2Ð �*Ó 2Ø˜X z l°DÐ&8Ñ9¸8ÀTÀFÈDÀLÑ;QÐQÑR€ˆ*Ó RØ˜E # s (™O¨U°3©ZÐ7Ñ8€ˆ*Ó 8ó!ó 8ñ@ %Ó&€	ˆ5Ó &Ù,¨UÓ3€ˆuÓ 3Ù3°DÓ9Ð �eÓ 9Ø*Ð �%Ó *ò XÐ �5Ó WÚ\Ð �5Ó \ò )€�Ó (Ú2€�Ó 2ò 4€ˆUÓ 3÷:ñ :ó@ð JOð5Øð5Ø#ð5Ø*8ð5ØBFð5à%ó5ðp6Øð6Ø#ð6Ø*8ð6à!ó6÷rZ;ñ Z;ôzrE   