
    eh]                       U d Z ddlmZ ddlZddlZddlm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 ddlm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jN                  e&d      Z( ejN                  e&d      Z) ejN                  e&d      Z*	 d-	 	 	 	 	 d.dZ+d Z,d/d Z-	 d-	 	 	 	 	 d0d!Z.d"Z/d1d#Z0d-d2d$Z1d-d2d%Z2	 d-	 	 	 	 	 d.d&Z3d3d'Z4d4d(Z5d5d)Z6y)6z.Astroid hooks for the Python standard library.    )annotationsN)Iterator)dedent)Final)	argumentsbasesinference_tipnodesutil)AstroidBuilder_extract_single_nodeextract_node)InferenceContext)AstroidTypeErrorAstroidValueErrorInferenceErrorUseInferenceDefault)AstroidManager	enum.Enumz
Final[str]
ENUM_QNAMEtyping.NamedTupletyping_extensions.NamedTupler   TYPING_NAMEDTUPLE_QUALIFIED>   
NamedTupler   r   TYPING_NAMEDTUPLE_BASENAMESc                    t        | t        j                        rt        	 t	        | j                  |            }t        |t        j                        r
t               |S # t        $ r}t        |d }~ww xY w)Ncontext)
isinstancer   UninferableBaser   nextinferStopIterationr   )noder   valueexcs       E/usr/lib/python3/dist-packages/astroid/brain/brain_namedtuple_enum.py_infer_firstr(   '   sl    $,,-!!&TZZZ01 %--.!##L	  &#%&s   A# #	A8,A33A8c                   	 dfd	}| j                   | j                  }|r%|D ci c]  }|j                  |j                   c}ni  |dd      } |dd      }|r|r|j                  |fS t	               c c}w )Nc                l    t              | kD  rt        |          S |r|v rt        |         S y y N)lenr(   )positionkey_nameargsr   found_keywordss     r'   "_extract_namedtuple_arg_or_keywordzE_find_func_form_arguments.<locals>._extract_namedtuple_arg_or_keyword4   sE     t9xX88N2x 8'BB 38    r   typename)r-   r.      field_namesr+   )r/   keywordsargr%   r   )	r$   r   r1   r6   keywordnamenamesr/   r0   s	    `     @@r'   _find_func_form_argumentsr;   3   s    C 99D}}H@H8<gmm	#<b  .q:ND.MREzz5  

 	=s   A>c           	        	 t        | |      \  }}	 |j                  j                  dd      j                         }|s|D cg c]  }t'        |       }}|D cg c]	  }d|vs| }}|xs d}t        j(                  || j*                  | j,                  | j.                  | j0                  t        j2                         	      }| j4                  |_        |j7                  |g d
       |D ]4  }t        j8                         }||_        ||_        |g|j<                  |<   6 |||fS # t        $ r}|sPg }t        |       }|rt        |      }	|	j                  D 
cg c]  }
t        |
|      j                   nc c}
w }}
nAt        |d      rnt        |j                  t              rT|j                  D 
cg c]8  }
t        |
d   t        j                        rt        |
d   |      j                  : nc c}
w }}
nt        |d      rt        d |j                  D              r[|j                  D 
cg c]?  }
t        |
t        j                         r#t        |
j                  d   |      j                  A nc c}
w }}
n;|j                  D 
cg c]  }
t        |
|      j                   nc c}
w }}
nt        ||st        |Y d}~d}~ww xY w# t        t"        f$ r}t$        |d}~ww xY wc c}w c c}w )z<Specific inference function for namedtuple or Python 3 enum., itemsr   eltsc              3  P   K   | ]  }t        |t        j                           y wr+   )r   r
   Tuple).0consts     r'   	<genexpr>z"infer_func_form.<locals>.<genexpr>s   s     Re:eU[[9Rs   $&NUninferable)lineno
col_offset
end_linenoend_col_offsetparent)r   body
decorators)r;   r%   replacesplitAttributeError_get_namedtuple_fieldsr   r@   r(   hasattrr   r?   listr
   ConstallrB   r   r   strClassDefrG   rH   rI   rJ   UnknownrK   postinit	EmptyNodeattrnameinstance_attrs)r$   	base_typer   enumr9   r:   
attributesr&   fieldsfields_noderD   attr
class_node	fake_nodes                 r'   infer_func_formre   J   s   ,+/g>e(	2$)KK$7$7S$A$G$G$IJV ,67Dc$i7
7 $.A4D$AJA  =D{{????**}}J J	    6OO%	%	!	+4+
!!$'	6
 tZ''[  &	2
/5".v"6KHSHXHX"?DUG4::" "J " 5'*z%++t/L &+[["!%eAh< %U1Xw7==" "J "
 UF+ RuzzRR */& %)%= )A@FF& &
 & MRJJ&CHL8>>& &
 & )c1!(c1M&	2N N+ +!s*+
 8 Bs}   K *D( K1	K6$K6(
K2+KE;:>K8=G65?K4AI98KJ-,KK KK K."K))K.c                :    t        | j                        t        z  S )zRPredicate for class inference tip.

    :type node: ClassDef
    :rtype: bool
    )set	basenamesr   r$   s    r'   _has_namedtuple_baserj      s     t~~!<<<r2   c                    | j                   }t        |t        j                        r|j                  |k(  S t        |t        j
                        r|j                  |k(  S yNF)funcr   r
   	Attributer[   Namer9   )r$   r9   rm   s      r'   _looks_likerp      sH    99D$(}}$$$

#yyD  r2   
namedtupler9   Enumr   c                0   t        j                  d| j                         dddd      g}t        | ||      \  }}}t        j
                  j                  | |      }t        d      } 	 t        | j                               }	 t        |j                  |d|xs
 t                           j                         }		 t        |||	      }dj)                  d |D              }ddj)                  fdt+        |      D              }t-        t/                     j1                  d| d|d| d| d	      }|j2                  d   j4                  d   |j4                  d<   |j2                  d   j4                  d   |j4                  d<   |j2                  d   j4                  d   |j4                  d<   |j2                  d   j4                  d   |j4                  d<   |D ]+  }|j2                  d   j4                  |   |j4                  |<   - t7        |g      S # t        $ r}t        |       |d}~ww xY w# t        t        f$ r d	}	Y w xY w# t         $ r}
t#        d
t%        |
      z         |
d}
~
wt&        $ r}
t#        dt%        |
      z         |
d}
~
ww xY w)z5Specific inference function for namedtuple Call node.tupler   N)r9   rK   rG   rH   rI   rJ   r   z*import collections; collections.namedtupleri   renameFzTypeError: zValueError: , c              3  &   K   | ]	  }| d   yw)z=NoneN )rC   r7   s     r'   rE   z$infer_named_tuple.<locals>.<genexpr>   s     AsuE]As   z[    {name} = property(lambda self: self[{index:d}], doc='Alias for field number {index:d}')
c              3  J   K   | ]  \  }}j                  ||         yw))r9   indexN)format)rC   r|   r9   	field_defs      r'   rE   z$infer_named_tuple.<locals>.<genexpr>   s-      E4 	d%0s    #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
    _asdict_make_replace_fields)r
   ro   rootre   r   CallSite	from_callr   r!   r"   r#   r   infer_argumentr   
bool_value_check_namedtuple_attributesr   r   rV   r   join	enumerater   r   string_buildrL   localsiter)r$   r   tuple_base_namerc   r9   r_   	call_siterm   erv   r&   replace_args
field_defsfakerb   r~   s                  @r'   infer_named_tupler      s   
 	

99;	
	+O $3ow$ Jj "",,T7,CIDED/DJJL!$$T8W5R@P@RS

*, 	F1$
FK
 99AjAAL	2   $Z0 J .*+88f n  %~ &  	D" $(99Q<#6#6y#AJi !%1!4!4W!=Jg$(IIaL$7$7
$CJj!#'99Q<#6#6y#AJi  <"&))A,"5"5d";
$< c  /$'Q./ M* 
  E!-#c(":;D F!.3s8";<#EFsN   +H 6H3 <I 	H0H++H03II	JI,,J8JJc                <   t        |       }t               }t        |       D ]o  \  }}t        d |D              r?t	        j
                  |      s*|r(|d   j                         s|j                  d      s||v rd|z  ||<   |j                  |       q t        |      S )Nc              3  J   K   | ]  }|j                         xs |d k(    yw)_N)isalnum)rC   cs     r'   rE   z5_get_renamed_namedtuple_attributes.<locals>.<genexpr>  s"     :AIIK+18+:s   !#r   r   z_%d)
rS   rg   r   rU   r8   	iskeywordisdigit
startswithaddru   )r5   r:   seenir9   s        r'   "_get_renamed_namedtuple_attributesr   
  s    E5D[) 
4:T::  &Aw s#t|qyE!H
 <r2   c                   t        |      }|rt        |      }| g|D ]a  }t        |t              st	        d      |j                         st        dd|z         t        j                  |      sUt        d|       t               }|D ]F  }|j                  d      r|st        d|      ||v rt        d|      |j                  |       H |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: )ru   r   r   rV   r   isidentifierr   r8   r   rg   r   r   )r3   r_   rv   r9   r   s        r'   r   r     s   z"J7
C
 'J' 
$$"#OPP  "#:}TH=UU  T"#B4(K 
 5D ??3#?xH  4<#&H$QRR r2   c                   	 | j                   j                  |      }t        d |D              st        t        d      }t        | |g|d      d   }t        |j                         g      S # t        t        f$ r}t        |d}~ww xY w)z/Specific inference function for enum Call node.Nc              3     K   | ]7  }t        |t        j                        xr |j                         t        k(   9 y wr+   )r   r
   rW   qnamer   )rC   items     r'   rE   zinfer_enum.<locals>.<genexpr>F  s6       	4(GTZZ\Z-GGs   =?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   r^   r   )
rm   r"   r   r#   r   anyr   re   r   instantiate_class)r$   r   inferredr&   	enum_metarc   s         r'   
infer_enumr   <  s    
+99??7+    "!$	!ID !	{G$OPQRJ--/011Y M* +!s*+s   A- -B<BB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)
c                f	   d | j                         D        D ]  }| j                         j                  dk(  r | S i }t               }| j                  j                         D ]  \  }}t        d |D              s|dk(  r|d   j                         }t        |t        j                        rRt        |j                  d   t        j                        r|j                  d   j                         }n6|j                  }n)t        |t        j                        r|j                  g}nd}|j                   t        |j                   t        j"                        r[t        |j                   j                   t$              r t'        |j                   j                         }n1|j                   j                   }n|j                   j)                         }g }	|D ]C  }
t        |
t        j*                        r|j-                  |
j                         t/        dj1                  |
j                  dj3                  | j4                        |	            }d
|v r#|t6        j1                  |
j                        z  }t9        t;               d      j=                  |      |
j                     }|
j>                  |_        | jA                         D ]  }|g|j                  |j                  <    |	jC                  |jE                                |j                   ?|||<   F |	| j                  |<    t        jF                  | | jH                  | jJ                  | jL                  | jN                        g| j                  d<   t        jF                  | | jH                  | jJ                  | jL                  | jN                        }|jQ                  |j                         D cg c]i  \  }}t        j"                  ||      t        jR                  |j                  ||jH                  |jJ                  |jL                  |jN                        fk c}}       |g| j                  d<   d|vr@t/        d      }t9        t;                     j=                  |      d   }|g| j                  d<    | S  | S c c}}w )zSpecific inference for enums.c              3  B   K   | ]  }|j                   D ]  }|   y wr+   )rh   )rC   clsbs      r'   rE   z#infer_enum_class.<locals>.<genexpr>  s      D3cmmDQDQDs   r^   c              3  R   K   | ]  }t        |t        j                          ! y wr+   )r   r
   
AssignName)rC   r%   s     r'   rE   z#infer_enum_class.<locals>.<genexpr>  s      P
5%*:*:;;Ps   %'_ignore_r   Na  
                class {name}({types}):
                    @property
                    def value(self):
                        return {return_value}
                    @property
                    def _value_(self):
                        return {return_value}
                    @property
                    def name(self):
                        return "{name}"
                    @property
                    def _name_(self):
                        return "{name}"
                rw   )r9   typesreturn_valueIntFlagrr   F)apply_transforms)rK   rG   rH   rI   rJ   _value2member_map_)rK   __members__r9   zY
            @property
            def name(self):
                return ''
            )*mror   r9   rg   r   r?   r   	statementr   r
   AssigntargetsrB   itered	AnnAssigntargetr%   rT   rV   repr	as_stringStarredr   r   r}   r   rh   INT_FLAG_ADDITION_METHODSr   r   r   rK   	mymethodsappendr   DictrG   rH   rI   rJ   rY   ro   )r$   basenamedunder_memberstarget_nameslocalvaluesstmtr   inferred_return_valuenew_targetsr   classdefr   methodmemberskvcodename_dynamicclassattrs                      r'   infer_enum_classr     s   D$((*D J99;v%P KO u![[..0 H	-ME6PPPJ&!9&&(D$-dll1ou{{;"ll1o446G"llGD%//2;;-$(!zz%djj%++6!$**"2"2C804TZZ5E5E0F-04

0@0@-,0JJ,@,@,B)K! *-femm4  -! F#[["ii7%:  * (
  9 @ @fkk @ RRH%"$u,x(6 %mm"nn. 8F06xDKK,8""4#9#9#;<::%(,u%U*-V "-DKKQH	-X JJ{{????#22-
() **;;..
 	 +002 Aq KK'2JJ& xx#$<<#$<<'('7'7
	
  '.YM" %D %3>3C$D$Q$QRV$W%! $9"9DKKKWJV KQs   A.R-c                .   | j                   D cg c]2  }t        |t        j                        r|j                  j
                  4 }}t        d      j                  | j
                  dj                  |            }t        |      }	 t        t        ||            }| j                         D ]  }|g|j                  |j
                  <    | j                   D ]  }	t        |	t        j                         r:|	j"                  D ]*  }
|
j
                  }| j                  |   |j                  |<   , Wt        |	t        j$                        sr|	g|j                  |	j
                  <    t'        |f      S c c}w # t        $ r}t        ||      |d}~ww xY w)z&Infer a subclass of typing.NamedTuple.zU
    from collections import namedtuple
    namedtuple({typename!r}, {fields!r})
    r=   )r3   r`   )r$   r   N)rL   r   r
   r   r   r9   r   r}   r   r   r!   r   r#   r   r   r   r   r   rW   r   )rc   r   	annassignannassigns_fieldsr   r$   generated_class_noder   r   	body_noder   rb   s               r'   infer_typing_namedtuple_classr     s   
 $i1 	 
 	
 fjoochh7H.IfJ 	 D@#$5dG$DE &&( <4:8##FKK0<  __ F	i.#++ L{{4>4E4Ed4K$++D1L 	5>>2;D+ ''	7F %'((7  @$8a?@s   7E3	E8 8	FFFc                :    t        d      }|j                  |      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   5  s$     	E ;;wr2   c                   	 t        | j                  j                               }|j                         t        vrt
        t        | j                        dk7  rt
        t        | j                  d   t        j                  t        j                  f      st
        t        | |      S # t        t        f$ r}t
        |d}~ww xY w)z$Infer a typing.NamedTuple(...) call.N   r4   )r!   rm   r"   r   r#   r   r   r   r,   r/   r   r
   ListrB   r   )r$   r   rm   r&   s       r'   infer_typing_namedtupler   D  s    +DIIOO%& zz|66!!
499~!!diilUZZ$=>!!T7++ M* +!s*+s   #B( (C7B>>Cc                z   g }d}	 t        | j                  d   j                               }|sF| j                  D ]7  }|j                  dk(  s	 t        |j                  j                               } n t        |t        j                        st
        |j                  D ]  }t        |t        j                        r |j                  |j!                                =t        |t        j"                  t        j$                  f      st
        t'        |j                        dk7  rt
        |j                  |j                  d   j!                                 |rddj)                  |       d}|S d	}|S # t        t        f$ r}t
        |d}~wt        $ r Y ow xY w# t        t        f$ r}t
        |d}~ww xY w)
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.
    Nr4   r5   r   r   (r=   z,) )r!   r/   r"   r   r#   r   
IndexErrorr6   r7   r%   r   r
   BaseContainerr@   rT   r   r   r   rB   r,   r   )r$   r:   	containerr&   keyword_nodeeltr5   s          r'   rQ   rQ   [  s    EI1++-.	  MM 	L=07 $\%7%7%=%=%? @I 	 i!4!45!!~~ .c5;;'LL)#

EKK89%%sxx=A%%SXXa[**,-. #((5/*"-  ; M* +!s*  '6 7-367s5   &E6 #F6FFFFF:.F55F:c                $    | j                  d      S )z,Return whether cls is a subclass of an Enum.r   )is_subtype_of)r   s    r'   _is_enum_subclassr     s    [))r2   c                F   | j                  t        j                  t        t              t
               | j                  t        j                  t        t              t               | j                  t        j                  t        t               | j                  t        j                  t        t              t               | j                  t        j                  t        t              d        | j                  t        j                  t        t              t                y )N)	predicatec                `    | j                   dk(  xr t        | j                         dd       dk(  S )Nr   r9   typing)r9   getattrr   ri   s    r'   <lambda>zregister.<locals>.<lambda>  s.    TYY,. ;DIIK.(: r2   )register_transformr
   Callr	   r   _looks_like_namedtupler   _looks_like_enumrW   r   r   r   rj   FunctionDefr   r   _looks_like_typing_namedtuple)managers    r'   registerr     s    

M"346L uzz=+DFVW(4E   34
 67	; 

-.%r2   rl   )
r$   
nodes.Callr]   zlist[nodes.NodeNG]r   InferenceContext | Noner^   boolreturnz%tuple[nodes.ClassDef, str, list[str]])r   r   r+   )r$   r   r   r   r   zIterator[nodes.ClassDef])F)r$   r   r   r   r   zIterator[bases.Instance])r$   nodes.ClassDefr   r  )r   r   )r$   r   r   rV   )r   zastroid.ClassDefr   r   )r   r   r   None)7__doc__
__future__r   	functoolsr8   collections.abcr   textwrapr   r   r   astroidr   r   r	   r
   r   astroid.builderr   r   r   astroid.contextr   astroid.exceptionsr   r   r   r   astroid.managerr   r   __annotations__r   r   r(   r;   re   rj   rp   partialr   r   r   r   r   r   r   r   r   r   r   r   rQ   r   r   ry   r2   r'   <module>r     s  
 5 "   $    @ @ N N ,  +$
J $"& U & U 	 4 (,	](
](!]( %]( 	](
 +](@= +**;\J $9$$[v>  1	 1 1+L Q  :>F
F6FFR"D :>32
3263232l $M`)B   :>,
,6,,.'T*
r2   