
    ziT                       d Z ddlmZ ddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZmZmZmZmZmZmZ ddlmZmZ ddlmZ ddlmZ  ej        d	          Z ej        d
          Z ej        d          Zd&dZd'dZd(d)dZd*dZ  G d d          Z! G d d          Z" G d de"          Z# G d  d!ej$                  Z% G d" d#e"          Z& G d$ d%          Z'dS )+z,Utilities parsing and analyzing Python code.    )annotationsN)	Signature)DEDENTINDENTNAMENEWLINENUMBEROPSTRING)COMMENTNL)Any)unparsez^\s*#: ?(.*)?
?$z^\s*$z^\s*(#.*)?$codestrreturnc                .    |                      dd          S )N )replace)r   s    _/var/www/tmov.alphamb/tmov_inventario/venv/lib/python3.11/site-packages/sphinx/pycode/parser.pyfilter_whitespacer      s    <<c"""    nodeast.ASTlist[ast.expr]c                T    t          | t          j                  r| j        S | j        gS )z3Get list of targets from Assign and AnnAssign node.)
isinstanceastAssigntargetstarget)r   s    r   get_assign_targetsr#      s(    $
## |}r   selfast.arg | None	list[str]c                   |r|j         }| j        j        }|dv rt          d| z            |dk    r'|| j        |k    r| j        gS t          d| z            |dv rbg }| j        D ]V}t          j        t                    5  |                    t          ||                     ddd           n# 1 swxY w Y   W|S |dk    rX| j
        j        j        dk    r1|r/| j
        j        |k    rdt          | j        |          d	         z  gS t          d| z            |d
k    r| gS |dk    rt          | j
        |          S t          d|z            )zConvert assignment-AST to variable names.

    This raises `TypeError` if the assignment does not create new variable::

        ary[0] = 'foo'
        dic["bar"] = 'baz'
        # => TypeError
    )ConstantIndexSlice	Subscriptz%r does not create new variableNameNz*The assignment %r is not instance variable)TupleList	Attributez%sr   r   StarredzUnexpected node name %r)arg	__class____name__	TypeErroridelts
contextlibsuppressextendget_lvar_namesvalueattrNotImplementedError)r   r$   self_id	node_namememberselts         r   r:   r:   #   s     ('I???9D@AAAF<47g--G9H4OPPP	'	'	'9 	: 	:C$Y// : :~c488999: : : : : : : : : : : : : : : 	k	!	!J )V33 4Z]g-- >$)T::1==>>H4OPPP	e		v	i		dj$///!";i"GHHHs   $B11B5	8B5	sc                    dd}| |_         t          j        |          }|r(|                    d                              d          S dS )z1Remove common leading indentation from docstring.r   Nonec                     d S N rG   r   r   dummyzdedent_docstring.<locals>.dummyQ   s    r   z
 Nr   rD   )__doc__inspectgetdoclstriprstrip)rB   rH   	docstrings      r   dedent_docstringrQ   O   s]        EMu%%I ''..v666rr   c                  2    e Zd ZdZddZddZddZddZdS )Tokenz)Better token wrapper for tokenize module.kindintr;   r   starttuple[int, int]endsourcer   r   rD   c                L    || _         || _        || _        || _        || _        d S rF   )rT   r;   rV   rX   rY   )r$   rT   r;   rV   rX   rY   s         r   __init__zToken.__init__`   s)    	

r   otherboolc                $   t          |t                    r| j        |k    S t          |t                    r| j        |k    S t          |t
          t          f          r| j        | j        gt          |          k    S |dS t          d|z            )NFzUnknown value: %r)r   rU   rT   r   r;   listtuple
ValueError)r$   r\   s     r   __eq__zToken.__eq__h   s    eS!! 		:9%%s## 	::&&e}-- 	:Itz*d5kk99]5058999r   
conditionsc                :     t           fd|D                       S )Nc              3  $   K   | ]
}|k    V  d S rF   rG   ).0	candidater$   s     r   	<genexpr>zToken.match.<locals>.<genexpr>u   s(      AA49$AAAAAAr   )any)r$   rc   s   ` r   matchzToken.matcht   s&    AAAAjAAAAAAr   c                l    dt           j        | j                 d| j                                        dS )Nz<Token kind=z value=>)tokenizetok_namerT   r;   stripr$   s    r   __repr__zToken.__repr__w   s3    \h/	:\\TZEUEUEWEW\\\\r   N)rT   rU   r;   r   rV   rW   rX   rW   rY   r   r   rD   )r\   r   r   r]   )rc   r   r   r]   )r   r   )r3   
__module____qualname__rK   r[   rb   rj   rq   rG   r   r   rS   rS   ]   st        33   
: 
: 
: 
:B B B B] ] ] ] ] ]r   rS   c                  .    e Zd ZddZdd	ZddZddZdS )TokenProcessorbuffersr&   r   rD   c                    t          |          || _        t          j        fd          | _        d | _        d | _        d S )Nc                 "    t                     S rF   )next)liness   r   <lambda>z)TokenProcessor.__init__.<locals>.<lambda>   s    tE{{ r   )iterrv   rm   generate_tokenstokenscurrentprevious)r$   rv   rz   s     @r   r[   zTokenProcessor.__init__|   sC    W./B/B/B/BCC%)&*r   linenorU   r   c                "    | j         |dz
           S zReturns specified line.   rv   r$   r   s     r   get_linezTokenProcessor.get_line       |FQJ''r   Token | Nonec                    	 | j         | _        t          t          | j                   | _         n# t
          $ r
 d| _         Y nw xY w| j         S )z_Fetch the next token from source code.

        Returns ``None`` if sequence finished.
        N)r   r   rS   ry   r~   StopIterationrp   s    r   fetch_tokenzTokenProcessor.fetch_token   sX    
	  LDM $t{"3"34DLL 	  	  	 DLLL	  |s   ,/ AA	conditionr   list[Token]c                   g }|                                  x}r|                    |           ||k    rn|t          dgk    r ||                     t          dg          z  }nY|t          dgk    r ||                     t          dg          z  }n,|t          dgk    r||                     t          dg          z  }|                                  x}|S )zlFetch tokens until specified token appeared.

        .. note:: This also handles parenthesis well.
        (){}[])r   appendr
   fetch_until)r$   r   r~   r   s       r   r   zTokenProcessor.fetch_until   s    
 ))+++g 		6MM'""")##2s)##$**B9555RI%%$**B9555RI%%$**B9555 ))+++g 		6 r   N)rv   r&   r   rD   r   rU   r   r   )r   r   )r   r   r   r   )r3   rr   rs   r[   r   r   r   rG   r   r   ru   ru   {   sd        + + + +( ( ( (        r   ru   c                  4     e Zd ZdZd
 fdZddZdd	Z xZS )AfterCommentParserzPython source code parser to pick up comments after assignments.

    This parser takes code which starts with an assignment statement,
    and returns the comment for the variable if one exists.
    rz   r&   r   rD   c                X    t                                          |           d | _        d S rF   )superr[   commentr$   rz   r2   s     r   r[   zAfterCommentParser.__init__   s&    #'r   r   c                T   g }|                                  x}r|                    |           |t          dgk    r ||                     t          dg          z  }n|t          dgk    r ||                     t          dg          z  }n|t          dgk    r ||                     t          dg          z  }n[|t          k    r||                     t
                    z  }n2|t          dgk    rn;|r"|j        t          t          t          t          hvrn|                                  x}|S )z%Fetch right-hand value of assignment.r   r   r   r   r   r   ;)
r   r   r
   r   r   r   rT   r   r	   r   )r$   r~   r   s      r   fetch_rvaluezAfterCommentParser.fetch_rvalue   s2   ))+++g 	MM'"""2s)##$**B9555RI%%$**B9555RI%%$**B9555F""$**6222RI%% W\"dFF1KKK ))+++g 	 r   c                   |                                  x}rj|                    t          dgt          t                    sB|sJ |                                  x}r(|                    t          dgt          t                    B|J |t          dgk    r|                                  | j        }|J |t          k    r|j        | _        dS dS )z3Parse the code and obtain comment after assignment.=N)	r   rj   r
   r   r   r   r   r;   r   )r$   toks     r   parsezAfterCommentParser.parse   s     &&(((s 	#))RIwPW2X2X 	JJJ &&(((s 	#))RIwPW2X2X 	 2s),C???'>>9DLLL >r   rz   r&   r   rD   )r   r   rJ   )r3   rr   rs   rK   r[   r   r   __classcell__r2   s   @r   r   r      so         ( ( ( ( ( (   (% % % % % % % %r   r   c                       e Zd ZdZd3 fdZd4dZd5dZd5dZd6dZd7dZ	d8dZ
d9dZd9dZd:dZd;dZd< fd!Zd=d#Zd>d%Zd?d'Zd@d)ZdAd+ZdBd-ZdCd/ZdDd0ZdEd2Z xZS )FVariableCommentPickerz7Python source code parser to pick up variable comments.rv   r&   encodingr   r   rD   c                <   t          j                    | _        || _        || _        g | _        g | _        d | _        i | _        i | _	        d | _
        i | _        g | _        i | _        d | _        d | _        d | _        t#                                                       d S rF   )	itertoolscountcounterrv   r   contextcurrent_classescurrent_functioncommentsr   r   	defordersfinals	overloadstypingtyping_finaltyping_overloadr   r[   )r$   rv   r   r2   s      r   r[   zVariableCommentPicker.__init__   s     (( "$*,8<4679(,)+!#57"&(,+/r   namelist[str] | Nonec                    | j         r-| j        r$| j        d         dk    r| j        dd         |gz   S dS | j        |gz   S )z;Get qualified name for given object as a list of string(s).r[   N)r   r   r   )r$   r   s     r   get_qualname_forz&VariableCommentPicker.get_qualname_for   sU      	)# R(8J(F(F|CRC(D611t<4&((r   c                    |                      |          }|r1t          | j                  | j        d                    |          <   d S d S N.)r   ry   r   r   joinr$   r   qualnames      r   	add_entryzVariableCommentPicker.add_entry   sR    ((.. 	D15dl1C1CDN388H--...	D 	Dr   c                    |                      |          }|r/| j                            d                    |                     d S d S r   )r   r   r   r   r   s      r   add_final_entryz%VariableCommentPicker.add_final_entry   sO    ((.. 	3Ksxx1122222	3 	3r   funcast.FunctionDefc                    ddl m} |                     |j                  }|rN| j                            d                    |          g           }|                     ||                     d S d S )Nr   )signature_from_astr   )sphinx.util.inspectr   r   r   r   
setdefaultr   r   )r$   r   r   r   r   s        r   add_overload_entryz(VariableCommentPicker.add_overload_entry  s    ::::::((33 	711#((82D2DbIII//5566666	7 	7r   r   c                    |                      |          }|r+d                    |d d                   }|| j        ||f<   d S d S Nr   r   )r   r   r   )r$   r   r   r   basenames        r   add_variable_commentz*VariableCommentPicker.add_variable_comment
  sW    ((.. 	6xx"..H.5DM8T*+++	6 	6r   
annotationr   c                    |                      |          }|r8d                    |d d                   }t          |          | j        ||f<   d S d S r   )r   r   ast_unparser   )r$   r   r   r   r   s        r   add_variable_annotationz-VariableCommentPicker.add_variable_annotation  sc    ((.. 	Ixx"..H1<Z1H1HDh-...	I 	Ir   
decoratorsr   r]   c                    g }| j         r|                    d| j         z             | j        r|                    | j                   |D ]'}	 t          |          |v r dS # t          $ r Y $w xY wdS )Nz%s.finalTF)r   r   r   r   r=   )r$   r   final	decorators       r   is_finalzVariableCommentPicker.is_final  s    ; 	3LLdk1222 	,LL*+++# 	 	Iy))U2244 3&    u   A""
A/.A/c                    g }| j         r|                    d| j         z             | j        r|                    | j                   |D ]'}	 t          |          |v r dS # t          $ r Y $w xY wdS )Nz%s.overloadTF)r   r   r   r   r=   )r$   r   overloadr   s       r   is_overloadz!VariableCommentPicker.is_overload&  s    ; 	9OOMDK7888 	2OOD0111# 	 	Iy))X5544 6&    ur   r%   c                    | j         r(| j         j        j        r| j         j        j        d         S | j         r(| j         j        j        r| j         j        j        d         S dS )z8Returns the name of the first argument if in a function.r   N)r   argsposonlyargsrp   s    r   get_selfzVariableCommentPicker.get_self6  se      	6T%:%?%D 	6(-2155  	=T%:%?%K 	=(-9!<<tr   r   rU   c                "    | j         |dz
           S r   r   r   s     r   r   zVariableCommentPicker.get_line>  r   r   r   c                X    t                                          |           || _        dS )z(Updates self.previous to the given node.N)r   visitr   )r$   r   r2   s     r   r   zVariableCommentPicker.visitB  s$    dr   
ast.Importc                   |j         D ]}|                     |j        p|j                   |j        dk    r|j        p|j        | _        B|j        dk    r|j        p|j        | _        a|j        dk    r|j        p|j        | _        dS )8Handles Import node and record the order of definitions.r   ztyping.finalztyping.overloadN)namesr   asnamer   r   r   r   r$   r   r   s      r   visit_Importz"VariableCommentPicker.visit_ImportG  s    J 	@ 	@DNN4;3$)444yH$$"k6TYn,,$(K$<49!!///'+{'?di$	@ 	@r   ast.ImportFromc                   |j         D ]v}|                     |j        p|j                   |j        dk    r|j        dk    r|j        p|j        | _        M|j        dk    r|j        dk    r|j        p|j        | _        wdS )r   r   r   r   N)r   r   r   r   moduler   r   r   s      r   visit_ImportFromz&VariableCommentPicker.visit_ImportFromS  s    J 	@ 	@DNN4;3$)444{h&&49+?+?$(K$<49!!((TY*-D-D'+{'?di$	@ 	@r   
ast.Assignc                `    	 t          |          }t           fd|D             g           }                     |j                  }n# t          $ r Y dS w xY wt          |d          r(|j        r!|D ]}                     ||j                   n7t          |d          r'|j        r |D ]}                     ||j                   t          ||j
        d         g j        |j        d         z             }|                                 |j        rot                              |j                  rP|D ]K}                     |t                              d|j                                                  |           LdS t&                              |d|j
                           rg }t)          |j        dz
            D ]k}                     |j        dz
  |z
            }	t                              |	          r/|                    t                              d|	                     k |rat-          d                    t1          |                              }
|D ]-}                     ||
                                |           .dS |D ]}                     |           dS )z3Handles Assign node and pick up a variable comment.c                V    g | ]%}t          |                                           &S )rp   )r:   r   )rf   tr$   s     r   
<listcomp>z6VariableCommentPicker.visit_Assign.<locals>.<listcomp>b  s.    JJJQ888JJJr   Nr   type_commentz\1r   
)r#   sumr   r   r4   hasattrr   r   r   r   
col_offsetrv   r   r   
comment_rerj   r   subr   	indent_reranger   rQ   r   reversed)r$   r   r!   varnamescurrent_linevarnameparsercomment_linesibefore_liner   s   `          r   visit_Assignz"VariableCommentPicker.visit_Assign]  s   	(..G"%JJJJ'JJJB# #H  ==55LL 	 	 	FF	 4&& 	04? 	0# G G,,WdoFFFFGT>** 	0t/@ 	0# 0 0,,T.0 0 0 0 $\$/2B2B%C$D$(L$>%? @ @> 	j..v~>> 	# ( ())':>>%3X3XYYYw''''F ??<(8(89:: 	M4;?++  "mmDK!Oa,?@@##K00 !(({)K)KLLLL *499Xm5L5L+M+MNN' , ,G--gw???NN7++++   	$ 	$GNN7####	$ 	$s   AA	 	
AAast.AnnAssignc                0    |                      |           dS )z6Handles AnnAssign node and pick up a variable comment.N)r  r$   r   s     r   visit_AnnAssignz%VariableCommentPicker.visit_AnnAssign  s    $r   ast.Exprc                   t          | j        t          j        t          j        f          rt          |j        t          j                  r t          |j        j        t                    r	 t          | j                  }t          |d         | 
                                          }|D ]}t          |j        j        t                    r|j        j        }n&|j        j                            | j        pd          }|                     |t          |                     |                     |           dS # t           $ r Y dS w xY wdS dS dS )z2Handles Expr node and pick up a comment if string.r   utf-8N)r   r   r   r    	AnnAssignr;   r(   r   r#   r:   r   decoder   r   rQ   r   r4   )r$   r   r!   r  r  rP   s         r   
visit_Exprz VariableCommentPicker.visit_Expr  sN   t}sz3=&ABB 	4:s|44	9CDJDTVY9Z9Z	,T];;)'!*dmmooFF' , ,G!$*"2C88 V$(J$4		$(J$4$;$;DM<TW$U$U	--g7G	7R7RSSSNN7++++, ,    	 	 	 	 	 	s   -CD: :
EEast.Tryc                    |j         D ]}|                     |           |j        D ]}|                     |           dS )zHandles Try node and processes body and else-clause.

        .. note:: pycode parser ignores objects definition in except-clause.
        N)bodyr   orelse)r$   r   subnodes      r   	visit_TryzVariableCommentPicker.visit_Try  sZ    
 y 	  	 GJJw{ 	  	 GJJw	  	 r   ast.ClassDefc                   | j                             |j                   |                     |j                   |                     |j                  r|                     |j                   | j                            |j                   || _        |j	        D ]}| 
                    |           | j                                         | j                                          dS )z&Handles ClassDef node and set context.N)r   r   r   r   r   decorator_listr   r   r   r  r   popr$   r   childs      r   visit_ClassDefz$VariableCommentPicker.visit_ClassDef  s    ##DI...ty!!!==,-- 	,  +++DI&&&Y 	 	EJJu  """""r   c                   | j         |                     |j                   |                     |j                  r|                     |j                   |                     |j                  r|                     |           | j        	                    |j                   || _         |j
        D ]}|                     |           | j                                         d| _         dS dS )z)Handles FunctionDef node and set context.N)r   r   r   r   r  r   r   r   r   r   r  r   r  r  s      r   visit_FunctionDefz'VariableCommentPicker.visit_FunctionDef  s     (NN49%%%}}T011 0$$TY/// 344 .''---L	***$(D! " "

5!!!!L$(D!!! )(r   ast.AsyncFunctionDefc                0    |                      |           dS )z.Handles AsyncFunctionDef node and set context.N)r!  r  s     r   visit_AsyncFunctionDefz,VariableCommentPicker.visit_AsyncFunctionDef  s    t$$$$$r   )rv   r&   r   r   r   rD   )r   r   r   r   )r   r   r   rD   )r   r   r   rD   )r   r   r   r   r   rD   )r   r   r   r   r   rD   )r   r   r   r]   )r   r%   r   )r   r   r   rD   )r   r   r   rD   )r   r   r   rD   )r   r   r   rD   )r   r	  r   rD   )r   r  r   rD   )r   r  r   rD   )r   r  r   rD   )r   r   r   rD   )r   r"  r   rD   )r3   rr   rs   rK   r[   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r!  r$  r   r   s   @r   r   r      s       AA     $	) 	) 	) 	)D D D D
3 3 3 3
7 7 7 76 6 6 6I I I I           ( ( ( (     

@ 
@ 
@ 
@@ @ @ @1$ 1$ 1$ 1$f          $       # # # #) ) ) )% % % % % % % %r   r   c                  D     e Zd ZdZd fdZddZddZddZddZ xZ	S )DefinitionFinderzXPython source code parser to detect location of functions,
    classes and methods.
    rz   r&   r   rD   c                    t                                          |           d | _        g | _        g | _        i | _        d S rF   )r   r[   r   r   indentsdefinitionsr   s     r   r[   zDefinitionFinder.__init__  s>    '+"$AC<>r   r   r   entrytuple[str, int, int]c                r    | j         r%| j         d         d         dk    r|d         dk    rdS || j        |<   dS )zAdd a location of definition.r   r   defN)r(  r)  )r$   r   r*  s      r   add_definitionzDefinitionFinder.add_definition  sH    < 	+DL,Q/588U1X=N=ND%*DT"""r   c                J   	 |                                  }|dS |t          k    rn|t          dgk    rG| j        1| j                            t
          t          t          t                    r| j	        || _	        n|                    t          dg          r|                     d           nw|                    t          dg          r|                     d           nE|t          k    r| j                            d           n|t          k    r|                                  #)z1Parse the code to obtain location of definitions.TN@classr-  )r\   NN)r   r   r
   r   rj   r   r   r   r   r   r   parse_definitionr(  r   finalize_block)r$   tokens     r   r   zDefinitionFinder.parse  s   	&$$&&E}2s)##)>)-)<)<Wb&RX)Y)Y *?>)%*DNdG_-- &%%g....dE]++ &%%e,,,,&##$9::::&##%%%#	&r   typc                   |                                  }| j                            |j                   d                    | j                  }| j        r| j        j        d         }d| _        n|j        d         }|                     t          dg           |                                  	                    t          t                    r9|                     t                     | j                            |||f           dS |                     ||||j        d         f           | j                                         dS )zParse AST of definition.r   r   N:)r   r   r   r;   r   r   rV   r   r
   rj   r   r   r   r(  r.  rX   r  )r$   r5  r   funcname	start_poss        r   r2  z!DefinitionFinder.parse_definition  s$   !!DJ'''88DL))> 	&,Q/I!DNN
1I"c#####GW55 	V$$$Lh	 :;;;;; !$i! =? ? ?Lr   c                   | j                                         }|d         dk    r|\  }}}| j        j        d         dz
  }t                              |                     |                    r2|dz  }t                              |                     |                    2|                     ||||f           | j                                         dS dS )zFinalize definition block.r   r\   r   N)	r(  r  r   rX   emptyline_rerj   r   r.  r   )r$   
definitionr5  r8  r9  end_poss         r   r3  zDefinitionFinder.finalize_block  s    \%%''
a=G##'1$C9l&q)A-G$$T]]7%;%;<< 1 $$T]]7%;%;<<  3	7*CDDDL $#r   r   )r   r   r*  r+  r   rD   rJ   )r5  r   r   rD   )
r3   rr   rs   rK   r[   r.  r   r2  r3  r   r   s   @r   r&  r&    s         ? ? ? ? ? ?+ + + +& & & &*   ,
 
 
 
 
 
 
 
r   r&  c                  4    e Zd ZdZdddZdd	Zdd
ZddZdS )ParserzyPython source code parser to pick up variable comments.

    This is a better wrapper for ``VariableCommentPicker``.
    r  r   r   r   r   rD   c                    t          |          | _        || _        i | _        i | _        i | _        i | _        g | _        i | _        d S rF   )	r   r   r   r   r   r   r)  r   r   )r$   r   r   s      r   r[   zParser.__init__#  sH    %d++	 7946)+<>!#57r   c                V    |                                   |                                  dS )zParse the source code.N)parse_commentsr2  rp   s    r   r   zParser.parse-  s,    r   c                8   t          j        | j        d          }t          | j                            d          | j                  }|                    |           |j        | _        |j        | _        |j	        | _	        |j
        | _
        |j        | _        dS )z$Parse the code and pick up comments.T)type_commentsN)r   r   r   r   
splitlinesr   r   r   r   r   r   r   )r$   treepickers      r   rB  zParser.parse_comments2  s    y$777&ty';';D'A'A4=QQT!-)m)r   c                    t          | j                            d                    }|                                 |j        | _        dS )z0Parse the location of definitions from the code.TN)r&  r   rE  r   r)  )r$   r  s     r   r2  zParser.parse_definition=  s=    !$)"6"6t"<"<==!-r   N)r  )r   r   r   r   r   rD   rJ   )r3   rr   rs   rK   r[   r   rB  r2  rG   r   r   r?  r?    ss         
8 8 8 8 8       
	* 	* 	* 	*. . . . . .r   r?  )r   r   r   r   )r   r   r   r   rF   )r   r   r$   r%   r   r&   )rB   r   r   r   )(rK   
__future__r   r   r7   rL   r   rerm   r   r4  r   r   r   r   r	   r
   r   r   r   r   r   sphinx.pycode.astr   r   compiler   r   r;  r   r#   r:   rQ   rS   ru   r   NodeVisitorr   r&  r?  rG   r   r   <module>rN     s   2 2 " " " " " " 



          				        C C C C C C C C C C C C C C C C C C                       4 4 4 4 4 4RZ.//
BJx  	rz.))# # # #   )I )I )I )I )IX   ] ] ] ] ] ] ] ]<* * * * * * * *Z-% -% -% -% -% -% -% -%`v% v% v% v% v%CO v% v% v%rI I I I I~ I I IX$. $. $. $. $. $. $. $. $. $.r   