U
    h                     @  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__ G/tmp/pip-unpacked-wheel-y076a95i/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   Constantstrr   Z	AnnAssigninspect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   currentframe	getmodulef_lineno
findsourceOSErrorgetblockr-   r   parseSyntaxError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(    

r?   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   getsourcelinesr4   r?   r-   r   r   r   r6   r   )r.   rA   r$   r>   r,   Zvisitorr   r   r   extract_docstrings_from_clsQ   s    rC   )F)__doc__
__future__r   r   r   r(   typingr   ZNodeVisitorr   r-   r?   rC   r   r   r   r   <module>   s   