
    cX                    "   U d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
Z
ddl
mZmZmZmZmZ ddlmZmZmZ ddlmZ dd	lmZmZmZmZmZ dd
lmZ ej        dk    rddlm Z  nddl!m Z  h dZ"dZ#de$d<   ddhZ%de$d<   h dZ&de$d<   d Z'd Z(	 	 d>d?d$Z)d% Z*d@d&Z+ ej,        e+d'(          Z- ej,        e+d)(          Z. ej,        e+d*(          Z/	 dAdBd,Z0d- Z1dCd.Z2	 dAdDd0Z3d1Z4dEd3Z5dAdFd4Z6dAdFd5Z7	 dAdBd6Z8dGd8Z9dHd;Z: e            ;                    ej<         ee0          e-            e            ;                    ej<         ee3          e.            e            ;                    ej=        e5e:<            e            ;                    ej=         ee6          e*            e            ;                    ej>         ee7          d=             e            ;                    ej<         ee8          e/           dS )Iz.Astroid hooks for the Python standard library.    )annotationsN)Iterator)dedent)	argumentsbasesinference_tipnodesutil)AstroidBuilder_extract_single_nodeextract_node)InferenceContext)AstroidTypeErrorAstroidValueErrorInferenceErrorMroErrorUseInferenceDefault)AstroidManager)      )Final>   enum.IntEnumenum.IntFlagEnumIntEnumIntFlag	enum.Enumr   z
Final[str]
ENUM_QNAMEtyping.NamedTupletyping_extensions.NamedTupler   TYPING_NAMEDTUPLE_QUALIFIED>   
NamedTupler   r    TYPING_NAMEDTUPLE_BASENAMESc                    | t           j        u rt          	 t          |                     |                    }n# t
          $ r}t          |d }~ww xY w|t           j        u rt                      |S )Ncontext)r
   Uninferabler   nextinferStopIterationr   )noder&   valueexcs       Clib/python3.11/site-packages/astroid/brain/brain_namedtuple_enum.py_infer_firstr/   6   s    t "!!&TZZZ0011 & & &#%&   $!###Ls   #; 
AAAc                    	 dfd	}| j         | j        }|rd |D             ni  |dd          } |dd          }|r|r	|j        |fS t                      )	Nc                    t                    | k    rt          |                    S |r|v rt          |                   S d S d S N)lenr/   )positionkey_nameargsr&   found_keywordss     r.   "_extract_namedtuple_arg_or_keywordzE_find_func_form_arguments.<locals>._extract_namedtuple_arg_or_keywordC   so     t99x 	9X888 	CN2 	Cx 8'BBB	C 	C 	C 	C    c                (    i | ]}|j         |j        S  )argr,   ).0keywords     r.   
<dictcomp>z-_find_func_form_arguments.<locals>.<dictcomp>N   s    <<<gm<<<r9   r   typename)r4   r5      field_namesr2   )r6   keywordsr,   r   )r+   r&   r8   rC   namenamesr6   r7   s    `    @@r.   _find_func_form_argumentsrF   B   s    C C C C C C C C 9D}H@HP<<8<<<<b  .-q:NNND..MRRRE ! !z5  


r9   Fr+   
nodes.Call	base_typelist[nodes.NodeNG]r&   InferenceContext | Noneenumboolreturn%tuple[nodes.ClassDef, str, list[str]]c                   	 t          |           \  }}	 |j                            dd                                          }n# t          $ r}|s6g }t          |           }|r"t          |          }	fd|	j        D             }nt          |d          r.t          |j
        t                    rfd|j
        D             }n^t          |d          rFt          d |j        D                       rfd|j        D             }nfd	|j        D             }nt          ||st          |Y d
}~nd
}~ww xY wn!# t          t          f$ r}t          |d
}~ww xY w|sd |D             }d |D             }|pd}t          j        |          }
| j        |
_        |
                    |g d
           |D ].}t          j                    }|
|_        ||_        |g|
j        |<   /|
||fS )z<Specific inference function for namedtuple or Python 3 enum., c                :    g | ]}t          |          j        S r;   r/   r,   r=   constr&   s     r.   
<listcomp>z#infer_func_form.<locals>.<listcomp>p   s3     " " "?DUG44:" " "r9   itemsc                    g | ]=}t          |d          t          j                  "t          |d                    j        >S r   )
isinstancer	   Constr/   r,   rT   s     r.   rV   z#infer_func_form.<locals>.<listcomp>y   sP     " " "!%eAh<<"$U1Xw77=" " "r9   eltsc              3  J   K   | ]}t          |t          j                  V  d S r2   )rZ   r	   Tuple)r=   rU   s     r.   	<genexpr>z"infer_func_form.<locals>.<genexpr>   s.      RRe:eU[99RRRRRRr9   c                    g | ]<}t          |t          j                  t          |j        d                    j        =S rY   )rZ   r	   r^   r/   r\   r,   rT   s     r.   rV   z#infer_func_form.<locals>.<listcomp>   sN     & & & %)%==&(A@@F& & &r9   c                :    g | ]}t          |          j        S r;   rS   rT   s     r.   rV   z#infer_func_form.<locals>.<listcomp>   s3     & & &CHL88>& & &r9   Nc                ,    g | ]}t          |          S r;   )strr=   attrs     r.   rV   z#infer_func_form.<locals>.<listcomp>   s    777Dc$ii777r9   c                    g | ]}d |v|	S )rQ   r;   rd   s     r.   rV   z#infer_func_form.<locals>.<listcomp>   s!    AAA4DA$AAAr9   r'   )r   body
decorators)rF   r,   replacesplitAttributeError_get_namedtuple_fieldsr   r\   hasattrrZ   rW   listallr   r   r	   ClassDefparentpostinit	EmptyNodeattrnameinstance_attrs)r+   rH   r&   rK   rD   rE   
attributesr-   fieldsfields_node
class_nodere   	fake_nodes     `          r.   infer_func_formr{   Y   s   ,+/g>>e(	2$)K$7$7S$A$A$G$G$I$IJJ &	2 &	2 &	2 $2
/55 ".v"6"6K" " " "HSHX" " "J 5'** 2z%+t/L/L 2" " " "%*[" " "JJ
 UF++ 2 RRuzRRRRR 	& & & &).& & &

& & & &LQJ& & &

 )c1! 2(c1M&	2N N+ + + +!s*+  877J777
 BA:AAAJ  =D%%J J	      6 6O%%	%	!	+4+
!$''tZ''sA   D; -A D; 
D7CD2-D; 2D77D; ;EEEc                :    t          | j                  t          z  S )zRPredicate for class inference tip.

    :type node: ClassDef
    :rtype: bool
    )set	basenamesr#   r+   s    r.   _has_namedtuple_baser      s     t~!<<<r9   c                    | j         }t          |t          j                  r|j        |k    S t          |t          j                  r|j        |k    S dS NF)funcrZ   r	   	Attributert   NamerD   )r+   rD   r   s      r.   _looks_liker      sP    9D$(( %}$$$
## !yD  5r9   
namedtuplerD   r   r"   Iterator[nodes.ClassDef]c                r   t          j        d|                                           g}t          | ||          \  }}}t          j                            | |          }t          d          } 	 t          | 	                                          }n## t          $ r}t          |           |d}~ww xY w	 t          |                    |d|                                                    }	n# t          t          f$ r d}	Y nw xY w	 t          |||	          }n_# t          $ r%}
t!          d	t#          |
          z             |
d}
~
wt$          $ r%}
t!          d
t#          |
          z             |
d}
~
ww xY wd                    d |D                       }dd                    fdt)          |          D                       }t+          t-                                                    d| d|d| d| d	          }|j        d         j        d         |j        d<   |j        d         j        d         |j        d<   |j        d         j        d         |j        d<   |j        d         j        d         |j        d<   |D ]"}|j        d         j        |         |j        |<   #t5          |g          S )z5Specific inference function for namedtuple Call node.tuple)rD   rq   r%   z*import collections; collections.namedtupler   NrenameFzTypeError: zValueError: , c              3      K   | ]	}| d V  
dS )z=NoneNr;   )r=   r<   s     r.   r_   z$infer_named_tuple.<locals>.<genexpr>   s(      AAs]]]AAAAAAr9   z[    {name} = property(lambda self: self[{index:d}], doc='Alias for field number {index:d}')
c              3  L   K   | ]\  }}                     ||           V  dS ))rD   indexN)format)r=   r   rD   	field_defs      r.   r_   z$infer_named_tuple.<locals>.<genexpr>   sN        E4 	d%00     r9   z
class z*(tuple):
    __slots__ = ()
    _fields = z
    def _asdict(self):
        return self.__dict__
    @classmethod
    def _make(cls, iterable, new=tuple.__new__, len=len):
        return new(cls, iterable)
    def _replace(self, zP):
        return self
    def __getnewargs__(self):
        return tuple(self)
z
    r   _asdict_make_replace_fields)r	   r   rootr{   r   CallSite	from_callr   r(   r)   r*   r   infer_argument
bool_value_check_namedtuple_attributesr   r   rc   r   join	enumerater   r   string_buildrg   localsiter)r+   r&   tuple_base_namery   rD   rv   	call_siter   er   r-   replace_args
field_defsfakere   r   s                  @r.   infer_named_tupler      s(    ,1:7499;;+W+W+W*XO#2ow$ $ $ Jj ",,T7,CCIDEED/DJJLL!! / / /$'''Q./i..tXwGGHHSSUUM*   F1$
FKK

 E E E!-#c((":;;D F F F!.3s88";<<#EF 99AAjAAAAAL	2      $Z00    J .**++88		 	 	 	 %	 	 	 	 	 D" $(9Q<#6y#AJi !%1!4W!=Jg$(IaL$7
$CJj!#'9Q<#6y#AJi  < <"&)A,"5d";
$sN   2!B 
B4B//B486C/ /DD	D 
E7% EE7 E22E7c                   t          |           }t                      }t          |           D ]\  }}t          d |D                       rIt	          j        |          s5|r3|d                                         s|                    d          s||v rd|z  ||<   |                    |           t          |          S )Nc              3  J   K   | ]}|                                 p|d k    V  dS )_N)isalnum)r=   cs     r.   r_   z5_get_renamed_namedtuple_attributes.<locals>.<genexpr>  s3      ::AIIKK+18::::::r9   r   r   z_%d)
rn   r}   r   ro   r>   	iskeywordisdigit
startswithaddr   )rB   rE   seenirD   s        r.   "_get_renamed_namedtuple_attributesr     s    E55D[)) 
 
4::T:::::	! &&	! 	! Aw  		!
 s##	! t|	! qyE!H<<r9   c                   t          |          }|rt          |          }| f|z   D ]u}t          |t                    st	          d          |                                st          dd|z             t          j        |          rt          d|          vt                      }|D ]V}|
                    d          r|st          d|          ||v rt          d|          |                    |           W|S )Nz*Type names and field names must be stringsz(Type names and field names must be validzidentifiers: z0Type names and field names cannot be a keyword: r   z-Field names cannot start with an underscore: z"Encountered duplicate field name: )r   r   rZ   rc   r   isidentifierr   r>   r   r}   r   r   )r@   rv   r   rD   r   s        r.   r   r     s^   z""J D7
CC
 j( 
 
$$$ 	Q"#OPPP  "" 	#:=UT=U=UU   T"" 	#K4KK  	
 55D  ??3 	 	#HHH   4< 	S#$Q$Q$QRRR r9   Iterator[bases.Instance]c                R   	 | j                             |          }n!# t          t          f$ r}t          |d}~ww xY wt          d |D                       st          t          d          }t          | |g|d          d         }t          |	                                g          S )z/Specific inference function for enum Call node.Nc              3     K   | ];}t          |t          j                  o|                                t          k    V  <d S r2   )rZ   r	   rp   qnamer   )r=   items     r.   r_   zinfer_enum.<locals>.<genexpr>C  sT         	4((GTZZ\\Z-G     r9   a  
    class EnumMeta(object):
        'docstring'
        def __call__(self, node):
            class EnumAttribute(object):
                name = ''
                value = 0
            return EnumAttribute()
        def __iter__(self):
            class EnumAttribute(object):
                name = ''
                value = 0
            return [EnumAttribute()]
        def __reversed__(self):
            class EnumAttribute(object):
                name = ''
                value = 0
            return (EnumAttribute, )
        def __next__(self):
            return next(iter(self))
        def __getitem__(self, attr):
            class Value(object):
                @property
                def name(self):
                    return ''
                @property
                def value(self):
                    return attr

            return Value()
        __members__ = ['']
    T)r&   rK   r   )
r   r)   r   r*   r   anyr   r{   r   instantiate_class)r+   r&   inferredr-   	enum_metary   s         r.   
infer_enumr   9  s    
+9??7++M* + + +!s*+        " "!$	! !ID !	{G$OOOPQRJ--//0111s    ;6;a  
    def __or__(self, other):
        return {name}(self.value | other.value)
    def __and__(self, other):
        return {name}(self.value & other.value)
    def __xor__(self, other):
        return {name}(self.value ^ other.value)
    def __add__(self, other):
        return {name}(self.value + other.value)
    def __div__(self, other):
        return {name}(self.value / other.value)
    def __invert__(self):
        return {name}(~self.value)
    def __mul__(self, other):
        return {name}(self.value * other.value)
nodes.ClassDefc                   d |                                  D             D ]}|                                 j        dk    r ni }t                      }| j                                        D ]\  }}t          d |D                       r |d                             d          }t          |t          j
                  rMt          |j        d         t          j                  r |j        d                                         }n,|j        }n$t          |t          j                  r	|j        g}nd}|j        ~t          |j        t          j                  rFt          |j        j        t$                    rt'          |j        j                  }n&|j        j        }n|j                                        }g }	|D ];}
t          |
t          j                  r|                    |
j                   t/          d                    |
j        d	                    | j                  |
                    }d|v r#|t6                              |
j                  z  }t9          t;                      d                              |          |
j                 }|
j        |_        |                                  D ]}|g|j        |j        <   |	!                    |"                                           |||<   =|	| j        |<   t          j#        |           g| j        d<   t          j#        |           $                    fd|                                D                        g| j        d<   d|vrNt/          d          }t9          t;                                                    |          d         }|g| j        d<    | S )zSpecific inference for enums.c              3  .   K   | ]}|j         D ]}|V  d S r2   )r~   )r=   clsbs      r.   r_   z#infer_enum_class.<locals>.<genexpr>  s1      DD3cmDDQDDDDDDDr9   rK   c              3  L   K   | ]}t          |t          j                   V   d S r2   )rZ   r	   
AssignName)r=   r,   s     r.   r_   z#infer_enum_class.<locals>.<genexpr>  s2      OOuz%)9:::OOOOOOr9   r   T)futureNa  
                class {name}({types}):
                    @property
                    def value(self):
                        return {return_value}
                    @property
                    def name(self):
                        return "{name}"
                r   )rD   typesreturn_valuer   r   F)apply_transformsrq   _value2member_map_c                x    g | ]6\  }}t          j        |           t          j        |j                   f7S )r   )r	   r[   r   rD   )r=   kvmemberss      r.   rV   z$infer_enum_class.<locals>.<listcomp>  sR       Aq Qw///AF71S1S1ST  r9   __members__rD   zY
            @property
            def name(self):
                return ''
            )%mror   rD   r}   r   rW   r   	statementrZ   r	   Assigntargetsr^   itered	AnnAssigntargetr,   r[   rc   repr	as_stringStarredr   r   r   r   r~   INT_FLAG_ADDITION_METHODSr   r   r   rq   	mymethodsappendr   Dictrr   )r+   basenamedunder_memberstarget_nameslocalvaluesstmtr   inferred_return_valuenew_targetsr   classdefr   methodcodename_dynamicclassattrr   s                   @r.   infer_enum_classr     s   DD$((**DDD g g99;;v% 	Euu![..00 =	- =	-ME6OOOOOOO !9&&d&33D$-- dl1ou{;; +"l1o4466GG"lGGD%/22 ;-$(!z Cdj%+66 C!$*"2C88 A04TZ5E0F0F--04
0@--,0J,@,@,B,B)K! "- "-fem44   ---! F#["ii77%:     ( S
  9 @ @fk @ R RRH%"$$u  ,x((6 %m"nn.. 8 8F06xDK,,""4#9#9#;#;<<<(,u%%!,DK .3Zt-D-D-D,E()*D)))   *0022  	
 	
 	
 '.YM" % 	: D %3>3C3C$D$D$Q$QRV$W$W%! $9"9DKKr9   c                   d | j         D             }t          d                              | j        d                    |                    }t          |          }	 t          t          ||                    }n$# t          $ r}t          ||          |d}~ww xY w| 
                                D ]}|g|j        |j        <   | j         D ]m}t          |t          j                  r'|j        D ]}	|	j        }
| j        |
         |j        |
<   Ct          |t          j                  r|g|j        |j        <   nt#          |f          S )z&Infer a subclass of typing.NamedTuple.c                Z    g | ](}t          |t          j                  |j        j        )S r;   )rZ   r	   r   r   rD   )r=   	annassigns     r.   rV   z1infer_typing_namedtuple_class.<locals>.<listcomp>  s@       i11  r9   zU
    from collections import namedtuple
    namedtuple({typename!r}, {fields!r})
    rP   )r@   rw   )r+   r&   N)rg   r   r   rD   r   r   r(   r   r*   r   r   r   rZ   r	   r   r   rp   r   )ry   r&   annassigns_fieldsr   r+   generated_class_noder   r   	body_noder   re   s              r.   infer_typing_namedtuple_classr     s    #  
 	 
 fjochh7H.I.IfJJ 	 D@#$5dG$D$DEE @ @ @$888a?@&&(( < <4:8#FK00_ F F	i.. 	F#+ L L{4>4Ed4K$+D11L 	5>22 	F;D+ '	7%'(((s   A< <
BBBc                J    t          d          }|                    |          S )z
    Starting with python3.9, NamedTuple is a function of the typing module.
    The class NamedTuple is build dynamically through a call to `type` during
    initialization of the `_NamedTuple` variable.
    zD
        from typing import _NamedTuple
        _NamedTuple
        )r   r)   )r+   r&   klasss      r.    infer_typing_namedtuple_functionr     s,     	 E ;;wr9   c                   	 t          | j                                                  }n!# t          t          f$ r}t
          |d}~ww xY w|                                t          vrt
          t          | j	                  dk    rt
          t          | j	        d         t          j        t          j        f          st
          t          | |          S )z$Infer a typing.NamedTuple(...) call.N   rA   )r(   r   r)   r   r*   r   r   r!   r3   r6   rZ   r	   Listr^   r   )r+   r&   r   r-   s       r.   infer_typing_namedtupler     s    +DIOO%%&&M* + + +!s*+ zz||66 "!!
49~~ "!!dilUZ$=>> "!!T7+++s   &) AAArc   c                   g }d}	 t          | j        d                                                   }n,# t          t          f$ r}t
          |d}~wt          $ r Y nw xY w|s`| j        D ]X}|j        dk    rK	 t          |j	                                                  }n!# t          t          f$ r}t
          |d}~ww xY w nYt          |t          j                  st
          |j        D ]}t          |t          j                  r(|                    |                                           Dt          |t          j        t          j        f          st
          t'          |j                  dk    rt
          |                    |j        d                                                    |rdd                    |           d}nd	}|S )
zGet and return fields of a NamedTuple in code-as-a-string.

    Because the fields are represented in their code form we can
    extract a node from them later on.
    NrA   rB   r   r   (rP   z,) )r(   r6   r)   r   r*   r   
IndexErrorrC   r<   r,   rZ   r	   BaseContainerr\   r[   r   r   r   r^   r3   r   )r+   rE   	containerr-   keyword_nodeeltrB   s          r.   rl   rl   5  s    EI1++--..		M* + + +!s*     M 	 	L=0 7 $\%7%=%=%?%? @ @II&6 7 7 7-367 i!455 "!!~ . .c5;'' 	LL)))#
EK899 	&%%sx==A 	&%%SXa[**,,---- -#((5//---s3   ,3 AAAA6&BB;.B66B;r   astroid.ClassDefc                |    	 t          d |                                 D                       S # t          $ r Y dS w xY w)z,Return whether cls is a subclass of an Enum.c              3     K   | ]9}|j         t          v o&t          |                                d d          dk    V  :dS )rD   NrK   )rD   ENUM_BASE_NAMESgetattrr   )r=   r   s     r.   r_   z$_is_enum_subclass.<locals>.<genexpr>b  s`       
 
  J/) >

fd33v=
 
 
 
 
 
r9   F)r   r   r   )r   s    r.   _is_enum_subclassr
  _  sc     
 
 
 
 
 
 
 	

    uus   *- 
;;)	predicatec                f    | j         dk    o&t          |                                 dd           dk    S )Nr"   rD   typing)rD   r	  r   r   s    r.   <lambda>r  z  s1    l* 7		VT**h6 r9   r   )
r+   rG   rH   rI   r&   rJ   rK   rL   rM   rN   )rM   rL   r2   )r+   rG   r&   rJ   rM   r   )F)r+   rG   r&   rJ   rM   r   )r+   r   rM   r   )r&   rJ   )r+   rG   rM   rc   )r   r  rM   rL   )?__doc__
__future__r   	functoolsr>   syscollections.abcr   textwrapr   astroidr   r   r   r	   r
   astroid.builderr   r   r   astroid.contextr   astroid.exceptionsr   r   r   r   r   astroid.managerr   version_infor  r   typing_extensionsr  r   __annotations__r!   r#   r/   rF   r{   r   r   partial_looks_like_namedtuple_looks_like_enum_looks_like_typing_namedtupler   r   r   r   r   r   r   r   r   rl   r
  register_transformCallrp   FunctionDefr;   r9   r.   <module>r$     s  
 5 4 4 " " " " " "      



 $ $ $ $ $ $        @ @ @ @ @ @ @ @ @ @ @ @ @ @ N N N N N N N N N N , , , , , ,              + * * * * *v (''''''   %
 $ $ $ $"&     & & &     	 	 	     4 (,	V( V( V( V( V(r= = =    +*;\JJJ $9$[v>>>  1	 1+L Q Q Q  :>; ; ; ; ;|  "   D :>32 32 32 32 32l $j j j jZ) ) ) ) )B           :>, , , , ,.' ' ' 'T	 	 	 	    # #	J/002H      # #	Jj))+;      # #	N$0A $       # #	NMM"?@@BV      # #	M2337 7      # #	J5668U    r9   