U
    Qh                     @  s~   d Z ddlmZ ddlZddlZddlZddlmZ G dd dejZ	ddd	d
dZ
dddddZdddddddZdS )z4Utilities related to attribute docstring extraction.    )annotationsN)Anyc                      sV   e Zd Zdd fddZddd fdd	Zd
ddddZdddddZ  ZS )DocstringVisitorNone)returnc                   s    t    d | _i | _d | _d S N)super__init__targetattrsprevious_node_type)self	__class__ I./venv/lib/python3.8/site-packages/pydantic/_internal/_docs_extraction.pyr	      s    
zDocstringVisitor.__init__zast.ASTr   )noder   c                   s   t  |}t|| _|S r   )r   visittyper   )r   r   Znode_resultr   r   r   r      s    
zDocstringVisitor.visitzast.AnnAssignc                 C  s   t |jtjr|jj| _d S r   )
isinstancer
   astNameid)r   r   r   r   r   visit_AnnAssign   s    z DocstringVisitor.visit_AnnAssignzast.Exprc                 C  sR   t |jtjrNt |jjtrN| jtjkrNt|jj}| j	rH|| j
| j	< d | _	d S r   )r   valuer   ZConstantstrr   Z	AnnAssigninspectZcleandocr
   r   )r   r   Z	docstringr   r   r   
visit_Expr   s    
zDocstringVisitor.visit_Expr)__name__
__module____qualname__r	   r   r   r   __classcell__r   r   r   r   r      s   r   z	list[str]r   )sourcer   c                 C  s(   t d| }|dr$d| }|S )N ) 	zdef dedent_workaround():
)textwrapdedentjoin
startswith)r"   dedent_sourcer   r   r   _dedent_source_lines(   s    

r+   z	type[Any]zlist[str] | None)clsr   c           	      C  s   t  }|rt |t | kr|j}zt |\}}W n tk
rL   Y nX t ||d d  }t|}zt	|}W n t
k
r   Y nHX |jd }t|tjr|jdkr|jd }t|tjr|j| jkr|S |j}qd S )N   r   Zdedent_workaround)r   ZcurrentframeZ	getmodulef_linenoZ
findsourceOSErrorZgetblockr+   r   parseSyntaxErrorZbodyr   ZFunctionDefnameZClassDefr   f_back)	r,   framelnumlines_Zblock_linesr*   Z
block_treeZstmtr   r   r   _extract_source_from_frame3   s(    

r8   Fboolzdict[str, str])r,   use_inspectr   c                 C  sf   |r2zt | \}}W q: tk
r.   i  Y S X nt| }|sBi S t|}t }|t| |j	S )aX  Map model attributes and their corresponding docstring.

    Args:
        cls: The class of the Pydantic model to inspect.
        use_inspect: Whether to skip usage of frames to find the object and use
            the `inspect` module instead.

    Returns:
        A mapping containing attribute names and their corresponding docstring.
    )
r   Zgetsourcelinesr/   r8   r+   r   r   r   r0   r   )r,   r:   r"   r7   r*   Zvisitorr   r   r   extract_docstrings_from_clsQ   s    r;   )F)__doc__Z
__future__r   r   r   r&   typingr   ZNodeVisitorr   r+   r8   r;   r   r   r   r   <module>   s   