
    X-PhƳ                       U d Z ddlmZ ddlZddlmZmZ ddlmZ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 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.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC e	e-e f         ZDdeEd<   eFee$gdf         ee;geGf         f         ZHdeEd<   eIeFeJeJf         eeK         f         ZLdeEd<   dCdZMdDdZN eM            ZOdeEd<    eNd          ZPdeEd<    eNd          ZQdeEd <   d!ZRdeEd"<   h d#ZSdeEd$<   h d%ZTdeEd&<   h d'ZUdeEd(<   h d)ZVdeEd*<   h d+ZWdeEd,<    G d- d.          ZXdEd2ZY	 dFdGd:ZZdHd<Z[ G d= d>          Z\dIdBZ]dS )Ja  
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)MatchPattern)CallableFinalUnioncast)	TypeAlias)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Node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MatchMapreturnPattern[str]c                 j    d} d}d}d}d}d}d| z   |z   |z   |z   |z   |z   }t          j        |          S )zConstruct 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          S/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mypy/checkstrformat.pycompile_format_rerH   H   sU     &F&H,H6LMGfx'(2\AMQT[[I:i       custom_specboolc                p    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+)?r;   z(?P<format_spec>:z)?z(?P<format_spec>:.*)?r=   )rJ   field
conversion
fill_alignnum_spec	conv_typeformat_specs          rG   compile_new_format_rerS   X   si     5E +J  /1
 V#	*Z7(BYNQVV /:ej(;6777rI   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>   rY   rZ   r[   r\   br]   r^   r_   r`   nrb   rd   r<   NUMERIC_TYPES_NEW>   r\   rb   rd   REQUIRE_INT_OLD>   r\   rf   r]   rb   rd   REQUIRE_INT_NEW>   rY   rZ   r[   r^   r_   r`   FLOAT_TYPESc                  *    e Zd Z	 dddZddZddZdS )ConversionSpecifierFmatch
Match[str]	start_posintnon_standard_format_specrK   r8   Nonec                $   |                                 | _        || _        |                                }|                    d          | _        |                    dd          | _        |                    dd          | _        |                    dd          | _        |                    dd          | _	        |                    d          | _
        || _        |                    d          | _        |                    d	          | _        d S )
Nkeytype flagswidth	precisionrR   rN   rM   )group	whole_seqrq   	groupdictgetrv   rQ   ry   rz   r{   rR   rs   rN   rM   )selfro   rq   rs   m_dicts        rG   __init__zConversionSpecifier.__init__   s     """::e$$  FB//ZZ,,
ZZ,,
K44 "::m44(@% **\22 ZZ((


rI   c                    | j         d uS Nrv   r   s    rG   has_keyzConversionSpecifier.has_key   s    xt##rI   c                .    | j         dk    p
| j        dk    S )N*)rz   r{   r   s    rG   has_starzConversionSpecifier.has_star   s    zS 9DNc$99rI   N)rn   F)ro   rp   rq   rr   rs   rK   r8   rt   )r8   rK   )__name__
__module____qualname__r   r   r    rI   rG   rm   rm      sX        W\) ) ) ) )0$ $ $ $: : : : : :rI   rm   
format_strstrlist[ConversionSpecifier]c                    g }t          j        t          |           D ]8}|                    t	          ||                                                     9|S )zFParse c-printf-style format string into list of conversion specifiers.rq   )r>   finditerrT   appendrm   start)r   
specifiersms      rG   parse_conversion_specifiersr      sW    ,.J[J// G G-a17799EEEFFFFrI   format_valuectxr   msgr   nested list[ConversionSpecifier] | Nonec                   t          | ||          }|dS g }|D ]T\  }}t                              |          }|rt          ||          }	nTt                              |          }
|
rt          |
|d          }	n%|                    d|t          j                    dS |	j        r7d|	j        v s	d|	j        v r%|                    d	|t          j                    dS |	                    |	           |	j
        rr|	j        rkd|	j
        v s	d|	j
        v rY|r%|                    d
|t          j                    dS t          |	j
        ||d          }| dS |                    |           V|S )zParse 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)rq   rs   z-Invalid conversion specifier in format stringcode{}z(Conversion value must not contain { or }z2Formatting nesting must be at most two levels deep)r   )find_non_escaped_targetsrU   	fullmatchrm   rV   failcodesSTRING_FORMATTINGrv   r   rR   rs   parse_format_valueextend)r   r   r   r   top_targetsresulttargetrq   ro   	conv_speccustom_matchsub_conv_specss               rG   r   r      s    +<cBBKt(*F( '* '*	''// 	+EYGGGII/99&AAL 
/ IPT  		 C0    
 tt= 	cY]22cY]6J6JHH?5KbHccc44i    !	*2	* 	---	8M1M1M H0    
 tt/	0EsCX\]]]N%ttMM.)))MrI   list[tuple[str, int]] | Nonec                l   g }d}d}d}|t          |           k     r| |         }|s|dk    r-|t          |           dz
  k     r| |dz            dk    r|dz  }nd}|dk    rO|t          |           dz
  k     r| |dz            dk    r|dz  }nl|                    d|t          j                   dS nG|dk    r|dz  }|dk    r|dz  }|r||z  }n)|                    ||t          |          z
  f           d}|dz  }|t          |           k     |r$|                    d	|t          j                   dS |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.
    rx   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           rG   r   r      s    FI
CG
L!!
!
! 	Cxx\**Q...<a3HC3O3O1HCCGCxx\**Q...<a3HC3O3O1HCCHHU"4    
  4  Cxx1Cxx1 Q		y#I*>?@@@	q= L!!
!
!>  H( 	 	
 	
 	

 tMrI   c                      e Zd ZU dZded<   ded<   dPdZdQdZdRdZdSdZdTdZ	dUd Z
dVd"ZdWd'ZdXd(ZdYd+ZdZd/Zd[d3Zd\d4Zd\d5Zd]d6Zd^d8Zd_d:Zd`d<Zdad>ZdbdAZdcdBZdddEZ	 dedfdJZdgdMZdhdidOZdNS )jStringFormatterCheckerzxString interpolation/formatter type checker.

    This class works closely together with checker.ExpressionChecker.
    r   chkr   r   r8   rt   c                "    || _         || _        dS )z%Construct an expression type checker.N)r   r   )r   r   r   s      rG   r   zStringFormatterChecker.__init__-  s    rI   callr   r   r   c                    t          ||| j                  }|dS |                     ||          sdS |                     |||           dS )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)r   r   r   
conv_specss       rG   check_str_format_callz,StringFormatterChecker.check_str_format_call2  s]    * (dDHEE
F&&z488 	F''j,GGGGGrI   specsr   c           	        t          d |D                       s
J d            |                     |d |D                       }t          |          t          |          k    sJ t          ||          D ]F\  }}|                     |||          }t          |t                    r|j        n| j        	                    |          }|J |j
        rk|j        rdd|j
        v s[d|j
        v sRt          |dd	
          r|j        r9| j                            d|j
        dd          d|t           j                   |j        st'          t(          j                  }nut          |j        t.                    sJ t          |j        j        t2                    r|j        j        }	nt3          |          }	|                     |j        ||	d	          }|j        Z|j        d         dvr6| j                            d|j        d          d|t           j                   |                     d          }|t9          |          }
t          |
t:                    rt=          |
j                  n|
g}|D ]C}
t          |
d          r|                      |
||           | !                    ||||
|           DHdS )zPerform pairwise checks for conversion specifiers vs their replacements.

        The core logic for format checking is implemented in this method.
        c              3  $   K   | ]}|j         V  d S r   r   .0ss     rG   	<genexpr>zDStringFormatterChecker.check_specs_in_format_call.<locals>.<genexpr>U  s$      ((Q15((((((rI   "Keys must be auto-generated first!c                B    g | ]}t          t          |j                  S r   )r	   r   rv   r   s     rG   
<listcomp>zEStringFormatterChecker.check_specs_in_format_call.<locals>.<listcomp>V  s%    <]<]<]RST#qu=M=M<]<]<]rI   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   zipapply_field_accessors
isinstancer"   rw   r   lookup_typerR   rs   r&   rN   r   r   r   r   rQ   r'   r,   special_formcalleer   exprr!   conversion_type
named_typer2   r/   r3   itemscheck_placeholder_typeperform_special_format_checks)r   r   r   r   replacementsspecreplactual_typeexpected_typer   a_typeactual_itemss               rG   r   z1StringFormatterChecker.check_specs_in_format_callN  s6    ((%(((((NN*NNNN55d<]<]W\<]<]<]^^<  CJJ....e\22 =	\ =	\JD$--dDd-CCD'1$'A'Aa$))txG[G[\`GaGaK***  1
 D,,,t7G0G0G .k<SWXXX


 HMMUd>Nqrr>RUUU"4 "   
 > 
-4Y5K-L-L!$+z:::::dk.88 7!%!1JJ!(!6!6J $ 4 4ND*$ !5 ! ! *?1%U22HMM>8J > > > "4 "    #oon== $$[11F2<VY2O2O] ...V\U]  ' \ \(>> ++FM4HHH224tV][[[[	\s=	\ =	\rI   r   rm   r   r   r   r+   r   c                (   |j         dk    rt          |t          t          f          r4t	          |j                  dk    r| j                            |d           t          | j	        
                    |                    }t          |t                    r|j        r|j        }t          |t                    rNt          |j        t                    r4t	          |j                  dk    r| j                            |d           |j         r|j         dk    rN|j        sGt!          |d          r7t#          |d          s'| j                            d|t&          j        	           |j        rt-          |                     d
          |                     d          g          }|j         r|j         t0          vs'|j         sKt3          ||          s=t#          |d          s/| j                            d|t&          j        	           d S d S d S d S d S )Nr   r   Tr   r   builtins.bytes__str__zIf 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)rQ   r   r!   r   r   valuer   requires_int_or_charr2   r   r   r(   last_known_valuer)   r   rN   has_type_componentr&   r   r   STR_BYTES_PY3ry   r/   r   rh   r%   r   )r   r   r   r   r   r   c_typnumeric_typess           rG   r   z4StringFormatterChecker.perform_special_format_checks  s?    >S  $) 455 F#dj//Q:N:N--d-EEE#DH$8$8$>$>??E%** /u/E /.%-- J*U[#2N2N Ju{##q((H11$D1III 
	$.C"7"7"7!+/?@@ 	I^YJ J 	 2 ,     : 	%00$//BR2S2ST M N*;;;~ <";>> < .k<HH <
 F0      	 	 <;;;;;rI   keys	list[str]list[Expression]c                .   g }t                      }|D ]5}|                                rv|                     t          |          |          }|sP| j                            d| |t          j                   t          t          t          j                            }ni|                     ||          }|sQ| j                            d| d|t          j                   t          t          t          j                            }|                    |           t          |t                    s|                    |           7t!          d |j        D                       }t!          |          |k     r| j                            |           |S )zFind 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   c                2    g | ]}|t           t          fv |S r   )r   r   )r   kinds     rG   r   zDStringFormatterChecker.find_replacements_in_call.<locals>.<listcomp>  s(    ^^^t'S\I]A]A]dA]A]A]rI   )set	isdecimalget_expr_by_positionrr   r   r   r   r   r"   r'   r,   
from_errorget_expr_by_namer   r   addr   	arg_kinds$too_many_string_formatting_arguments)r   r   r   r   usedrv   r   total_explicits           rG   r   z0StringFormatterChecker.find_replacements_in_call  s   
 $& # 	 	C}} C00S4@@ CHMMXSVXX"4 "   
 $GI,@$A$ABBD,,S$77 CHMMUsUUU"4 "   
 $GI,@$A$ABBDMM$dH--  ^^t~^^^__t99~%%H99$???rI   r   rr   Expression | Nonec                   d t          |j        |j                  D             }|t          |          k     r||         S d t          |j        |j                  D             }|sdS |d         }t	          | j                            |                    }t          |t                    r|j	        
                    d          s&t          t          t          j                            S | j                            dt          t          j                  g          j	        }t          t!          ||          j        d                   S )zGet 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.
        c                .    g | ]\  }}|t           k    |S r   )r   r   argr   s      rG   r   z?StringFormatterChecker.get_expr_by_position.<locals>.<listcomp>  s"    [[[IC4SZ??C???rI   c                .    g | ]\  }}|t           k    |S r   )r   r	  s      rG   r   z?StringFormatterChecker.get_expr_by_position.<locals>.<listcomp>  s'    ]]]YS$DT\L\L\SL\L\L\rI   Nr   ztyping.Sequence)r   argsr  r   r2   r   r   r   r(   rw   has_baser"   r'   r,   r   named_generic_typer   )r   r   r   pos_args	star_argsstar_argvarargs_type	iter_infos           rG   r   z+StringFormatterChecker.get_expr_by_position  s5    \[TY)G)G[[[XC= ]]#di*H*H]]]	 	4 Q<&tx';';H'E'EFF,11 	=9J9S9S:
 :
 	= GI$:;;<<<H//	(> ? ?@
 

 	 1,	JJOPQRSSSrI   rv   c                   fdt          |j        |j        |j                  D             }|r|d         S d t          |j        |j                  D             }|sdS |d         }t	          | j                            |                    }t          |t                    r|j	        
                    d          s&t          t          t          j                            S t          t          j                  }| j                            d||g          j	        }t          t!          ||          j        d                   S )zGet 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.
        c                >    g | ]\  }}}|t           k    |k    |S r   )r   )r   r
  r   namerv   s       rG   r   z;StringFormatterChecker.get_expr_by_name.<locals>.<listcomp>	  s:     
 
 
T4y  TS[[ %0[[rI   r   c                .    g | ]\  }}|t           k    |S r   )r   r	  s      rG   r   z;StringFormatterChecker.get_expr_by_name.<locals>.<listcomp>  s'    ```ysDdV_N_N_sN_N_N_rI   Nztyping.Mappingr   )r   r  r  	arg_namesr2   r   r   r   r(   rw   r  r"   r'   r,   r   r  r   )	r   rv   r   
named_argsstar_args_2
star_arg_2kwargs_typeany_typemapping_infos	    `       rG   r   z'StringFormatterChecker.get_expr_by_name  sB   
 
 
 
#&ty$.$.#Q#Q
 
 


  	!a= ``C	4>,J,J``` 	4 ^
%dh&:&::&F&FGG+x00 	=8H8Q8Q9
 9
 	= GI$:;;<<<9122x223ChPXEYZZ_1+|LLQRSTUUUrI   	all_specsr   r   rK   c                Z   t          d |D                       }t          d |D                       }|r+|s)| j                            d|t          j                   dS |rdS d}|D ]B}|j        s9t          |          }||_        |j        s||_        n||j        z   |_        |dz  }CdS )	zTranslate '{} {name} {}' to '{0} {name} {1}'.

        Return True if generation was successful, otherwise report an error and return false.
        c              3  V   K   | ]$}|j         o|j                                         V  %d S r   )rv   r   r   s     rG   r   z<StringFormatterChecker.auto_generate_keys.<locals>.<genexpr>#  s5      JJ1156QU__%6%6JJJJJJrI   c              3  >   K   | ]}t          |j                  V  d S r   )rK   rv   r   s     rG   r   z<StringFormatterChecker.auto_generate_keys.<locals>.<genexpr>$  s*      99!$qu++999999rI   zGCannot combine automatic field numbering and manual field specificationr   FTr   r   )	anyr   r   r   r   r   rv   r   rM   )r   r  r   some_definedall_defined
next_indexr   	str_indexs           rG   r   z)StringFormatterChecker.auto_generate_keys  s    
 JJ	JJJJJ99y99999 	 	HMMY,    
 5 	4
 		  		 D8  
OO	$z 8!*DJJ!*TZ!7DJa
trI   c                b   |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        |          }|                                rV| j	        
                    d|j         d|t          j                   t          t          t          j                            S t#          |t$                    sJ |j        d         }t#          |t(                    sJ |j        }|                     ||||	          s&t          t          t          j                            S |j        |_        |j        |_        | j        j                            |           |S )
zTransform and validate expr in '{.attr[item]}'.format(expr) into expr.attr['item'].

        If validation fails, return TempNode(AnyType).
        r   Nz<format>)fnammoduleoptionserrorsz"Syntax error in format specifier "r   r   r   r   )rv   rM   r   r   r+  rX   r   r$   	is_errorsr   r   r   r   r"   r'   r,   r   r   r   defsr   r    validate_and_transform_accessorslinecolumnexpr_checkeraccept)r   r   r   r   temp_errorsdummytemp_asts          rG   r   z,StringFormatterChecker.apply_field_accessors;  s    x======:!!KzTX-.. 4:c$(mmoo#>>
49IR]
 
 
   "" 	;HMMBTZBBB,    
 GI$899::: (H-----=#(N33333=44XtTs4SS 	;GI$899::: *$$X...rI   r6  original_replc                   t          |t          t          f          sA| j                            d                    |j                  |t          j                   dS t          |t                    r|j	        }n|j
        }t          |j        t          t          f          su|j        s
J d            |j        sJ | j                            d                    |j        t          |j                  d                   |t          j                   dS t          |j        t                    rt!          |j        j                  |_        t          |t                    rT|j        t$          k    rDt          |t          t          f          sJ t          |t                    r||_
        n||_	        dS |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)r7  r   r   )r   r   r   r   r   formatrM   r   r   r   baseindexr   r   rv   r   r!   r  rX   r0  r1  r/  )r   r6  r7  r   r   nodes         rG   r/  z7StringFormatterChecker.validate_and_transform_accessorsc  s   & (Z$;<< 	HMM44:F4:4F4F,	     5h
++ 	>=DD=Dhnx.ABB 
xTT!TTTTz!!!LSS
3tx==??3  0     u(.(33 >!()<!=!=dH%% 	$)7G*G*GhJ(?@@@@@(I.. . - -4H	j44Dc 5 
 
 	
rI   r   r5   r   c                   | j         j                            |           t          |j                  }|                     ||          }|n1|r|                     |||           n|                     |||           t          |t                    r| 
                    d          S t          |t                    r| 
                    d          S J )zpCheck the types of the 'replacements' in a string interpolation
        expression: str % replacements.
        Nr   r   )r   r2  r3  r   r   analyze_conversion_specifierscheck_mapping_str_interpolationcheck_simple_str_interpolationr   r   r   r!   )r   r   r   r   has_mapping_keyss        rG   check_str_interpolationz.StringFormatterChecker.check_str_interpolation  s     	$$T***0<<
==j$OO# 	P00\4PPPP//
L$OOOdI&& 	??#3444g&& 	??>222LrI   r   contextbool | Nonec                   t          d |D                       }t          d |D                       }t          d |D                       }|r|r| j                            |           d S |r|s| j                            |           d S |S )Nc              3  >   K   | ]}|                                 V  d S r   )r   r   	specifiers     rG   r   zGStringFormatterChecker.analyze_conversion_specifiers.<locals>.<genexpr>  s.      HH	y))++HHHHHHrI   c              3  >   K   | ]}|                                 V  d S r   )r   rG  s     rG   r   zGStringFormatterChecker.analyze_conversion_specifiers.<locals>.<genexpr>  s.      FFii''))FFFFFFrI   c              3  T   K   | ]#}|                                 p
|j        d k    V  $dS )r<   N)r   rQ   rG  s     rG   r   zGStringFormatterChecker.analyze_conversion_specifiers.<locals>.<genexpr>  sL       
 
BKI=9#6##=
 
 
 
 
 
rI   )r#  r   r   &string_interpolation_with_star_and_key,string_interpolation_mixing_key_and_non_keys)r   r   rC  r   r   all_have_keyss         rG   r>  z4StringFormatterChecker.analyze_conversion_specifiers  s     HHZHHHHHFF:FFFFF 
 
OY
 
 
 
 
  	x 	H;;GDDD4 	= 	HAA'JJJ4rI   c                t   |                      |||          }|dS t          |                     |                    }g }t          |t                    r|j        }t          |          }|t          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   }nt          |t                     rdS t          |t                    r/|j
        j        dk    r|j        d         gt          |          z  }nct          |t"                    rK|                                D ]4}t'          |          }|j        |_        |                     |||           5dS |g}t          |          t          |          k    r[t-          || j                            d                    rt          |t                    sdS | j                            |           dS t          |          t          |          k     r| j                            |           dS t          |          dk    r]|d         \  }}t          |t                    r0t          |j                  dk    r ||j        d                    dS  ||           dS t          |t8                    rKt;          d |j        D                       s-t=          ||j                  D ]\  }}|\  }} ||           dS t=          ||          D ]\  }}|\  }} ||           dS )zOCheck % string interpolation with positional specifiers '%s, %d' % ('yes, 42').Nr   r   zbuiltins.tupleztyping.Iterablec              3  @   K   | ]}t          |t                    V  d S r   )r   r    )r   items     rG   r   zHStringFormatterChecker.check_simple_str_interpolation.<locals>.<genexpr>  sE       A A/3
4**A A A A A ArI   )build_replacement_checkersr2   r3  r   r*   r   r1   maxr   r0   rw   r-   upper_boundr(   fullnamer  r'   r/   relevant_itemsr"   r0  r@  r%   r   r   r   #too_few_string_formatting_argumentsr  r#   r#  r   )r   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                     rG   r@  z5StringFormatterChecker.check_simple_str_interpolation  s    22:|TRRF"4;;|#<#<== "	h	** 	# I.y99L' QHI > BCC$\2!(J77777*8=99h(899 E.x/CDDHx227?}7MQa7a7a7a7a (a 01F:%m|m4|CiP\_`P`PbPbFcc	'** 	#F(++ 
	#0FJZ0Z0Z!q)*S]]:II),, 	#..00 Q Q$SMM	!-!2	33J	4PPPPF!
Ix==3y>>))(DH$7$78I$J$JKK KT^)U U K <<\JJJJJ]]S^^++H99,GGGGG8}}!!)1!&
Jh	22 -s8>7J7Ja7O7OJx~a011111J|,,,,,L)44 	)S A A7C7IA A A > > 	) ),Hl6H(I(I ) )$FH-3*J
Jx(((() ) ),Hi(@(@ ) )$FH-3*J
Jx(((() )rI   c                   t          |t                    rt          d |j        D                       rqi }|j        D ]\  }}t          |t                    r<t          |t                    s'| j                            d|t          j                   t          t          |          j        }|                     |          ||<   |D ]}|j        dk    r|j        J |j        |vr#| j                            |j        |            dS ||j                 }	|j        J |                     |j        ||          }
|
 dS | j                            |	|
|t&          j        dd|j         dt          j                   |j        d	k    r|                     ||	|           dS |                     |          }	|                     |          }| j                            |	||t&          j        dd
t          j                   dS )zQCheck % string interpolation with names specifiers '%(name)s' % {'name': 'John'}.c              3  T   K   | ]#\  }}t          |t          t          f          V  $d S r   )r   r!   r   )r   kvs      rG   r   zIStringFormatterChecker.check_mapping_str_interpolation.<locals>.<genexpr>  sF       6
 6
48AqJq7I.//6
 6
 6
 6
 6
 6
rI   z>Dictionary keys in bytes formatting must be bytes, not stringsr   r<   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	   r5   r   r3  rQ   rv   key_not_in_mappingr   r   check_subtyper   'INCOMPATIBLE_TYPES_IN_STR_INTERPOLATIONcheck_s_special_casesbuild_dict_typeFORMAT_REQUIRES_MAPPING)r   r   r   r   mappingrg  rh  key_strrH  rd  r   	dict_types               rG   r?  z6StringFormatterChecker.check_mapping_str_interpolation  sc    lH-- 3	# 6
 6
<H<N6
 6
 6
 3
 3
 3	 (*G$* 
2 
21dI.. %a33 \ !&!8 &   
 /339#';;q>>  ' E E	&#-- }000=//H//	|LLLFF"9=1 *666 $ 4 4Y5H,X\ ] ] (FF&&! $L)FY]FFF0 '    &#--..tXtDDD/E E2 {{<00H,,T22IH"" 8%., #     rI   c                |   t          t          j                  }t          |t                    r8| j                            dg           }| j                            d||g          S t          |t                    r8| j                            dg           }| j                            d||g          S J d            )z>Build expected mapping type for right operand in % formatting.r   z _typeshed.SupportsKeysAndGetItemr   FUnreachable)r'   r,   r   r   r   r   r  r!   )r   r   r  
bytes_typestr_types        rG   rn  z&StringFormatterChecker.build_dict_typeJ  s    9122dI&& 	(445ErJJJ8..2Z4J   g&& 	(x22>2FFH8..2Xx4H   (-'''rI   list[Checkers] | Nonec                v    g }|D ]3}|                      |||          }| d S |                    |           4|S r   )replacement_checkersr   )r   r   rC  r   rW  rH  checkers          rG   rQ  z1StringFormatterChecker.build_replacement_checkersZ  sU     $&# 	% 	%I//	7DIIGttOOG$$$$rI   rH  c                   g }|j         dk    r(|                    |                     |                     |j        dk    r(|                    |                     |                     |j        dk    r6|                     |j        ||          }|dS |                    |           nG|j        @|j        dk    r5|                     |j        ||          }|dS |                    |           |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   Nr<   )rz   r   checkers_for_starr{   rQ   checkers_for_c_typecheckers_for_regular_type)r   rH  rC  r   rW  r   s         rG   ry  z+StringFormatterChecker.replacement_checkerse  s     $&?c!!OOD227;;<<<#%%OOD227;;<<<#%%(()<gtLLAytOOA ,1D1K1K..y/BGTRRAytOOArI   r6   c                Z                           d          d fdd fd
}|fS )zReturns a tuple of check functions that check whether, respectively,
        a node or a type is compatible with a star in a conversion specifier.
        r   rw   r+   r8   rK   c                                         d          }j                            | |dt          j                  S )Nr   z* wants intr   )r   r   rk  r   r   )rw   expectedrC  r   s     rG   ra  z<StringFormatterChecker.checkers_for_star.<locals>.check_type  sA    ~66H8))hU=T *   rI   r   r   rt   c                J                         |           } |           d S r   r3  )r   rw   ra  r  r   s     rG   
check_exprz<StringFormatterChecker.checkers_for_star.<locals>.check_expr  s,    ;;tX..DJtrI   rw   r+   r8   rK   r   r   r8   rt   )r   )r   rC  r  ra  r  s   `` @@rG   r|  z(StringFormatterChecker.checkers_for_star  sq     ??>22	 	 	 	 	 	 		 	 	 	 	 	 	 	 :%%rI   r^  c           	     l    | j                             |||t          j        ddt          j                  S )Nri  zplaceholder has typer   )r   rk  r   rl  r   r   )r   r^  r   rC  s       rG   r   z-StringFormatterChecker.check_placeholder_type  s<    x%%D!"( & 
 
 	
rI   rQ   Checkers | Nonec                p                                     dS d fdd fd
}|fS )zReturns 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.
        Nr^  r+   r8   rK   c                |    J                      |           }|rdk    r                    |           }|S )Nr   )r   rm  )r^  retrC  rQ   r   r   r   s     rG   ra  zDStringFormatterChecker.checkers_for_regular_type.<locals>.check_type  sU     ,,,--c='JJC EyC''00sGDDJrI   r   r   rt   c                J                         |           } |           d S r   r  )r   rw   ra  r   r   s     rG   r  zDStringFormatterChecker.checkers_for_regular_type.<locals>.check_expr  s,    ;;t]33DJtrI   )r^  r+   r8   rK   r  r   )r   rQ   rC  r   r  ra  r   s   ```` @@rG   r~  z0StringFormatterChecker.checkers_for_regular_type  s     ,,YFF 4	 	 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 :%%rI   c                >   t          |t                    r9t          |d          r)| j                            d|t
          j                   dS t          |t                    r9t          |d          r)| j                            d|t
          j                   dS dS )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   )r   r   r^  rC  s       rG   rm  z,StringFormatterChecker.check_s_special_cases  s    dG$$ 		!#'788 \,	     udI&& 	!#~66 B0    
 utrI   rw   format_exprc                p                           |          dS d fdd fd
}|fS )zReturns a tuple of check functions that check whether, respectively,
        a node or a type is compatible with 'type' that is a character type.
        Nrw   r+   r8   rK   c                    J t          t                    rd}nd}j                            | |dt          j                  S )Nz7"%c" requires an integer in range(256) or a single bytez"%c" requires int or charri  r   )r   r   r   rk  r   r   )rw   err_msgrC  r   r  r   s     rG   ra  z>StringFormatterChecker.checkers_for_c_type.<locals>.check_type  sa     ,,,+y11 6S58))%, *   rI   r   r   rt   c                                        |           } |          rt          t                    rIt          | t                    r4t          | j                  dk    rj                                       dS t          | t          t          f          r6t          | j                  dk    r j                                       dS dS dS dS )zint, or str with length 1r   N)	r3  r   r   r   r   r   requires_int_or_single_byter!   r   )r   rw   ra  rC  r   r  r   s     rG   r  z>StringFormatterChecker.checkers_for_c_type.<locals>.check_expr  s    ;;t]33D z$ 	; {I66;"433; DJ1,,H88AAAAAw	&:;; ;DJST@T@TH11':::::	; 	;; ;@T@TrI   r  r  r  )r   rw   rC  r  r  ra  r   s   ` `` @@rG   r}  z*StringFormatterChecker.checkers_for_c_type  s     ,,T7KHH 4	 	 	 	 	 	 	 	 		; 	; 	; 	; 	; 	; 	; 	; 	; 	;  :%%rI   Fpr   Type | Nonec                *   |rt           nt          }|rt          nt          }|dk    rU|sSt	          |t
                    s)| j                            d|t          j	                   dS | 
                    d          S |dk    rt          t          j                  S |dv rt          t          j                  S ||v r||v r| 
                    d          g}n| 
                    d          | 
                    d	          g}|sZ|t          v r)|                    | 
                    d
                     n(|                    | 
                    d                     t!          j        |          S |dv rt	          |t
                    r7t!          | 
                    d          | 
                    d          g          S t!          | 
                    d          | 
                    d          g          S | j                            ||           dS )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.
        rf   z8Format character "b" is only supported on bytes patternsr   Nr   a)r   rr   r   ztyping.SupportsFloatztyping.SupportsInt)r   r   )rh   re   rj   ri   r   r   r   r   r   r   r   r'   r,   r   rk   r   r/   
make_unionunsupported_placeholder)r   r  rC  r   r   NUMERIC_TYPES	INT_TYPESr   s           rG   r   z&StringFormatterChecker.conversion_type  s    .9O))>O'2GOO	88K8dI.. N0    
 t??#3444#XX91222*__91222-I~~!%!@!@ A OON33OO$455! # TK''%,,T__=S-T-TUUUU%,,T__=Q-R-RSSS'666%ZZ$	**  __^44dooFV6W6WX   !__^44doon6U6UV   H,,Q8884rI   r  r(   c                6    | j                             |          S )z}Return an instance type with type given by the name and no type
        arguments. Alias for TypeChecker.named_type.
        )r   r   )r   r  s     rG   r   z!StringFormatterChecker.named_type/  s     x""4(((rI   Nc                B    | j         j                            ||          S )z0Type check a node. Alias for TypeChecker.accept.)r   r2  r3  )r   r   rC  s      rG   r3  zStringFormatterChecker.accept5  s    x$++D':::rI   )r   r   r   r   r8   rt   )r   r   r   r   r8   rt   )r   r   r   r   r   r   r8   rt   )r   rm   r   r   r   r   r   r+   r   r+   r8   rt   )r   r   r   r   r8   r   )r   rr   r   r   r8   r  )rv   r   r   r   r8   r  )r  r   r   r   r8   rK   )r   rm   r   r   r   r   r8   r   )
r6  r   r7  r   r   rm   r   r   r8   rK   )r   r5   r   r   r8   r+   )r   r   rC  r   r8   rD  )r   r   r   r   r   r5   r8   rt   )r   r5   r8   r+   )r   r   rC  r   r   r5   r8   rw  )rH  rm   rC  r   r   r5   r8   rw  )rC  r   r8   r6   )r^  r+   r   r+   rC  r   r8   rK   )rQ   r   rC  r   r   r5   r8   r  )r   r5   r^  r+   rC  r   r8   rK   )rw   r   rC  r   r  r5   r8   r  F)
r  r   rC  r   r   r5   r   rK   r8   r  )r  r   r8   r(   r   )r   r   rC  r  r8   r+   )r   r   r   __doc____annotations__r   r   r   r   r   r   r   r   r   r/  rB  r>  r@  r?  rn  rQ  ry  r|  r   r~  rm  r}  r   r   r3  r   rI   rG   r   r   "  s`             
H H H H8G\ G\ G\ G\R, , , ,\" " " "HT T T T4V V V V6   :& & & &P8
 8
 8
 8
x   *   "G) G) G) G)R: : : :x( ( ( ( 	 	 	 	   4& & & &$	
 	
 	
 	
& & & &.   .)& )& )& )&X UZ4 4 4 4 4t) ) ) ); ; ; ; ; ; ;rI   r   r^  r+   rT  c                   t          |           } t          | t                    r| j                                      S t          | t
                    r5t          | j                  pt          fd| j	        D                       S t          | t                    r-t          fd|                                 D                       S dS )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  8   K   | ]}t          |          V  d S r   r   )r   rh  rT  s     rG   r   z%has_type_component.<locals>.<genexpr>F  sG       D
 D
01q(++D
 D
 D
 D
 D
 D
rI   c              3  8   K   | ]}t          |          V  d S r   r  )r   trT  s     rG   r   z%has_type_component.<locals>.<genexpr>J  s.      QQq%a22QQQQQQrI   F)r2   r   r(   rw   r  r.   r   rS  r#  valuesr/   rU  )r^  rT  s    `rG   r   r   :  s     #

C#x   Rx  ***	C	%	% R!#/8<< 
 D
 D
 D
 D
58ZD
 D
 D
 A
 A
 	
 
C	#	# RQQQQC<N<N<P<PQQQQQQ5rI   )r8   r9   )rJ   rK   r8   r9   )r   r   r8   r   r  )
r   r   r   r   r   r   r   rK   r8   r   )r   r   r   r   r   r   r8   r   )r^  r+   rT  r   r8   rK   )^r  
__future__r   r>   r   r   typingr   r   r   r	   typing_extensionsr
   r4   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"   r#   
mypy.parser$   mypy.subtypesr%   mypy.typeopsr&   
mypy.typesr'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r5   r  tuplerK   r6   dictrr   r   r7   rH   rS   rT   rU   rV   rX   re   rh   ri   rj   rk   rm   r   r   r   r   r   r   rI   rG   <module>r     s  
 
 
 # " " " " " 				         / / / / / / / / / / / / 5 5 5 5 5 5       ! ! ! ! ! ! 4 4 4 4 4 4       2 2 2 2 2 2 ( ( ( ( ( (                                           ,       $ $ $ $ $ $ . . . . . .                                %Wi%78  8 8 8 8XzlD&898TFDL;QQR R R R RE#s(OU3Z78 8 8 8 8! ! ! ! 8 8 8 8@ %$&&	 & & & &,,U33 3 3 3 333D99  9 9 9 9*  * * * * XWW  W W W W\\\  \ \ \ \ ) ( ( ( (222 2 2 2 2 433 3 3 3 3: : : : : : : :@    JO5 5 5 5 5p6 6 6 6rU; U; U; U; U; U; U; U;p     rI   