
    BVh(                         d Z ddlZddlZddlmZ ddlmZ ddlmZ  G d de      ZddZ	 G d	 d
ej                        Zd Zd Z G d dej                        Zd Zd Zd Zy)zAST manipulation utilities.    N)anno)parser)
qual_namesc                   (     e Zd ZdZ fdZd Z xZS )CleanCopierz0NodeTransformer-like visitor that copies an AST.c                 8    t         t        |           || _        y N)superr   __init__preserve_annos)selfr   	__class__s     Y/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/autograph/pyct/ast_util.pyr   zCleanCopier.__init__   s    	+t%'(D    c                     t        |t              r|D cg c]  } j                  |       c}S t        |t              rt         fd|D              S t        |t        j
                  t        j
                  f      s|S t        |t        j
                  t        j
                  f      sJ i }|j                  D ]?  }|j                  d      rt        ||      s" j                  t        ||            ||<   A  t        |      di |} j                  r( j                  D ]  }t        j                  |||        |S c c}w )zDReturns a deep copy of node (excluding some fields, see copy_clean).c              3   @   K   | ]  }j                  |        y wr	   )copy).0nr   s     r   	<genexpr>z#CleanCopier.copy.<locals>.<genexpr>'   s     .A499Q<.   __ )
isinstancelistr   tuplegastASTast_fields
startswithhasattrgetattrtyper   r   copyanno)r   noder   
new_fieldsfnew_nodeks   `      r   r   zCleanCopier.copy!   s    $$()qdiil))	D%	 ....txx12 kdTXXsww/000J\\ 4\\$GD!$4		'$"23
14 tDz'J'H"" )!dHa()O' *s   E)__name__
__module____qualname____doc__r   r   __classcell__)r   s   @r   r   r      s    8)r   r   c                 6    t        |      j                  |       S )a"  Creates a deep copy of an AST.

  The copy will not include fields that are prefixed by '__', with the
  exception of user-specified annotations.

  Args:
    node: ast.AST
    preserve_annos: Optional[Set[Hashable]], annotation keys to include in the
        copy
  Returns:
    ast.AST
  )r   r   )r&   r   s     r   
copy_cleanr1   ;   s     
^	$	)	)$	//r   c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)SymbolRenamerz6Transformer that can rename symbols to a simple names.c                     || _         y r	   )name_map)r   r5   s     r   r   zSymbolRenamer.__init__N   s	    DMr   c                 t   t        j                  |t         j                  j                        }|| j                  v rlt        j                  t        | j                  |         |j                  d d       }t        j                  |      D ]  }t        j                  |||        |S | j                  |      S )N)ctx
annotationtype_comment)r   getannoBasicQNr5   r   Namestrr7   keysr%   generic_visit)r   r&   qnr)   r*   s        r   _process_name_nodez SymbolRenamer._process_name_nodeQ   s    	dDJJMM	*B	T]]
dmmB
 hh	h yy )!dHa()od##r   c                     t        t        |            D ]D  }t        j                  ||         }|| j                  v s*t        | j                  |         ||<   F |S r	   )rangelenr   r<   r5   r>   )r   namesirA   s       r   _process_list_of_stringsz&SymbolRenamer._process_list_of_strings_   sV    3u: *==q"b	t}}	t}}R()a* Lr   c                 F    | j                  |j                        |_        |S r	   rH   rF   r   r&   s     r   visit_NonlocalzSymbolRenamer.visit_Nonlocalf       ..tzz:DJKr   c                 F    | j                  |j                        |_        |S r	   rJ   rK   s     r   visit_GlobalzSymbolRenamer.visit_Globalj   rM   r   c                 $    | j                  |      S r	   )rB   rK   s     r   
visit_NamezSymbolRenamer.visit_Namen   s    ""4((r   c                     t        j                  |t         j                  j                        r| j	                  |      S | j                  |      S r	   )r   hasannor;   r<   rB   r@   rK   s     r   visit_AttributezSymbolRenamer.visit_Attributeq   s:    ||D$**--($$T**d##r   c                     t        j                  |j                        }|| j                  v rt	        | j                  |         |_        | j                  |      S r	   )r   r<   namer5   r>   r@   )r   r&   rA   s      r   visit_FunctionDefzSymbolRenamer.visit_FunctionDefw   sF    	tyy	!B	T]]dmmB'(did##r   N)r+   r,   r-   r.   r   rB   rH   rL   rO   rQ   rT   rW   r   r   r   r3   r3   K   s-    >$)$$r   r3   c                     t        |      t        | t              r| D cg c]  }j                  |       c}S t        | t              rt	        fd| D              S j                  |       S c c}w )z;Renames symbols in an AST. Requires qual_names annotations.c              3   @   K   | ]  }j                  |        y wr	   )visit)r   r   renamers     r   r   z!rename_symbols.<locals>.<genexpr>   s     0aq!0r   )r3   r   r   rZ   r   )r&   r5   r   r[   s      @r   rename_symbolsr\   ~   s`    (#'d&*+GMM!++$04000	t	 ,s   A1c                     g }g }| D ]M  }|j                  t        j                  |j                  d             |j                  |j                         O t        j
                  ||      S )z1Converts a list of ast.keyword objects to a dict.N)kind)r?   values)appendr   ConstantargvalueDict)keywordsr?   r_   kws       r   keywords_to_dictrg      sY    	$& bKKbff401
MM"(( 
V	,,r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)PatternMatcherz7Matches a node against a pattern represented by a node.c                 .    || _         g | _        d| _        y )NT)patternpattern_stackmatches)r   rk   s     r   r   zPatternMatcher.__init__   s    DLDDLr   c                     | j                   j                  | j                         || _        | j                  |       | j                   j	                         | _        y r	   )rl   r`   rk   r@   pop)r   r&   rk   s      r   compare_and_visitz PatternMatcher.compare_and_visit   sE    dll+DLt%%))+DLr   c                     d| _         y)NF)rm   )r   s    r   no_matchzPatternMatcher.no_match   s    DLr   c                     t        |t        t        f      rt        |      dk(  r|\  }t        |t        j
                        r|j                  dk(  ry|dk(  ryy)N   _TF)r   r   r   rE   r   r=   id)r   ps     r   is_wildcardzPatternMatcher.is_wildcard   sI    !dE]#A!ba!TYYADDCKCxr   c                    | j                   sy | j                  }|j                  D ]  }|j                  d      rt	        ||      s+t	        ||      rt        ||      r| j                         c S Mt	        ||      s| j                         c S t        ||      }t        ||      }| j                  |      rt        |t        t        f      rgt        |t        t        f      rt        |      t        |      k7  r| j                         c S t        ||      D ]  \  }}| j                  ||        t        |t        j                  t         j                  f      rPt        |t#        |            s't        |t#        |            s| j                         c S | j                  ||       ||k7  s| j                         c S  y )Nr   )rm   rk   r    r!   r"   r#   rr   rx   r   r   r   rE   ziprp   r   r   r   r$   )r   r&   rk   r(   vrw   v_itemp_items           r   r@   zPatternMatcher.generic_visit   se   <<llG\\ !	
d	T17A77A#6
 
Wa }}
$
a
'1
a			!		Ae}	%!dE]+s1vQ/?
 !!Qi 	1NFF

 
 
0	1a$((CGG,-!T!W%jDG.D
 q!$ 6
 ;!r   N)	r+   r,   r-   r.   r   rp   rr   rx   r@   r   r   r   ri   ri      s    ?
,"!r   ri   c                     t        |t              rt        j                  |      }t	        |      }|j                  |        |j                  S )a5  Basic pattern matcher for AST.

  The pattern may contain wildcards represented by the symbol '_'. A node
  matches a pattern if for every node in the tree, either there is a node of
  the same type in pattern, or a Name node with id='_'.

  Args:
    node: ast.AST
    pattern: ast.AST
  Returns:
    bool
  )r   r>   r   	parse_strri   rZ   rm   )r&   rk   matchers      r   rm   rm      s>     w'G7#'	--	r   c                 .   t        | t        t        f      s| f} | D ]  }t        |t        j                  t        j
                  f      rt        t        |j                              D ]  }|j                  |   }t        |t        j                  t        j
                  f      r|j                  |   }nHt        j                  t        |            }t        j                  ||t        j                               }t        |||         |||        y)a  Applies a function to each individual assignment.

  This function can process a possibly-unpacked (e.g. a, b = c, d) assignment.
  It tries to break down the unpacking if possible. In effect, it has the same
  effect as passing the assigned values in SSA form to apply_fn.

  Examples:

  The following will result in apply_fn(a, c), apply_fn(b, d):

      a, b = c, d

  The following will result in apply_fn(a, c[0]), apply_fn(b, c[1]):

      a, b = c

  The following will result in apply_fn(a, (b, c)):

      a = b, c

  It uses the visitor pattern to allow subclasses to process single
  assignments individually.

  Args:
    targets: Union[List[ast.AST, ...], Tuple[ast.AST, ...], ast.AST, should be
        used with the targets field of an ast.Assign node
    values: ast.AST
    apply_fn: Callable[[ast.AST, ast.AST], None], called with the
        respective nodes of each single assignment
  )r7   N)r   r   r   r   TupleListrD   rE   eltsr   parse_expressionr>   	SubscriptLoadapply_to_single_assignments)targetsr_   apply_fntargetrG   	target_elvalue_elidxs           r   r   r      s    > 
GdE]	+jG f&4::tyy12S%& C!KKN	ftzz49956[[^(''A/#^^FCTYY[A(#IxBC vvr   c              #     K   t        | t        t        f      rt        |       }n| g}t        |t        t        f      rt        |      }n|g}|r|rt        |      t        |      k(  sJ |j	                         }|j	                         }t        |t
        j                  t        j                  t        f      s|^t        |t
        j                  t        j                  t        f      s|-|j                  j                  |j                  j                  k7  rEt        dj                  ||j                  j                  ||j                  j                              ||f t        |t              rt        |t              sJ d       B||J d       O|j                  D ]$  }t        ||d      }t        ||d      }|j                  d      s||4t        |t        t        f      rlt        |t        t        f      rt        |      t        |      k7  rt        dj                  |||            |j!                  |       |j!                  |       t        |t        j                  t
        j                  f      r$|j#                  |       |j#                  |       ||k7  st        dj                  |||             |r|ryyyyw)a!  Walks two ASTs in parallel.

  The two trees must have identical structure.

  Args:
    node: Union[ast.AST, Iterable[ast.AST]]
    other: Union[ast.AST, Iterable[ast.AST]]
  Yields:
    Tuple[ast.AST, ast.AST]
  Raises:
    ValueError: if the two trees don't have identical structure.
  Nz'inconsistent nodes: {} ({}) and {} ({})z(The check above should have ensured thisr   z+inconsistent values for field {}: {} and {})r   r   r   rE   ro   r   r   r   r>   r   r+   
ValueErrorformatr    r#   r!   extendr`   )	r&   other
node_stackother_stackr   or(   n_childo_childs	            r   parallel_walkr     sh     tUm$dJJe}%u+K'K{z?c+....AACGGTXXs34CGGTXXs34	 4 44@GG
Q[[!!1akk&:&:< = = Q$J!S3K!KKyYBBBYYY &1d#g1d#g	
d	w'/	GdE]	+7T5M2LCL(;BBWg'( ( 	'"7#g#''23'"7#g9@@7G%& 	&)&) 	{
{
s   J/K3!KKr	   )r.   r   r    tensorflow.python.autograph.pyctr   r   r   objectr   r1   NodeTransformerr3   r\   rg   NodeVisitorri   rm   r   r   r   r   r   <module>r      sl    " 
  1 3 7& B0 0$D(( 0$f-=!T%% =!@,,^A&r   