
    ^h                         S SK r S SKrS SKrS SKrS SKJr  S SKJrJrJ	r	J
r
JrJrJrJrJrJr  S SKJrJrJr  S SKJr  S SKJrJr  \(       a  S SKJr  S SKJr  S S	KJr  OS S
K J!r  \RD                  S:  a  \ RF                  r$O\ RJ                  r$ " S S\ RL                  5      r'\S\ RP                  S\\'SS4   4S j5       r)S\ RP                  S\ RP                  4S jr*SS\+S\,S\ RZ                  4S jjr. SS\\\\+\ RZ                  4         S\\ R^                     S\ RZ                  4S jjr0S\ Rb                  S\ RZ                  4S jr2 " S S5      r3g)    N)contextmanager)
TYPE_CHECKINGCallableDefaultDictDict	GeneratorIterableListOptionalSetUnion)
EMIT_EVENTPYCCOLO_BUILTIN_PREFIXTRACE_LAMBDA)StatementMapper)BEFORE_EXPR_EVENTS
TraceEvent)fast)GUARD_DATA_T)
BaseTracer)FastAst)      c                   x   ^  \ rS rSr\ S3rS\R                  SS4U 4S jjrS\R                  SS4S jr	S	r
U =r$ )
_SaveParentsVisitor%   _has_parent_Xix54321nodereturnNc                 h   > [        US5      (       a  U R                  Ul        [        TU ]  U5        g Nparent)hasattr
has_parentr"   supergeneric_visit)selfr   	__class__s     V/home/james-whalen/.local/lib/python3.13/site-packages/pyccolo/_fast/misc_ast_utils.pyr&   !_SaveParentsVisitor.generic_visit(   s(    4""//DKd#    treec                     [         R                  " U5       HC  n[         R                  " U5       H&  n[        USS 5      U R                  :X  d  M   X#l        M(     ME     g r!   )astwalkiter_child_nodesgetattrr$   r"   )r'   r,   r   childs       r)   reinject_SaveParentsVisitor.reinject-   sC    HHTND--d35(D1T__D#'L 4 #r+    )__name__
__module____qualname____firstlineno__r   r$   r.   ASTr&   r3   __static_attributes____classcell__)r(   s   @r)   r   r   %   sD    *++?@J$#'' $d $
(SWW ( ( (r+   r   r   r   c              #   J   #    [        5       nUR                  U 5        Uv   g 7fN)r   visit)r   visitors     r)   _save_parentsrA   4   s     !#GMM$
Ms   !#c                     [        U 5       n[        R                  " [        R                  " U 5      5      nS S S 5        WR	                  W5        U$ ! , (       d  f       N!= fr>   )rA   pickleloadsdumpsr3   )r   parents	node_copys      r)   copy_astrH   ;   sE    	t	LLd!34	 
Y 
	s   +A
A var_namenegatec                     [         R                  " U [        R                  " 5       5      nU(       a(  [         R                  " U[        R
                  " 5       S9nU$ )N)operandop)r   Namer.   LoadUnaryOpNot)rI   rJ   rets      r)   	make_testrS   B   s6    IIh
3Cll337795Jr+   nullable_conditionsrM   c                 D   U  Vs/ s HI  nUc  M  [        U[        5      (       a*  [        R                  " U[        R
                  " 5       5      OUPMK     nn[        U5      S:X  a  US   $ U=(       d    [        R                  " 5       n[        R                  " XS9$ s  snf )N   r   )rM   values)	
isinstancestrr   rN   r.   rO   lenAndBoolOp)rT   rM   cond
conditionss       r)   make_composite_conditionr_   I   s     ('D 	Gz$'<'<		$
#$F'  
 :!!}		txxzB;;"00s   BABc                     [        U R                  [        R                  5      (       a  U R                  R                  $ U R                  $ r>   )rX   slicer.   Indexvalue)r   s    r)   subscript_to_slicerd   X   s1    $**cii((zzzzr+   c                      \ rS rSrSSS\S\\\R                  4   S\	\
\S\4   4   S\	\
\S\4   4   S	\	\
\S
   4   4S jr\S\R                  S\R                  S\S   4S j5       r\S\	\
\S\4   4   4S j5       r\S\R                  4S j5       rS\SS4S jr\\4S\R2                  4S jj5       rS\\\R                  4   S\R                  4S jrS\\\R                  4   S\4S jr S!S\R>                  S\ \\RB                        S\RD                  4S jjr#  S"S\
S\\\R                  4   S\\RD                  \RH                  4   4S jjr%S r&g)#EmitterMixin_   tracerszList[BaseTracer]mapperorig_to_copy_mappinghandler_predicate_by_event.'guard_exempt_handler_predicate_by_eventhandler_guards_by_eventr   c                     Xl         X l        X0l        X@l        UU l        X`l        US   R                  U l        [        S U 5       5      U l        SU l	        g )Nc              3   8   #    U  H  oR                   v   M     g 7fr>   )global_guards_enabled).0tracers     r)   	<genexpr>(EmitterMixin.__init__.<locals>.<genexpr>t   s      )
7>V((ws   F)
rh   ri   rj   _handler_predicate_by_event(_guard_exempt_handler_predicate_by_eventrm   guardsanyrq   _is_guard_exempt_context)r'   rh   ri   rj   rk   rl   rm   s          r)   __init__EmitterMixin.__init__`   sb     $8!+E(3 	5 (?$ ' 2 2%( )
7>)
 &
" ).%r+   r   guard_exempt_noder   )NNNc              #      #    U R                  X R                  [        U5         5      nU R                  nU R                  n SU l        X0l        S v   X@l        XPl        g ! X@l        XPl        f = f7fNT)ri   rj   idrz   )r'   r   r}   new_orig_to_copy_mappingorig_is_guard_exempt_contextorig_orig_to_copy_mappings         r)   guard_exempt_context!EmitterMixin.guard_exempt_contexty   su      $(;;88DB$
  (,'D'D$$($=$=!	B,0D)(@%,H)(A% -I)(A%s   A A2A! A2!A//A2c                 T    U R                   (       a  U R                  $ U R                  $ r>   )rz   rw   rv   )r'   s    r)   rk   'EmitterMixin.handler_predicate_by_event   s%     ((@@@333r+   c                    [        U [        R                  5      (       d  g[        U R                  5      S:w  a  gU R                  S   R
                  n[        U[        R                  5      (       d  gUR                  n[        U[        R                  5      (       d  g[        UR                  [        R                  5      =(       a/    UR                  R                  S:H  =(       a    UR                  S:H  $ )NFrV   r   pyctracing_disabled)rX   r.   WithrZ   itemscontext_exprCallfunc	Attributerc   rN   r   attr)r   exprr   s      r)   is_tracing_disabled_context(EmitterMixin.is_tracing_disabled_context   s    $))tzz?azz!}))$))yy$..tzz388, 0

&0		//	
r+   guardNc                 \    U R                   R                  U5        [        [        US5        g r   )rx   addsetattrbuiltins)r'   r   s     r)   register_guardEmitterMixin.register_guard   s    %&r+   c                 V    [         R                  " U [        R                  " 5       5      $ r>   )r   rN   r.   rO   )names    r)   make_func_nameEmitterMixin.make_func_name   s    yysxxz**r+   orig_node_idc                 `    [        U[        5      (       d  [        U5      nU R                  U   $ r>   )rX   intr   rj   r'   r   s     r)   get_copy_nodeEmitterMixin.get_copy_node   s*    ,,,l+L((66r+   c                 ^    [         R                  " [        U R                  U5      5      5      $ r>   )r   Numr   r   r   s     r)   get_copy_id_astEmitterMixin.get_copy_id_ast   s!    xx4--l;<==r+   bodyargsc                     [         R                  " U R                  [        5      [         R                  " U[
        R                  " Uc  / OU/ / / / S9S9/S9$ )N)r   defaults
kwonlyargskw_defaultsposonlyargs)r   r   r   r   )r   r   r   r   Lambdar.   	arguments)r'   r   r   s      r)   make_lambdaEmitterMixin.make_lambda   sX     yy$$\2#'<RT!##%$&$&	
 	
r+   evt
node_or_idc           	      R   U=(       d    / nU=(       d    / nU[         ;   a  SU;   a  US   n[        U[        R                  5      (       aG  [        UR                  [        R
                  5      (       a  UR                  R                  [        :w  a  U R                  U5      US'   U R                  R                  US 5      n0 nUb%  U H  u  pU
" U5      nUc  M  X[        U	5      '   M!     [        U5      S:X  a  [        R                  " S 5      US'   O~[        R                  " UR                  5        Vs/ s H  n[        R                   " U5      PM     snUR#                  5        Vs/ s H  n[        R$                  " U5      PM     snS9US'   [        R                  " U R'                  5       UR)                  5       U R+                  U5      /U-   [        R,                  " S
0 UD6S9nU[         ;   a  [        R                  " XS9n[        U5      S:  a  UR#                  5        H!  nU R.                  S   R1                  U5        M#     [        R2                  " [5        UR#                  5       [        R6                  " 5       S9U R9                  U5      US	9nU$ s  snf s  snf )NrR   r   guards_by_handler_spec_id)keysrW   )r   r   keywordsr   ro   )rM   )testr   orelser5   )r   rX   r.   r   r   rN   r   r   r   rm   getrZ   r   NameConstantr   r   r   rW   Strr   to_astr   kwargsrh   register_local_guardIfExpr_   Orr   )r'   r   r   r   before_expr_argsr   
kwargs_retlocal_guard_makerslocal_guardsspecmakerguardvalkvrR   r   s                   r)   emitEmitterMixin.emit   s,    zr+1r$$&Jz38844!*//388<<??%%5 $ 0 0 <u!99==c4H)1 ,'-5D*  2 |!262C2CD2IF./26))+7+<+<+>?+>adhhqk+>?-9-@-@-BC-B-BC3F./ +/))$$&**, 4 4Z @ADH[[*6*+

 $$))<C|q %,,.R 55e< /**-l.A.A.CQ''
3C
 
% @Cs   7 J+ J$
)	rw   rv   rz   rq   rx   rm   ri   rj   rh   r>   )NN)'r6   r7   r8   r9   r   r   r   r.   r:   r   r   r   boolr
   r{   r   r   r   propertyrk   staticmethodr   rY   r   r   rN   r   r   r   NumConstr   r   r   argr   r   r   r   r;   r5   r+   r)   rf   rf   _   s   .#.  . #3<0	.
 %0
HS$Y<O0O$P. 2=d++2
. "-Zn9M-M!N.2 BGGB03B	#	$B B  4	Z#t)!44	54 4 
#'' 
 
"'C 'D ' & +388 + +7%SWW*= 7#'' 7
>E#sww,,? >H > ?C
HH
$,T#'']$;
	
. // #sww,'/ 
sxx"	#/ /r+   rf   )Fr>   )4r.   r   rC   sys
contextlibr   typingr   r   r   r   r   r	   r
   r   r   r   pyccolo.extra_builtinsr   r   r   pyccolo.stmt_mapperr   pyccolo.trace_eventsr   r   pyccolor   pyccolo.ast_rewriterr   pyccolo.tracerr   pyccolo._fast.fast_astr   version_infor   r   ConstantNodeVisitorr   r:   rA   rH   rY   r   r   rS   boolopr_   	Subscriptrd   rf   r5   r+   r)   <module>r      sL   
   
 %   T S / ?1)6fwwH||H(#// (  I.A4.M$N  377 sww  T chh   $1!(5chh+?"@A11 	XX1S]] sxx X Xr+   