o
    2gx                     @  s  U d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
mZmZ ddlmZmZ ddlmZ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)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 dd
l5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJ ddlKmLZL dZMdeNd< dZOdeNd< dZPdeNd< G dd dZQdS )zZSemantic analysis of named tuple definitions.

This is conceptually part of mypy.semanal.
    )annotationsN)contextmanager)	ContainerFinalIteratorListMappingcast)ARG_TYPE	ErrorCode)TypeTranslationErrorexpr_to_unanalyzed_type)MessageBuilder)ARG_NAMED_OPTARG_OPTARG_POSMDEFArgumentAssignmentStmtBlockCallExprClassDefContext	DecoratorEllipsisExpr
ExpressionExpressionStmtFuncBaseFuncDefListExprNamedTupleExprNameExprPassStmtRefExpr	StatementStrExprSymbolTableSymbolTableNodeTempNode	TupleExprTypeInfoTypeVarExprVaris_StrExpr_list)Options)PRIORITY_FALLBACKSSemanticAnalyzerInterfacecalculate_tuple_fallbackhas_placeholderset_callable_name)TYPED_NAMEDTUPLE_NAMESAnyTypeCallableTypeLiteralType	TupleTypeType	TypeOfAnyTypeType	TypeVarIdTypeVarLikeTypeTypeVarTypeUnboundTypehas_type_vars)get_unique_redefinition_name)__new____init__	__slots____getnewargs___fields_field_defaults_field_types_make_replace_asdict_source__annotations__r   NAMEDTUPLE_PROHIBITED_NAMESzYInvalid statement in NamedTuple definition; expected "field_name: field_type [= default]"NAMEDTUP_CLASS_ERROR_NTSELF_TVAR_NAMEc                   @  s   e Zd ZdLd	d
ZdMddZdNddZdOddZdPd$d%ZdQd(d)ZdRd/d0Z	dSd;d<Z
edTd?d@ZdUdDdEZdVdWdJdKZdFS )XNamedTupleAnalyzeroptionsr.   apir0   msgr   returnNonec                 C  s   || _ || _|| _d S N)rS   rT   rU   )selfrS   rT   rU    rZ   O/home/garg/my-data/venv/lib/python3.10/site-packages/mypy/semanal_namedtuple.pyrC   b   s   
zNamedTupleAnalyzer.__init__defnr   is_stub_fileboolis_func_scopetuple[bool, TypeInfo | None]c              	   C  s   |j D ]k}t|trn| j| |jtv rn| ||}|du r" dS |\}}}}	|r;d|jvr;| jdt	|j
 7  _d}
t|jtrG|jj}
| |j||||j
|
}t|dd|_|j
|j_
|j|j_|	|j_d|f  S qdS )a  Analyze if given class definition can be a named tuple definition.

        Return a tuple where first item indicates whether this can possibly be a named tuple,
        and the second item is the corresponding TypeInfo (may be None if not ready and should be
        deferred).
        N)TN@Tis_typed)FN)base_type_exprs
isinstancer#   rT   acceptfullnamer4   check_namedtuple_classdefnamestrlineanalyzedr    infobuild_namedtuple_typeinfocolumndefsbody)rY   r\   r]   r_   	base_exprresultitemstypesdefault_items
statementsexisting_inform   rZ   rZ   r[   analyze_namedtuple_classdefi   s.   
	



z.NamedTupleAnalyzer.analyze_namedtuple_classdefKtuple[list[str], list[Type], dict[str, Expression], list[Statement]] | Nonec                 C  s  t |jdkr| d| g }g }i }g }|jjD ]}|| t|ts[t|ts5t|t	r6t|j
tr6qt|ttfr>qt|t	rJt|j
trJq|  |j| | t| qt |jdksjt|jd ts{|  |j| | t| q|jd j}|| |jdu r|ttj n| jj|j| j  dd}	|	du r dS ||	 |dr| d| | |jdu st|d	r|js| t| qt|jt r|r| d
| q|j||< q|j!rd}
|j!D ]
}| j"#|
|| q||||fS )a  Parse and validate fields in named tuple class definition.

        Return a four tuple:
          * field names
          * field types
          * field default values
          * valid statements
        or None, if any of the types are not ready.
           z"NamedTuple should be a single baser   NNamedTuple item typeallow_placeholderprohibit_self_type_z7NamedTuple field name cannot start with an underscore: 
new_syntaxz:Non-default NamedTuple fields cannot follow default fieldsz( for "__init_subclass__" of "NamedTuple")$lenrd   failrp   rq   appendre   r   r"   r   exprr   r   r   r%   popremoved_statementsrO   lvaluesr!   ri   typer5   r:   unannotatedrT   	anal_typer_   
startswithhasattrr   rvaluer(   keywordsrU   (unexpected_keyword_argument_for_function)rY   r\   r]   rt   ru   rv   rw   stmtri   rl   for_functionkeyrZ   rZ   r[   rh      sp   










z,NamedTupleAnalyzer.check_namedtuple_classdefnoder   var_name
str | None9tuple[str | None, TypeInfo | None, list[TypeVarLikeType]]c                 C  s  t |ts
ddg fS |}|j}t |tsddg fS |j}|dkr#d}n|tv r*d}nddg fS | ||}|r@|\}	}
}}}}n>|rP|}|rO|dt|j 7 }n	dt|j  }}| 	|g g i |jd}| 
|||| ||ksr|ry| j|| ||g fS |s|dg fS |r|}n|}|du s|r|dt|j 7 }|rdd t|	t| d |D }ni }d}t |jtr|jj}| 	||	|
||j|}|r| 
|||| nt||d	|_|j| ||ks|r| j|| |||fS )
a  Check if a call defines a namedtuple.

        The optional var_name argument is the name of the variable to
        which this is assigned, if any.

        Return a tuple of two items:
          * Internal name of the named tuple (e.g. the name passed as an argument to namedtuple)
            or None if it is not a valid named tuple
          * Corresponding TypeInfo, or None if not ready.

        If the definition is invalid but looks like a namedtuple,
        report errors but return (some) TypeInfo.
        Ncollections.namedtupleFTra   znamedtuple@c                 S  s   i | ]\}}||qS rZ   rZ   ).0arg_namedefaultrZ   rZ   r[   
<dictcomp>#  s    
z7NamedTupleAnalyzer.check_namedtuple.<locals>.<dictcomp>rb   )re   r   calleer#   rg   r4   parse_namedtuple_argsrj   rk   rn   store_namedtuple_inforT   add_symbol_skip_localzipr   rl   r    rm   set_line)rY   r   r   r_   callr   rg   rc   rs   rt   ru   defaultstypename	tvar_defsokri   rm   rv   rx   rZ   rZ   r[   check_namedtuple   sf   






	
z#NamedTupleAnalyzer.check_namedtuplerm   r*   ri   rj   r   r   rc   c                 C  s.   | j ||| t||d|_|j| d S )Nrb   )rT   
add_symbolr    rl   r   )rY   rm   ri   r   rc   rZ   rZ   r[   r   I  s   z(NamedTupleAnalyzer.store_namedtuple_inforg   WNone | tuple[list[str], list[Type], list[Expression], str, list[TypeVarLikeType], bool]c                 C  sD  |t v rdnd}|j}t|dk r| d| d| dS g }d}t|dkr|t v r3| d| dS t|jdd dD ]G\}}|d	kr`|| }	t|	ttfrVt	|	j
}q=| d
||	 q=|dkr|| }	t|	trx|	jdv rx|	jdk}q=| jd| d|	td q=|jdd ttgkr| d| d| dS t|d ts| d| d| dS |d j}
g }g }t|d ttfs|dkrt|d tr|d }|jdd }nW| d|| dS |d }|dkrt|j
s| d| dS dd |j
D }n-dd |j
D }| j|}| |j
|}|du r dS |\}}}}|s1g g g |
g dfS |s;dd |D }g }t }t|D ]:\}}| ||}|du r_|| || qD|sn| d| d| | d | }|| || qDt|t|kr| d!| d| |dt| }||||
|d"fS )#a  Parse a namedtuple() call into data needed to construct a type.

        Returns a 6-tuple:
        - List of argument names
        - List of argument types
        - List of default values
        - First argument of namedtuple
        - All typevars found in the field definition
        - Whether all types are ready.

        Return None if the definition didn't typecheck.
        
NamedTuple
namedtuple   zToo few arguments for "z()"NFz%Too many arguments for "NamedTuple()"r   z?List or tuple literal expected as the defaults argument to {}()rename)TrueFalser   z5Boolean literal expected as the "rename" argument to z()codezUnexpected arguments to "r   "z2()" expects a string literal as the first argumentr{   r   , z?List or tuple literal expected as the second argument to "{}()"z.String literal expected as "namedtuple()" itemc                 S     g | ]}|j qS rZ   )valuer   itemrZ   rZ   r[   
<listcomp>      z<NamedTupleAnalyzer.parse_namedtuple_args.<locals>.<listcomp>c                 S  s.   g | ]}t |trt|jd kr|jd qS )r   r{   )re   r)   r   rt   )r   trZ   rZ   r[   r     s    c                 S  s   g | ]}t tjqS rZ   )r5   r:   r   r   r   rZ   rZ   r[   r         z()" r   z$Too many defaults given in call to "T)r4   argsr   r   	enumerate	arg_namesre   r   r)   listrt   formatr!   ri   r
   	arg_kindsr   r%   r   replacesplitr-   rT   get_and_bind_all_tvars"parse_namedtuple_fields_with_typessetcheck_namedtuple_field_namer   add)rY   r   rg   	type_namer   r   r   ir   argr   ru   r   str_exprrt   listexpr
type_exprsrs   r   r   processed_items
seen_namesr   problemnew_namerZ   rZ   r[   r   P  s   







z(NamedTupleAnalyzer.parse_namedtuple_argsnodeslist[Expression]contextr   ;tuple[list[str], list[Type], list[Expression], bool] | Nonec           
   	   C  s  g }g }|D ]}t |tr}t|jdkr| d|  dS |j\}}t |tr.||j n	| d|  dS zt|| j	| j
j}W n tyS   | d| Y  dS w | j
j|| j
  dd}	t |	trkttj}	|	du rwg g g df  S ||	 q| d	|  dS ||g d
fS )zParse typed named tuple fields.

        Return (names, types, defaults, whether types are all ready), or None if error occurred.
        r   z'Invalid "NamedTuple()" field definitionNz!Invalid "NamedTuple()" field namezInvalid field typer|   r}   Fz&Tuple expected as "NamedTuple()" fieldT)re   r)   r   rt   r   r%   r   r   r   rS   rT   r]   r   r   r_   r?   r5   r:   
from_error)
rY   r   r   rt   ru   r   ri   	type_noder   rl   rZ   rZ   r[   r     s>   





z5NamedTupleAnalyzer.parse_namedtuple_fields_with_typesrt   	list[str]ru   
list[Type]rv   Mapping[str, Expression]rk   intrx   TypeInfo | Nonec              	     sH  | j dttj}| j d|g}| j d|g}	| j d|g}
| j d|g}| j d|g}| j dfdd|D }t||}|pR| j ||d_t||j	rqt
j	jrq| j jd d	jkd
  _d| ijd< t
sts| j tfdd 	dCdDfdd}dd t||D }|D ]}||dd qdd t||D }tfdd|D |}|td|dd |td|	dd |td |	dd |td!dd |td"|
dd |td#dd | jjd$kr|td%|dd jd usJ ttj d&t | j j g jttjd'		dCdEfd0d1}|d2d d3d |D d4 | jjd5kr[|d6d d7d |D d4 dF fd9d:|d;d fd<d|D dd= |d>g |
d? |d@d dttdA||d t gdB t!tjd& t g jttj}t"t#|j$t< S )GNzbuiltins.strzbuiltins.tuplezbuiltins.dictztyping.Iterablezbuiltins.functionc                   s   g | ]}t | qS rZ   )r7   r   strtyperZ   r[   r   	  r   z@NamedTupleAnalyzer.build_namedtuple_typeinfo.<locals>.<listcomp>TzNamedTuple item)force_progressfieldsr   c                     s   t  S rX   )r1   rZ   )
tuple_baserZ   r[   <lambda>  s    z>NamedTupleAnalyzer.build_namedtuple_typeinfo.<locals>.<lambda>Fvarr,   is_initialized_in_classr^   is_propertyrV   rW   c                   s<    | _ || _|| _ j d| j | _tt|  j| j< d S )N.)	rm   r   r   rg   ri   	_fullnamer'   r   names)r   r   r   )rm   rZ   r[   	add_field   s
   z?NamedTupleAnalyzer.build_namedtuple_typeinfo.<locals>.add_fieldc                 S     g | ]	\}}t ||qS rZ   r,   r   r   typrZ   rZ   r[   r   )      )r   c                 S  r   rZ   r   r   rZ   rZ   r[   r   0  r   c                   s   g | ]} qS rZ   rZ   r   r   rZ   r[   r   2  s    rF   )r   rH   rG   rL   rM   __doc__)   
   __match_args__r   )ri   rg   idvaluesupper_boundr   funcnamerj   retType | Noner   list[Argument]is_classmethodis_newc                   sl  j  d|  }jtjj|dd}|d u r|}|s|r,ttdt|d t	g}n
ttd|d t	g}|| }dd |D }dd |D }	d	d |D }
d |vsUJ t
ttt ||
|	| }|g|_t| |tg }|_||_t|||_||_|_|rt| |j}d
|_|_|j|_d
|_t|tdg|}|_tt|}ntt|}d
|_|j| < d S )Nr   )	namespace)r   _cls_selfc                 S  r   rZ   )type_annotationr   r   rZ   rZ   r[   r   Z  r   zTNamedTupleAnalyzer.build_namedtuple_typeinfo.<locals>.add_method.<locals>.<listcomp>c                 S  s   g | ]}|j jqS rZ   )variableri   r  rZ   rZ   r[   r   [      c                 S  r   rZ   )kindr  rZ   rZ   r[   r   \  r   Tclassmethod)rg   copy_modifiedr<   r   raw_idr   r,   r;   make_normalizedr   r6   r	   r   r9   	variablesr   r   rm   is_classr3   r   r   rk   r   is_decoratedr   r!   r'   r   plugin_generatedr   )r   r   r   r   r   rg   	self_typefirstru   rt   r   	signaturefuncvdecsym)function_typerm   rk   shared_self_typerZ   r[   
add_methodG  sD   
z@NamedTupleAnalyzer.build_namedtuple_typeinfo.<locals>.add_methodrJ   c                 S     g | ]}t ||jt tqS rZ   r   r   r   r   r   r   rZ   rZ   r[   r   w      )r   r   )r      __replace__c                 S  r  rZ   r  r  rZ   rZ   r[   r   }  r  r   c                   s.     | jd }|d u rtnt}t| | j||S rX   )getri   r   r   r   r   )r   r   r  )rv   rZ   r[   make_init_arg  s   zCNamedTupleAnalyzer.build_namedtuple_typeinfo.<locals>.make_init_argrB   c                   s   g | ]} |qS rZ   rZ   r  )r!  rZ   r[   r     r  )r   r   r   rK   )r   r   rI   iterable)r   r   r   )FF)r   r,   r   r^   r   r^   rV   rW   )r   rj   r   r   r   r   r   r^   r   r^   rV   rW   )r   r,   rV   r   )%rT   
named_typer5   r:   special_formnamed_type_or_noner8   basic_new_typeinfois_named_tuplespecial_aliasr2   targetprocess_placeholder
tuple_typeupdate_tuple_typerk   copymetadatar@   schedule_patchr/   r   r,   rS   python_versionr>   rQ   rg   
tvar_scopenew_unique_func_idfrom_omitted_genericsr   r   r+   r'   r   r   )rY   ri   rt   ru   rv   rk   rx   implicit_anybasetuple_typedictypeordereddictypefallbackiterable_typeliteralsmatch_args_typer   r   r   varstuple_of_stringsr  self_tvar_exprrZ   )rv   r  rm   rk   r!  r  r   r   r[   rn     s   	



	
-z,NamedTupleAnalyzer.build_namedtuple_typeinfonamed_tuple_infoIterator[None]c           	      c  s    |j }t |_ dV  tD ](}||j v r5|||j | u rq|j | j}|dus+J | d| d| q| D ]/\}}||j v rd|dkrHq:|j | }t|jtt	frY|j
sYq:t||j }||j |< ||j |< q:dS )aj  Preserve the generated body of class-based named tuple and then restore it.

        Temporarily clear the names dict so we don't get errors about duplicate names
        that were already set in build_namedtuple_typeinfo (we already added the tuple
        field names while generating the TypeInfo, and actual duplicates are
        already reported).
        Nz'Cannot overwrite NamedTuple attribute "r   r   )r   r&   rN   r   r   r   rt   re   r   r   r  rA   )	rY   r?  nt_names
prohibitedctxr   r   r  r_keyrZ   rZ   r[   save_namedtuple_body  s.   	



z'NamedTupleAnalyzer.save_namedtuple_bodyfieldr   Container[str]c                 C  sX   ||v r
d| dS |  sd| dS |drd| dS t|r*d| dS dS )	zDReturn None for valid fields, a string description for invalid ones.zhas duplicate field name "r   zfield name "z" is not a valid identifierr   z" starts with an underscorez" is a keywordN)isidentifierr   keyword	iskeyword)rY   rF  r   rZ   rZ   r[   r     s   

z.NamedTupleAnalyzer.check_namedtuple_field_nameNrC  r   ErrorCode | Nonec                 C  s   | j j|||d d S )Nr   )rT   r   )rY   rU   rC  r   rZ   rZ   r[   r     s   zNamedTupleAnalyzer.fail)rS   r.   rT   r0   rU   r   rV   rW   )r\   r   r]   r^   r_   r^   rV   r`   )r\   r   r]   r^   rV   rz   )r   r   r   r   r_   r^   rV   r   )
rm   r*   ri   rj   r   r   rc   r^   rV   rW   )r   r   rg   rj   rV   r   )r   r   r   r   rV   r   )ri   rj   rt   r   ru   r   rv   r   rk   r   rx   r   rV   r*   )r?  r*   rV   r@  )rF  rj   r   rG  rV   r   rX   )rU   rj   rC  r   r   rK  rV   rW   )__name__
__module____qualname__rC   ry   rh   r   r   r   r   rn   r   rE  r   r   rZ   rZ   rZ   r[   rR   a   s    


#
P
m

y
+ %
)rR   )Rr   
__future__r   rI  
contextlibr   typingr   r   r   r   r   r	   mypy.errorcodesr
   r   mypy.exprtotyper   r   mypy.messagesr   
mypy.nodesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   mypy.optionsr.   mypy.semanal_sharedr/   r0   r1   r2   r3   
mypy.typesr4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   	mypy.utilrA   rN   rM   rO   rQ   rR   rZ   rZ   rZ   r[   <module>   s$     !<
