o
    bg                     @   s\  d Z ddl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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 edZedZdd Zdd ZdZddddddddddddd d!Zd"d# e D Zd$d# e D Zd%d&d'dd(Zejejejej d(Z!d)d* Z"d+d, ej#_$d-d, ej%_$d.d, ej&_$d/d, ej'_$d0d, ej(_$d1d, d2d, d3d, d4d, d5d, d6d, d7d, d8d, d9d, d:d, d;d, d<d, d=Z)ej*d>krej+e)d?< e,e) D ]
\Z-Z.e.e)e-d@ < qej/dAdB Z0e0ej'_1dCdD Z2dEdF Z3ej/dGdH Z4e4ej#_1e4ej%_1ej/dIdJ Z5e5e	j6_1e5ej7_1	 dKdL Z8ej9dedMdNZ:e:ej;_<e:ej=_<dedOdPZ>e>ej#_<e>ej%_<dedQdRZ?e?ej@_<e?ejA_<dSdT ZBdedUdVZCeCejD_<ej9dedWdXZEdedYdZZFeEejG_<eFejH_<eEejI_<d[d\ ZJej9ded]d^ZKeKejL_<d_d` ZMej9dedadbZNeNejO_<ej/dedcddZPePejQ_<dS )fzcthis module contains a set of functions to handle python protocols for nodes
where it makes sense.
    N)Store)	arguments)basescontext)
exceptions)
decorators)node_classes)helpers)nodes)utilraw_buildingobjectsc                 C      d| dd   S )N__r    namer   r   P/var/www/secure340b-portal/env/lib/python3.10/site-packages/astroid/protocols.py_reflected_name,      r   c                 C   r   )NZ__ir   r   r   r   r   r   _augmented_name0   r   r   zcontextlib.contextmanager__add____sub____truediv____floordiv____mul____pow____mod____and____or____xor__
__lshift__
__rshift__
__matmul__)+-///***%&|^<<>>@c                 C   s   i | ]	\}}|t |qS r   )r   .0keyvaluer   r   r   
<dictcomp>E   s    r7   c                 C   s   i | ]\}}|d  t |qS )=)r   r3   r   r   r   r7   H   s    __pos____neg__
__invert__)r&   r'   ~notc                 C   s   t | }|| }t|S N)_UNARY_OPERATORSr   const_factory)objopfuncr6   r   r   r   _infer_unary_opZ   s   
rD   c                 C      t t| j|S r>   )rD   tupleeltsselfrB   r   r   r   <lambda>`       rJ   c                 C      t | j|S r>   )rD   rG   rH   r   r   r   rJ   a       c                 C   rE   r>   )rD   setrG   rH   r   r   r   rJ   b   rK   c                 C   rL   r>   )rD   r6   rH   r   r   r   rJ   c   rM   c                 C   rE   r>   )rD   dictitemsrH   r   r   r   rJ   d   rK   c                 C   s   | | S r>   r   abr   r   r   rJ   i       c                 C   s   | | S r>   r   rQ   r   r   r   rJ   j   rT   c                 C   s   | | S r>   r   rQ   r   r   r   rJ   k   rT   c                 C   s   | | S r>   r   rQ   r   r   r   rJ   l   rT   c                 C   s   | | S r>   r   rQ   r   r   r   rJ   m   rT   c                 C   s   | | S r>   r   rQ   r   r   r   rJ   n   rT   c                 C   s   | | S r>   r   rQ   r   r   r   rJ   o   rT   c                 C   s   | |@ S r>   r   rQ   r   r   r   rJ   p   rT   c                 C   s   | |B S r>   r   rQ   r   r   r   rJ   q   rT   c                 C   s   | |A S r>   r   rQ   r   r   r   rJ   r   rT   c                 C   s   | |> S r>   r   rQ   r   r   r   rJ   s   rT   c                 C   s   | |? S r>   r   rQ   r   r   r   rJ   t   rT   )r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   )      r2   r8   c                 c   s    t t}t|t jrLz2t| }zt || j|jV  W W d S  ty,   |V  Y n ty8   t	j
V  Y nw W d S W d S  tyK   |V  Y d S w t| jtr\|dkr\t	j
V  d S |V  d S )Nr,   )r   ConstNotImplemented
isinstanceBIN_OP_IMPLr@   r6   	TypeError	Exceptionr   Uninferablestr)rI   opnodeoperatorotherr   _not_implementedimplr   r   r   const_infer_binary_op~   s(   


re   c                    s4   | j |d} fdd| jD }t||j |_|S )Nparentc                 3   s,    | ]}|t jurt| pt jV  qd S r>   )r   r]   r
   Z
safe_infer)r4   eltr   r   r   	<genexpr>   s    
z'_multiply_seq_by_int.<locals>.<genexpr>)	__class__rG   listr6   )rI   r_   ra   r   nodeZfiltered_eltsr   r   r   _multiply_seq_by_int   s   
rm   c                 c   sR    | D ]#}|t ju rt V  q||D ]}|t jur |V  qt V  qqd S r>   )r   r]   r   Unknowninfer)rG   r   rh   inferredr   r   r   _filter_uninferable_nodes   s   

rq   c           	      c   s    t t}t|| jr,|dkr,| j|d}ttt| j	|t|j	||_	|V  d S t|t jrK|dkrKt|j
tsA|V  d S t| |||V  d S t|tjrl|dkrlt|}|sbtjV  d S t| |||V  d S |V  d S )Nr&   rf   r*   )r   rW   rX   rY   rj   rk   	itertoolschainrq   rG   r6   intrm   r   Instancer
   Zclass_instance_as_indexr   r]   )	rI   r_   r`   ra   r   methodrc   rl   Zas_indexr   r   r   tl_infer_binary_op   s,   





rw   c                 C   s   | | |S r>   )infer_call_result)rI   r_   r`   ra   r   rv   r   r   r   instance_class_infer_binary_op   s   ry   c           	      c   s    |dd }| d}| D ]e}|tju rqt|dsqz| }W n	 ty+   Y qw |D ]D}t|}z|||}W n t	t
jt
jfyK   Y q.w |sR|V  q.|tju rY nzt||||E dH  W q. t
jyr   Y  nw qdS )z;recursive function to resolve multiple assignments on loopsNr   itered)popr   r]   hasattrrz   r[   r   rW   getitemAttributeErrorr   AstroidTypeErrorAstroidIndexError_resolve_looppartro   InferenceError)	partsassign_pathr   indexpartrz   stmt
index_nodeassignedr   r   r   r      sJ   





r   c                 c   s    t | tjst| ddrt| |||dS |d u r2| j|D ]}t |tjtjfr0|j	E d H  qnt
| j|||E d H  t| |||dS )Nis_asyncFrl   unknownr   r   )rY   r   AsyncForgetattrrO   iterro   TupleListrG   r   )rI   rl   r   r   lstr   r   r   for_assigned_stmts  s   r   c              
   C   sh   |d u rg }z| j |}W n ty$ } z
tjd| ||d|d }~ww |d| | jj| ||dS )Nz6Tried to retrieve a node {node!r} which does not exist)rl   r   r   r   )rl   r   r   )rG   r   
ValueErrorr   r   insertrg   assigned_stmts)rI   rl   r   r   r   excr   r   r   sequence_assigned_stmts  s&   r   c                 C   s   | j j| |dS )N)rl   r   )rg   r   rI   rl   r   r   r   r   r   assend_assigned_stmts6  r   r   c           	      c   s^   | j s| js| jstjV  d S | j rJt| j d dd |krJ| jj}| jj }t	|t
jo2|jdk}|s9|dkr>|V  d S |dkrJt|V  d S |rd|jrdt|j|j}|| j||E d H  d S || jkrvt
d}| |_|V  d S || jkrt
i }| |_|V  d S zt|}| ||E d H  tjV  W d S  tjy   tjV  Y d S w )Nr   r   	metaclassclassmethodrv   r   )argsvarargkwargr   r]   r   rg   typescoperY   r   ClassDefr   ru   callcontextr   CallSiteZextra_contextinfer_argumentr@   
contextmodcopy_contextdefault_valuero   r   Z	NoDefault)	rI   r   r   ZfunctypeclsZis_metaclassZ	call_siter   r   r   r   r   _arguments_infer_argname>  sF   





r   c                 C   sF   |j r|j }t|}d |_ t|}|| j|j|S t| |j|S r>   )	r   r   r   r   r   r   rg   r   r   )rI   rl   r   r   r   r   r   r   r   arguments_assigned_stmtsk  s   

r   c                 c   s<    |s	| j V  d S t| j |||E d H  t| |||dS Nr   )r6   _resolve_assignment_partsro   rO   r   r   r   r   assign_assigned_stmtsy  s   
r   c                 c   s2    t | |||D ]}|d u rtjV  q|V  qd S r>   )r   r   r]   )rI   rl   r   r   rp   r   r   r   assign_annassigned_stmts  s   
r   c              
   c   s    |dd }| d}| D ]n}d}t|tjr-z	|j| \}}W n- ty,   Y  dS w t|drOt|}z|||}W n t	j
t	jfyN   Y  dS w |sT dS |sZ|V  q|tju rb dS zt||||E dH  W q t	jy|   Y  dS w dS )z2recursive function to resolve multiple assignmentsNr   r}   )r{   rY   r   DictrP   
IndexErrorr|   rW   r}   r   r   r   r   r]   r   ro   r   )r   r   r   r   r   r   rb   r   r   r   r   r     s@   



r   c                 c   s@    t | jD ]}t|tjrt|}|V  qt| |||dS r   )	r	   Zunpack_inferr   rY   r   r   r   ZExceptionInstancerO   )rI   rl   r   r   r   r   r   r   excepthandler_assigned_stmts  s   
r   c           
   	   #   s~   t |j|d}t|tjrt|j  jstjd d jj	D ]}t ||}t|t	j
r7| tkr7 nq tj d t	j}t  fdd|D d }|rr|jsft	d }||_|j|_|V  d S |jj|dE d H  d S d S t|tjrzt |jd|d}	W n tjtjfy   tj|dw t|	tjstj|	d|jstj|gd|_|	| |E d H  d S tj|d)Nr   z,No decorators found on inferred generator %srl   c                 3   s     | ]}|   kr|V  qd S r>   )r   )r4   rl   rC   r   r   ri         z)_infer_context_manager.<locals>.<genexpr>	__enter__)r   )nextro   rY   r   	Generatorrg   r   r   r   r   FunctionDefqname_CONTEXTLIB_MGRnodes_of_classYieldr6   rW   linenoru   ZigetattrZAttributeInferenceErrorZBoundMethodr   r   ZCallContextrx   )
rI   mgrr   rp   Zdecorator_node	decoratorZpossible_yield_pointsZyield_pointconstZenterr   r   r   _infer_context_manager  sN   

r   c           	      #   s   zt  fdd| jD }W n
 ty   Y dS w |du r(t| ||E dH  nVt| ||D ]O}|}|D ]E}t|dsEtjd|  ||dz|j| }W q4 tyc } ztjd|  ||d|d}~w t	yy } ztjd|  ||d|d}~ww |V  q.t
|  ||d	S )
a  Infer names and other nodes from a *with* statement.

    This enables only inference for name binding in a *with* statement.
    For instance, in the following code, inferring `func` will return
    the `ContextManager` class, not whatever ``__enter__`` returns.
    We are doing this intentionally, because we consider that the context
    manager result is whatever __enter__ returns and what it is binded
    using the ``as`` keyword.

        class ContextManager(object):
            def __enter__(self):
                return 42
        with ContextManager() as f:
            pass

        # ContextManager().infer() will return ContextManager
        # f.infer() will return 42.

    Arguments:
        self: nodes.With
        node: The target of the assignment, `as (a, b)` in `with foo as (a, b)`.
        context: Inference context used for caching already inferred objects
        assign_path:
            A list of indices, where each index specifies what item to fetch from
            the inference results.
    c                 3   s     | ]\}}| kr|V  qd S r>   r   )r4   r   varsr   r   r   ri     r   z&with_assigned_stmts.<locals>.<genexpr>NrG   z0Wrong type ({targets!r}) for {node!r} assignment)rl   targetsr   r   zCTried to infer a nonexistent target with index {index} in {node!r}.z1Tried to unpack a non-iterable value in {node!r}.r   )r   rP   StopIterationr   r|   r   r   rG   r   r[   rO   )	rI   rl   r   r   r   resultrA   r   r   r   r   r   with_assigned_stmts  s\   
r   c              
   #   s    fdd |   }t|tjtjfstjd| |||d|du r&t }t|tjr|j	}|j
d }tdd |tjD d	krMtjd
| |||dz	t||}W n tjye   tjV  Y dS w |tju spt|dsvtjV  dS z	t| }W n ty   tjV  Y dS w t|jD ]G\}	}
t|
tjs|s n:|  qtt|j|	d }|D ]%}t|tjs|s n|  qtjt| |j|jd}|j |d |V   qt|tjrzt|j!j|d}W n tjy   tjV  Y dS w |tju s	t|dstjV  dS z| }W n ty$   tjV  Y dS w |j"}t|tj#s6tjd|dg } | || |sHtjd|d|d \}}||d	 k}t$||r[dn|| }||d< |D ]]}d}|D ]=}t|dsv n4t|t$s|d }z
| }|| }W n t%y   Y  n ty   tjV  Y   dS w |}qltjt| | j| jd}|j |pg d |V   dS tjV  dS dS )aD  
    Arguments:
        self: nodes.Starred
        node: a node related to the current underlying Node.
        context: Inference context used for caching already inferred objects
        assign_path:
            A list of indices, where each index specifies what item to fetch from
            the inference results.
    c                    s   |  }t|D ]5\}}t|tjr&|jj| jjkr&||t|f  d S t|tj	r=||t|  f  | || qd S r>   )
rz   	enumeraterY   r   Starredr6   r   appendlenr   )Zstarredtargetlookupsrz   r   element$_determine_starred_iteration_lookupsr   r   r   M  s   
zDstarred_assigned_stmts.<locals>._determine_starred_iteration_lookupszDStatement {stmt!r} enclosing {node!r} must be an Assign or For node.)rl   r   r   r   Nr   c                 s   s    | ]}d V  qdS )   Nr   )r4   rb   r   r   r   ri   l  s    z)starred_assigned_stmts.<locals>.<genexpr>r   z>Too many starred arguments in the  assignment targets {lhs!r}.)rl   r   r   r   rz   )ctxrg   r   
col_offset)rG   r   z8Could not make sense of this, the target must be a tuplez5Could not make sense of this, needs at least a lookup)&Z	statementrY   r   AssignForr   r   r   ZInferenceContextr6   r   sumr   r   r   ro   r   r]   r|   collectionsdequerz   r[   r   rG   popleftreversedr{   r   r   r   r   Zpostinitr   r   r   slicer   )rI   rl   r   r   r   r6   lhsrhsrG   r   Z	left_nodeZlhs_eltsZ
right_nodepackedZinferred_iterablerz   r   r   Zlast_element_indexZlast_element_lengthZis_starred_lastZlookup_slicer   Zfound_elementlookupZitered_inner_elementunpackedr   r   r   starred_assigned_stmtsA  s   

r   )NNN)R__doc__r   r`   Zoperator_modsysrr   Zastroidr   r   r   r   r   r   r   r	   r
   r   r   Zlazy_importr   r   r   r   r   ZBIN_OP_METHODrP   ZREFLECTED_BIN_OP_METHODZAUGMENTED_OP_METHODZUNARY_OP_METHODposneginvertnot_r?   rD   r   Zinfer_unary_opr   SetrW   r   rZ   version_infomatmulrk   Z_KEYZ_IMPLZyes_if_nothing_inferredre   Zinfer_binary_oprm   rq   rw   ry   ru   r   r   Zraise_if_nothing_inferredr   r   r   ZComprehensionr   r   Z
AssignNameZ
AssignAttrr   r   	Argumentsr   r   r   	AnnAssign	AugAssignr   r   ExceptHandlerr   r   Withr   r   r   r   r   r   <module>   s   






(


-
(	1E 2