
    Fe                        d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZ e	rdd	lmZ  G d
 d      Zy)z,Utilities parsing and analyzing Python code.    )annotationsN)import_module)path)TYPE_CHECKINGAny)PycodeError)Parser)	Signaturec                      e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   i Zded<   edd       Zed	 dd       Zedd       Z	edd       Z
ddZddZddZd dZy)!ModuleAnalyzerzdict[tuple[str, str], str]r    dict[tuple[str, str], list[str]]	attr_docsz	list[str]finalszdict[str, list[Signature]]	overloadszdict[str, int]tagorderdict[str, tuple[str, int, int]]tagszdict[tuple[str, str], Any]cachec                N   	 t        |       }t        |dd      }t        |dd      }|r&t        |dd      r	 |j	                  |       }|r||fS 	 |!|rt        |dd      r	 |j                  |       }|t        d| z        t        j                  t        j                  |            }|j                         j                  d	      r8|dd
 }t        j                  |      sKt        j                  |dz         r3|dz  }n-|j                         j                  d      st        d|z        t        j                  |      st        d|z        |dfS # t        $ r}t        d| z  |      |d}~ww xY w# t
        $ r Y 3w xY w# t
        $ r}t        d| z  |      |d}~ww xY w)zTry to find the source code for a module.

        Returns ('filename', 'source'). One of it can be None if
        no filename or source found
        zerror importing %rN
__loader____file__
get_sourceget_filenamezerror getting filename for %rzno source found for module %r)z.pyoz.pycw)z.pyz.pywzsource is not a .py file: %rzsource file is not present: %r)r   	Exceptionr   getattrr   ImportErrorr   r   normpathabspathlowerendswithisfile)modnamemoderrloaderfilenamesources         8/usr/lib/python3/dist-packages/sphinx/pycode/__init__.pyget_module_sourcez ModuleAnalyzer.get_module_source   s   	L(C lD13
D1gflD9**73#V++ 
 76>4+P[!..w7 =GHH==h!78>>$$%56}H;;x(T[[C-HC!**?;<xGHH{{8$>IJJ~A  	L2W<cBK	L    [!"AG"KSQWZZ[s@   E E6 !F 	E3E..E36	FF	F$FF$c                     | |||      S )N )clsstringr$   srcnames       r*   
for_stringzModuleAnalyzer.for_stringG   s     67G,,    c                6   d|f| j                   v r| j                   d|f   S 	 t        j                  |      5 }|j                         }d d d         | ||      }|| j                   d|f<   |S # 1 sw Y   &xY w# t        $ r}t        d|z  |      |d }~ww xY w)Nfilezerror opening %r)r   tokenizeopenreadr   r   )r.   r(   r$   fr/   objr&   s          r*   for_filezModuleAnalyzer.for_fileL   s    H*99VX-..	Kx( "A"fgx0C*-CIIfh&' 
" "  	K08;SAsJ	Ks.   A: A.	#A: .A73A: :	BBBc                ^   d|f| j                   v r%| j                   d|f   }t        |t              r||S 	 | j                  |      \  }}|| j	                  |||xs d      }n|| j                  ||      }| j                   d|f<   |S # t        $ r}|| j                   d|f<    d }~ww xY w)Nmodule<string>)r   
isinstancer   r+   r1   r:   )r.   r$   entryr(   r)   r9   r&   s          r*   
for_modulezModuleAnalyzer.for_moduleY   s    g#))+IIh/0E%-L	"44W=Hf!nnVWh6L*M%ll8W5 (+		(G#$
	  	+.CIIh'(	s   AB 	B,B''B,c                <    || _         || _        || _        d| _        y )NF)r$   r0   code	_analyzed)selfr)   r$   r0   s       r*   __init__zModuleAnalyzer.__init__m   s      	r2   c                :   | j                   ry	 t        | j                        }|j                          i | _        |j
                  j                         D ]9  \  }}|r"|j                         dgz   | j                  |<   *dg| j                  |<   ; |j                  | _        |j                  | _	        |j                  | _
        |j                  | _        |j                  | _        d| _         y# t        $ r#}d| j                   d|}t#        |      |d}~ww xY w)zAnalyze the source code.N Tzparsing z	 failed: )rC   r	   rB   parser   commentsitems
splitlinesr   r   r   definitionsr   	defordersr   r   r0   r   )rD   parserscopecommentexcmsgs         r*   analyzezModuleAnalyzer.analyzev   s    >>	,DII&FLLNDN$*OO$9$9$; 1 ,3,>,>,@B4,GDNN5)-/DDNN5)	1  &11D --DK#--DN**DI",,DM!DN 	,T\\,IcW=Cc"+	,s   CC. .	D7DDc                :    | j                          | j                  S )z?Find class and module-level attributes and their documentation.)rS   r   rD   s    r*   find_attr_docszModuleAnalyzer.find_attr_docs   s    ~~r2   c                :    | j                          | j                  S )z?Find class, function and method definitions and their location.)rS   r   rU   s    r*   	find_tagszModuleAnalyzer.find_tags   s    yyr2   N)r$   strreturnztuple[str | None, str | None])r=   )r/   rY   r$   rY   r0   rY   rZ   r   )r(   rY   r$   rY   rZ   r   )r$   rY   rZ   r   )r)   rY   r$   rY   r0   rY   rZ   None)rZ   r[   )rZ   r   )rZ   r   )__name__
__module____qualname____annotations__r   staticmethodr+   classmethodr1   r:   r@   rE   rS   rV   rX   r-   r2   r*   r   r      s    ++//))
)) )+E%*( (T -&- - 
 
  &,4
r2   r   )__doc__
__future__r   r5   	importlibr   osr   typingr   r   sphinx.errorsr   sphinx.pycode.parserr	   inspectr
   r   r-   r2   r*   <module>rj      s/    2 "  #  % % '!G Gr2   