o
    DDia                  	   @   s  U d dl Z d dlmZmZ d dlmZmZmZmZm	Z	m
Z
mZmZ d dlZd dlmZmZ d dlmZmZ eeeZe	e ed< dZdZG d	d
 d
ejZG dd dejZG dd dejZdejdee dejfddZ G dd dejZ!dejdejfddZ"dejdej#fddZ$dedejdejfddZ%G dd dejZ&G d d! d!ejZ'dej#fd"d#Z(dej#fd$d%Z)d&ejd'ej#d(ej#dej*fd)d*Z+e Z,e	e ed+< ed,d-G d.d/ d/Z-ed,d-G d0d1 d1Z.d&ej/dee fd2d3Z0d&ej/dee fd4d5Z1d6ee- dee d7ej*dejfd8d9Z2d6ee- d:ejdejfd;d<Z3d6ee- d:ej#dej#fd=d>Z4d6ee- d:ej*dejfd?d@Z5d6ee- d:ej*dejfdAdBZ6dCe7de
eee- f fdDdEZ8d&eej/ dee.ddf fdFdGZ9e Z:e	e edH< g Z;ee edI< e;<dJ e;<dK e;<dL e;<dM e;<dN e;<dN e;<dO e;<dP e;<dQ e;<dR e;<dN e;<dS e:=g dT e;<dU e:=g dV e;<dW e:=g dX e;<dN e;<dN e;<dY e;<dZ eD ]"Z>e;<dN e;<dN e;<d[e>j? d\ e;<d] e:@e>j? qe;<dN e;<dN e;<d^ eD ]ZAeAj?Bd_r7q,g ZCee ed`< eD ]ZDeEeAeDrOeC<eDj? qAeC<da dbZFeGe9eAZHeHD ]%ZIeIjJD ]ZKeFsve;<dN e;<dN d,ZFe;<eKjL dceKjM  qeq`e;<dN e;<dN e;<dd e;<d[eAj? dedfNeC dg e:@eAj? dbZOeHD ]ZId,ZOe;<dheIjL dieIjM dj qe;<dk q,e;<dlePeQe:  e?dmkreRdnNe; dS dS )o    N)	dataclassfields)	GeneratorListOptionalSequenceSetTupleTypeUnion)ensure_typeparse_expression)all_libcst_nodestypeclassesCST_DIRz<class \'(.*?)\'>z"typing\.Union\[([^,]*?), NoneType]c                   @   sR   e Zd ZdZdejdejdejfddZdejdejdeejejf fddZ	d	S )
NormalizeUnionsa  
    Convert a binary operation with | operators into a Union type.
    For example, converts `foo | bar | baz` into `typing.Union[foo, bar, baz]`.
    Special case: converts `foo | None` or `None | foo` into `typing.Optional[foo]`.
    Also flattens nested typing.Union types.
    original_nodeupdated_nodereturnc                 C   s   t |jtjrzt |jjtjrz|jjjdkrz|jjjdkrzg }|jD ]B}t |jtjs,q"|jj}t |tjr_t |jtjr_t |jjtjr_|jjjdkr_|jjjdkr_|	dd |jD  q"|
| q"tttdtddd |D S |S )Nr   typingc                 s   s&    | ]}t |jtjr|jjV  qd S N
isinstanceslicecstIndexvalue).0
nested_slc r   [/var/www/Datamplify/venv/lib/python3.10/site-packages/libcst/codegen/gen_matcher_classes.py	<genexpr>3   s    
z2NormalizeUnions.leave_Subscript.<locals>.<genexpr>c                 S      g | ]
}t t |qS r   r   SubscriptElementr   r   operandr   r   r    
<listcomp>>       z3NormalizeUnions.leave_Subscript.<locals>.<listcomp>)r   r   r   	AttributeNameattrr   r   	Subscriptextendappend)selfr   r   operandsslcr   r   r   r    leave_Subscript   s8   



zNormalizeUnions.leave_Subscriptc                    s   |j t s
|S dtjdttj f fdd  |}tdd |D }|dkrPt|dkrPtd	d |D }t	t
td
tdtt|gS t	t
td
tddd |D S )Nnoder   c                    s   t | tjs4t | tjr1t | jtjr1t | jjtjr1| jjjdkr1| jjjdkr1dd | jD S | gS | j	
t s?| gS  | j} | j}|| S )z8Flatten a binary operation tree into a list of operands.r   r   c                 S   s"   g | ]}t |jtjr|jjqS r   r   r   r1   r   r   r    r'   S   s    zTNormalizeUnions.leave_BinaryOperation.<locals>.flatten_binary_op.<locals>.<listcomp>)r   r   BinaryOperationr,   r   r)   r*   r+   r   operatordeep_equalsBitOrleftright)r3   left_operandsright_operandsflatten_binary_opr   r    r>   H   s$   


z@NormalizeUnions.leave_BinaryOperation.<locals>.flatten_binary_opc                 s   s*    | ]}t |tjr|jd krdV  qdS )None   Nr   r   r*   r   r   opr   r   r    r!   d   s    z8NormalizeUnions.leave_BinaryOperation.<locals>.<genexpr>r@      c                 s   s*    | ]}t |tjr|jd ks|V  qdS )r?   NrA   rB   r   r   r    r!   i   s    

r   r   r   c                 S   r"   r   r#   r%   r   r   r    r'   v   r(   z9NormalizeUnions.leave_BinaryOperation.<locals>.<listcomp>)r6   r7   r   r8   BaseExpressionr   sumlennextr,   r)   r*   r$   r   )r/   r   r   r0   
none_countnon_noner   r=   r    leave_BinaryOperationB   s&   z%NormalizeUnions.leave_BinaryOperationN)
__name__
__module____qualname____doc__r   r,   r2   r5   r   rK   r   r   r   r    r      s     
'r   c                   @   s   e Zd ZdejdejdejfddZdejdejdeejej	f fddZ
dej	dej	deej	ejf fdd	Zdejdejdeejejf fd
dZdS )CleanseFullTypeNamesr   r   r   c                 C   sB   t |jtjr|jtds|jtdr|jd jS |S )N_ForwardRef
ForwardRefr   )r   funcr   r*   r7   argsr   r/   r   r   r   r   r    
leave_Call{   s   zCleanseFullTypeNames.leave_Callc                 C   s   |j S r   )r+   rU   r   r   r    leave_Attribute   s   z$CleanseFullTypeNames.leave_Attributec                 C   s>   |j }|dkr|jddS |tv r|dstt|S |S )NNoneTyper?   )r   Sentinel)r   with_changesr   endswithr   SimpleStringreprr/   r   r   r   r   r   r    
leave_Name   s   zCleanseFullTypeNames.leave_Namec                 C   sF   |j }t|tjr|j}t|tjrd|jv rt S |jtjj	dS )NrY   )comma)
r   r   r   r   r   r*   RemoveFromParentrZ   MaybeSentinelDEFAULTr/   r   r   r1   valr   r   r    leave_SubscriptElement   s   
z+CleanseFullTypeNames.leave_SubscriptElementN)rL   rM   rN   r   CallrE   rV   r)   r   r*   rW   r\   r_   r$   RemovalSentinelrf   r   r   r   r    rP   z   s:    


rP   c                   @   sH   e Zd Zdee ddfddZdejdejdeejej	f fdd	Z
dS )
RemoveTypesFromGenericvaluesr   Nc                 C   s   t || _d S r   )setrj   )r/   rj   r   r   r    __init__   s   zRemoveTypesFromGeneric.__init__r   r   c                 C   s<   |j }t|tjr|j}t|tjr|j| jv rt S |S r   )r   r   r   r   r   r*   rj   ra   rd   r   r   r    rf      s   z-RemoveTypesFromGeneric.leave_SubscriptElement)rL   rM   rN   r   strrl   r   r$   r   rh   rf   r   r   r   r    ri      s    ri   oldtyperj   r   c                 C   s   t | t|tjS )z
    Given a BaseExpression from a type, return a new BaseExpression that does not
    refer to any types listed in values.
    )r   visitri   r   rE   )rn   rj   r   r   r    _remove_types   s   rp   c                   @   s2   e Zd Zdejdejdeejejf fddZdS )MatcherClassToLibCSTClassr   r   r   c                 C   s*   |j }|tv rttdt|S |S )Nr   )evaluated_valuer   r   r)   r*   r^   r   r   r    leave_SimpleString   s   z,MatcherClassToLibCSTClass.leave_SimpleStringN)rL   rM   rN   r   r\   r   r)   rs   r   r   r   r    rq      s    rq   	matchtypec                 C   s   t | t tjS )z
    Given a BaseExpression in a type, convert this to a new BaseExpression that refers
    to LibCST nodes instead of forward references to matcher nodes.
    )r   ro   rq   r   rE   )rt   r   r   r    !_convert_match_nodes_to_cst_nodes   s   ru   c                 C   s2   t t t jt dt t t| fdS )zO
    Construct a MatchIfTrue type node appropriate for going into a Union.
    MatchIfTruer   )r   r$   r   r,   r*   ru   )rn   r   r   r    _get_match_if_true   s   rx   namec                 C   s    t t | t t |fS r   r   r,   r*   r$   r   )ry   rn   r   r   r    _add_generic   s    r{   c                   @   s(   e Zd ZdejdejdejfddZdS )AddLogicMatchersToUnionsr   r   r   c              	   C   s`   |j tdr.t|dg}|jg |jttt	d|ttt	d|dS |S )Nr   DoNotCareSentinelOneOfAllOfrw   )
r   r7   r   r*   rp   rZ   r   r$   r   r{   )r/   r   r   concrete_only_exprr   r   r    r2      s    z(AddLogicMatchersToUnions.leave_SubscriptN)rL   rM   rN   r   r,   r2   r   r   r   r    r|      s    r|   c                       sN   e Zd Zd fddZdejddfddZdejd	ejdejfd
dZ  ZS )AddWildcardsToSequenceUnionsr   Nc                    s   t    t | _t | _d S r   )superrl   rk   in_match_if_truefixup_nodes)r/   	__class__r   r    rl     s   
z%AddWildcardsToSequenceUnions.__init__r3   c                 C   s   |j tdr| j| d S |j tdrP| jrd S t|jdkr*td|jd j}t	|tj
rR|j }t	|tjrT|j tdrV| j| d S d S d S d S d S )Nrv   r   r@   zGUnexpected number of sequence elements inside Sequence type annotation!r   r   )r   r7   r   r*   r   addrG   r   	Exceptionr   r   r,   r   )r/   r3   	nodeslicepossibleunionr   r   r    visit_Subscript  s&   z,AddWildcardsToSequenceUnions.visit_Subscriptr   r   c              	   C   sn   || j v r| j | || jv r5| j| |jg |jtttd|tttd|dS |S )NAtLeastNAtMostNrw   )	r   remover   rZ   r   r   r$   r   r{   rU   r   r   r    r2   )  s$   

z,AddWildcardsToSequenceUnions.leave_Subscript)r   N)	rL   rM   rN   rl   r   r,   r   r2   __classcell__r   r   r   r    r     s    r   c                   C      t t t dS )zQ
    Construct a DoNotCareSentinel entry appropriate for going into a Union.
    r}   r   r$   r   r*   r   r   r   r    _get_do_not_care>     r   c                   C   r   )zQ
    Construct a MetadataMatchType entry appropriate for going into a Union.
    MetadataMatchTyper   r   r   r   r    _get_match_metadataF  r   r   r3   addition	additionsc                 G   s&   t t dt t | |g|S )z
    Take two or more nodes, wrap them in a union type. Function signature is
    explicitly defined as taking at least one addition for type safety.

    r   rz   )r3   r   r   r   r   r    _get_wrapped_union_typeN  s   r   _global_aliasesT)frozenc                   @   s   e Zd ZU eed< eed< dS )Aliasry   typeN)rL   rM   rN   rm   __annotations__r   r   r   r    r   b  s   
 r   c                   @   s*   e Zd ZU eed< eed< ee ed< dS )Fieldry   r   aliasesN)rL   rM   rN   rm   r   r   r   r   r   r   r    r   h  s   
 r   c                 C   sf   t | tjr	| jS t | tjr| j}t |tr|S d S t | tjr&t| j	S t | tj
r1t| jS d S r   )r   r   r*   r   r\   rr   rm   r$   _get_raw_namer   r   )r3   rr   r   r   r    r   o  s   


r   c                 C   s   t | tjtjfrt|  dS t | tjr>| jtdr>dd | jD }t	dd |D r2d S d
dd |D d S d S )	N	MatchTyper   c                 S   s   g | ]}t |qS r   )r   )r   sr   r   r    r'     s    z#_get_alias_name.<locals>.<listcomp>c                 s   s    | ]}|d u V  qd S r   r   r   nr   r   r    r!     s    z"_get_alias_name.<locals>.<genexpr>Orc                 s   s    | ]	}|d ur|V  qd S r   r   r   r   r   r    r!     s    )r   r   r*   r\   r   r,   r   r7   r   anyjoin)r3   namesr   r   r    _get_alias_name~  s   r   r   r   c                 C   sR   |d ur|  t|tjdd|d tt|t S |jg |j	t dS )Nr   body)ry   r   rw   )
r.   r   r   Modulecode_for_noder   r*   r   rZ   r   )r   ry   r   r   r   r    _wrap_clean_type  s    r   typecstc                 C   s&   t |}t|t t|}t| ||S r   )r   r   r   rx   r   r   r   ry   r   r   r   r    _get_clean_type_from_expression  s
   r   c                 C   sD   |j }t|tjr |j}t|tjr t||t| |tj	S |S r   )
r   r   r   r   r   r,   r   deep_replace_get_clean_type_from_subscriptr$   )r   r   r1   re   r   r   r    _maybe_fix_sequence_in_union  s   r   c                    sB   t |}|jg  fdd|jD t t|d}t ||S )Nc                    s   g | ]}t  |qS r   )r   r4   r   r   r    r'     s    z._get_clean_type_from_union.<locals>.<listcomp>rw   )r   rZ   r   r   rx   r   r   r   r   r    _get_clean_type_from_union  s   r   c                 C   s   |j tdrYt|jdkrtd|jd j}t|tjs$td|j }t|tj	r3t
| |}nt|tjtjfrBt| |}n
tdt| dt|||t t|S |j tdrgt| |S t| |S )	Nr   r@   z9Logic error, Sequence shouldn't have more than one param!r   z7Logic error, expecting Index for only Sequence element!z*Logic error, unexpected type in Sequence: !r   )r   r7   r   r*   rG   r   r   r   r   r,   r   r\   r   r   r   r   r   rx   r   )r   r   
inner_typeclean_inner_typer   r   r    r     s,   


r   typeobjc                 C   s   t | }ttd|}ttd|}t|}|t }t|t	j
s$J |t }t|t	j
s2J g }t|t	jr@t||}nt|t	jt	jfrOt||}n
tdt| dt|t t	j}t|t t	j}t	jdd||fS )z
    Given a type object as returned by dataclasses, sanitize it and convert it
    to a type string that is appropriate for our codegen below.
    z\1ztyping.Optional[\1]z(Logic error, unexpected top level type: r   r   r   )r]   resubCLASS_REOPTIONAL_REr   ro   r   r   r   rE   rP   r,   r   r*   r\   r   r   r   r   r|   CSTNoder   r   r   )r   typestrr   r   
clean_typer   r   r    _get_clean_type_and_aliases  s&   	r   c                 c   sb    t | pg D ]'}|jdkrqt|j\}}t|j|dd |D dV  tdd |D  qdS )zJ
    Given a CSTNode, generate a field name and type string for each.
    	_metadatac                 S   s   g | ]	}|j tvr|qS r   )ry   r   r   ar   r   r    r'     s    z_get_fields.<locals>.<listcomp>)ry   r   r   c                 s   s    | ]}|j V  qd S r   )ry   r   r   r   r    r!     s    z_get_fields.<locals>.<genexpr>N)r   ry   r   r   r   r   update)r3   field	fieldtyper   r   r   r    _get_fields  s   
r   all_exportsgenerated_codez4# Copyright (c) Meta Platforms, Inc. and affiliates.#zA# This source code is licensed under the MIT license found in thez9# LICENSE file in the root directory of this source tree. z?# This file was generated by libcst.codegen.gen_matcher_classesz!from dataclasses import dataclassz5from typing import Literal, Optional, Sequence, Unionzimport libcst as csta@  from libcst.matchers._matcher_base import AbstractBaseMatcherNodeMeta, BaseMatcherNode, DoNotCareSentinel, DoNotCare, TypeOf, OneOf, AllOf, DoesNotMatch, MatchIfTrue, MatchRegex, MatchMetadata, MatchMetadataIfTrue, ZeroOrMore, AtLeastN, ZeroOrOne, AtMostN, SaveMatchedNode, extract, extractall, findall, matches, replace)BaseMatcherNoder}   	DoNotCarer~   r   DoesNotMatchrv   
MatchRegexMatchMetadataMatchMetadataIfTrueTypeOf
ZeroOrMorer   	ZeroOrOner   SaveMatchedNodeextract
extractallfindallmatchesreplacezXfrom libcst.matchers._decorators import call_if_inside, call_if_not_inside, visit, leave)call_if_insidecall_if_not_insidero   leavezvfrom libcst.matchers._visitors import MatchDecoratorMismatch, MatcherDecoratableTransformer, MatcherDecoratableVisitor)MatchDecoratorMismatchMatcherDecoratableTransformerMatcherDecoratableVisitorz6class _NodeABC(metaclass=AbstractBaseMatcherNodeMeta):z    __slots__ = ()zclass z(_NodeABC):z    passz=MetadataMatchType = Union[MatchMetadata, MatchMetadataIfTrue]Baseclassesr   Fz = z4@dataclass(frozen=True, eq=False, unsafe_hash=False)(z, z):z    z: z = DoNotCare()z{    metadata: Union[MetadataMatchType, DoNotCareSentinel, OneOf[MetadataMatchType], AllOf[MetadataMatchType]] = DoNotCare()z
__all__ = __main__
)Sr   dataclassesr   r   r   r   r   r   r   r   r	   r
   r   libcstr   r   r   libcst.codegen.gatherr   r   rk   dirr   rm   r   r   r   CSTTransformerr   rP   ri   rE   rp   rq   ru   r$   rx   r{   r|   r   r   r   r,   r   r   r   r   r   r   r   r   r   r   r   r   objectr   r   r   r   r.   r   baserL   r   r3   
startswithr   tc
issubclasshas_aliaseslistnode_fieldsr   r   aliasry   r   r   fields_printedr]   sortedprintr   r   r   r    <module>   sR  
(g-



1






"
",



























  
