o
    DDi                     @   s   d dl Z d dl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 er@d dlmZ d dlmZmZ d dlmZ edZG d	d
 d
ZG dd de
e ZG dd deZdS )    N)ABC)contextmanager)CallablecastClassVar
CollectionGenericIteratorMappingTypeTYPE_CHECKINGTypeVarUnion)CSTNode)BaseMetadataProvider	ProviderT)MetadataWrapper_Tc                   @   s   e Zd ZdS )_UNDEFINED_DEFAULTN)__name__
__module____qualname__ r   r   S/var/www/Datamplify/venv/lib/python3.10/site-packages/libcst/_metadata_dependent.pyr   $   s    r   c                   @   s8   e Zd ZdZdeg ef ddfddZdefddZdS )		LazyValueam  
    The class for implementing a lazy metadata loading mechanism that improves the
    performance when retriving expensive metadata (e.g., qualified names). Providers
    including :class:`~libcst.metadata.QualifiedNameProvider` use this class to load
    the metadata of a certain node lazily when calling
    :func:`~libcst.MetadataDependent.get_metadata`.
    callablereturnNc                 C   s   || _ t| _d S N)r   r   return_value)selfr   r   r   r   __init__1   s   
zLazyValue.__init__c                 C   s    | j tu r
|  | _ tt| j S r   )r   r   r   r   r   r   r   r   r   __call__5   s   

zLazyValue.__call__)r   r   r   __doc__r   r   r    r"   r   r   r   r   r   (   s    r   c                	   @   s   e Zd ZU dZededef f ed< dZee	d  ed< dd	d
Z
ede	d fddZeddded fddZefded dddedefddZdS )MetadataDependentz
    The low-level base class for all classes that declare required metadata
    dependencies. :class:`~libcst.CSTVisitor` and :class:`~libcst.CSTTransformer`
    extend this class.
    r   r   metadatar   METADATA_DEPENDENCIESr   Nc                 C   s
   i | _ d S r   )r%   r!   r   r   r   r    J   s   
zMetadataDependent.__init__c                 C   sX   z| j W S  ty+   t }t| D ]}t|tr ||j qt	|| _ | j  Y S w )z
        Returns all metadata dependencies declared by classes in the MRO of ``cls``
        that subclass this class.

        Recursively searches the MRO of the subclass for metadata dependencies.
        )
&_INHERITED_METADATA_DEPENDENCIES_CACHEAttributeErrorsetinspectgetmro
issubclassr$   updater&   	frozenset)clsdependenciescr   r   r   get_inherited_dependenciesM   s   


z,MetadataDependent.get_inherited_dependencieswrapperr   c                 c   s"    | |  | _dV  i | _dS )a  
        Context manager that resolves all metadata dependencies declared by
        ``self`` (using :func:`~libcst.MetadataDependent.get_inherited_dependencies`)
        on ``wrapper`` and caches it on ``self`` for use with
        :func:`~libcst.MetadataDependent.get_metadata`.

        Upon exiting this context manager, the metadata cache on ``self`` is
        cleared.
        N)resolve_manyr2   r%   )r   r3   r   r   r   resolvea   s   
zMetadataDependent.resolvekeyzBaseMetadataProvider[_T]nodedefaultc                 C   s   ||   vrt|j dt| j d|| jvr!t|j d|tur/| j| ||}n| j| | }t|tr>| }t	t
|S )z
        Returns the metadata provided by the ``key`` if it is accessible from
        this visitor. Metadata is accessible in a subclass of this class if ``key``
        is declared as a dependency by any class in the MRO of this class.
        z$ is not declared as a dependency in z.METADATA_DEPENDENCIES.z@ is a dependency, but not set; did you forget a MetadataWrapper?)r2   KeyErrorr   typer%   r   get
isinstancer   r   r   )r   r6   r7   r8   valuer   r   r   get_metadatap   s   



zMetadataDependent.get_metadata)r   N)r   r   r   r#   r
   object__annotations__r&   r   r   r    classmethodr2   r   r	   r5   r   r   r   r>   r   r   r   r   r$   ;   s&   
 	
r$   )r*   abcr   
contextlibr   typingr   r   r   r   r   r	   r
   r   r   r   r   libcst._nodes.baser   libcst.metadata.base_providerr   r   libcst.metadata.wrapperr   r   r   r   r$   r   r   r   r   <module>   s   4