
    7g9I                        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mZm	Z	m
Z
 ddlmZmZ ddlmZ ddlmZmZ ddlmZmZ dd	lmZ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# ddl$m%Z% ddl&m'Z'm(Z( dZ)ddZ* G d d      Z+y)zastroid manager: avoid multiple astroid build of a same module when
possible by providing a class responsible to get astroid representation
from various source and using a cache of built modules)
    )annotationsN)CallableIteratorSequence)AnyClassVar)nodes)InferenceContext_invalidate_cache)AstroidBuildingErrorAstroidImportError)specutil)
NoSourceFile_cache_normalize_path_	_has_initfile_info_from_modpathget_source_file2is_module_name_part_of_extension_package_whitelistis_python_sourceis_stdlib_moduleload_module_from_namemodpath_from_file)TransformVisitor)AstroidManagerBrainInferenceResult)z.zipz.eggz.whlz.pyzz.pyzwc                8    	 t        |       S # t        $ r Y yw xY w)Nz???)repr	Exception)objs    /lib/python3.12/site-packages/astroid/manager.py	safe_reprr"   )   s#    Cy s   
 	c                  h   e Zd ZU dZdZi i g ddd e        e        e       dd
Zded<   d%dZ	e
d&d	       Zej                  d'd
       Ze
d&d       Zej                  d'd       Ze
d(d       Zej                  d)d       Ze
d        Ze
d        Ze
d*d       Ze
d&d       Zej                  d'd       Zd+dZ	 	 	 d,	 	 	 	 	 	 	 	 	 d-dZ	 d.	 	 	 	 	 	 	 d/dZd0dZ	 	 	 	 	 	 d1dZd2dZ	 	 d3	 	 	 	 	 	 	 d4dZd5dZ	 	 	 	 	 	 d6dZ	 d7	 	 	 	 	 d8dZd7d9dZ	 d7	 	 	 	 	 d:d Zd;d!Zd<d"Z d%d#Z!d%d$Z"y)=AstroidManagerz_Responsible to build astroid from files or modules.

    Use the Borg (singleton) pattern.
    zastroid loaderFd   )
astroid_cache_mod_file_cache_failed_import_hooksalways_load_extensionsoptimize_astmax_inferable_valuesextension_package_whitelistmodule_denylist
_transformprefer_stubszClassVar[AstroidManagerBrain]brainc                T   t         j                  d   | _        t         j                  d   | _        t         j                  d   | _        t         j                  d   | _        t         j                  d   | _        t         j                  d   | _        t         j                  d   | _        y )Nr&   r'   r(   r,   r-   r.   r/   )	r$   r0   r&   r'   r(   r,   r-   r.   r/   selfs    r!   __init__zAstroidManager.__init__D   s    +11/B-334EF$2$8$89O$P!+9+?+?),
(  .334EF(..|<*00@    c                (    t         j                  d   S Nr)   r$   r0   r2   s    r!   r)   z%AstroidManager.always_load_extensionsP   s    ##$<==r5   c                *    |t         j                  d<   y r7   r8   r3   values     r!   r)   z%AstroidManager.always_load_extensionsT   s    9>56r5   c                (    t         j                  d   S Nr*   r8   r2   s    r!   r*   zAstroidManager.optimize_astX       ##N33r5   c                *    |t         j                  d<   y r=   r8   r:   s     r!   r*   zAstroidManager.optimize_ast\       /4^,r5   c                (    t         j                  d   S Nr+   r8   r2   s    r!   r+   z#AstroidManager.max_inferable_values`   s    ##$:;;r5   c                *    |t         j                  d<   y rB   r8   r:   s     r!   r+   z#AstroidManager.max_inferable_valuesd   s    7<34r5   c                .    | j                   j                  S N)r.   register_transformr2   s    r!   rF   z!AstroidManager.register_transformh   s     111r5   c                .    | j                   j                  S rE   )r.   unregister_transformr2   s    r!   rH   z#AstroidManager.unregister_transformm   s    333r5   c                     | j                   d   S )Nbuiltins)r&   r2   s    r!   builtins_modulezAstroidManager.builtins_moduleq   s    !!*--r5   c                (    t         j                  d   S Nr/   r8   r2   s    r!   r/   zAstroidManager.prefer_stubsu   r>   r5   c                *    |t         j                  d<   y rM   r8   r:   s     r!   r/   zAstroidManager.prefer_stubsy   r@   r5   c                8    | j                   j                  |      S )z8Visit the transforms and apply them to the given *node*.)r.   visit)r3   nodes     r!   visit_transformszAstroidManager.visit_transforms}   s    $$T**r5   Nc                   |	 dj                  t        |            }|| j                  v r+| j                  |   j                  |k(  r| j                  |   S 	 t        |d| j                        }d}|| j                  v r+| j                  |   j                  |k(  r| j                  |   S |rddlm	}  ||       j                  ||      S |r|r| j                  |      S t        d|      # t        $ r |}Y w xY w# t        $ r Y w xY w)/Given a module name, return the astroid object..T)include_no_extr/   r   AstroidBuilderz"Unable to build an AST for {path}.)path)joinr   ImportErrorr&   filer   r/   r   astroid.builderrX   
file_buildast_from_module_namer   )r3   filepathmodnamefallbacksourcerX   s         r!   ast_from_filezAstroidManager.ast_from_file   s$    ?#((#4X#>? t)))""7+00H<%%g..	&D<M<MH F
 t)))""7+00H<%%g..6!$'228WEE,,W55"#GhWW;  #"#  		s#   C- C> -C;:C;>	D
	D
c                @    ddl m}  ||       j                  |||      S )z]Given some source code as a string, return its corresponding astroid
        object.
        r   rW   r]   rX   string_build)r3   datara   r`   rX   s        r!   ast_from_stringzAstroidManager.ast_from_string   s!     	3d#00wIIr5   c                >    ddl m}  ||       j                  d|      S )Nr   rW    rf   )r3   ra   rX   s      r!   _build_stub_modulez!AstroidManager._build_stub_module   s    2d#00W==r5   c                     ddl m}  |||      S )Nr   )build_namespace_package_module)r]   rn   )r3   ra   rY   rn   s       r!   _build_namespace_modulez&AstroidManager._build_namespace_module   s     	C-gt<<r5   c                `    | j                   ryt        |      ryt        || j                        S NT)r)   r   r   r,   )r3   ra   s     r!   _can_load_extensionz"AstroidManager._can_load_extension   s1    &&G$AT55
 	
r5   c                    |t        d      || j                  v rt        d|      || j                  v r|r| j                  |   S |dk(  r| j	                  |      S |rFt        j                         }t        j                  t
        j                  j                  |             	 | j                  ||      }|j                  t        j                  j                  k(  r8| j                  |j                         }|!||rt        j                         S S |j                  t        j                  j"                  t        j                  j$                  fv r|j                  t        j                  j$                  k(  r:| j'                  |      s)| j	                  |      |rt        j                         S S 	 t)        |      }| j-                  ||      |rt        j                         S S |j                  t        j                  j.                  k(  rt        d||j                         |j                  t        j                  j0                  k(  r8| j3                  ||j4                  xs g       |rt        j                         S S |j                  t        j                  j6                  k(  rk|j                   )| j	                  |      |rt        j                         S S | j9                  |j                   |d	      |rt        j                         S S |j                   t        d
|      | j9                  |j                   |d	      |rt        j                         S S # t*        $ r}t        d||j                         |d}~ww xY w# t         $ rN}| j:                  D ]8  }		  |	|      c cY d}~|rt        j                         S S # t         $ r Y 6w xY w |d}~ww xY w# |rt        j                         w w xY w)rT   NzNo module name given.zSkipping ignored module __main__z&Loading {modname} failed with:
{error})ra   rY   z)Unable to load compiled module {modname}.F)rb   z'Can't find a file for module {modname}.)ra   )r   r-   r   r&   rl   osgetcwdchdirrY   dirnamefile_from_module_nametyper   
ModuleTypePY_ZIPMODULEzip_import_datalocation	C_BUILTINC_EXTENSIONrr   r   r   ast_from_modulePY_COMPILEDPY_NAMESPACEro   submodule_search_locations	PY_FROZENrd   r(   )
r3   ra   context_file	use_cacheold_cwd
found_specmodulenamed_moduleehooks
             r!   r_   z#AstroidManager.ast_from_module_name   s    ?&'>??
 d***$'?{%KLLd(((Y%%g..j **733iikGHHRWW__\23;	"33G\JJ$//">">>--j.A.AB%!j ! g ))++% 
 OOt'B'BB 44W=227;V ! U#8#AL ++L'BD ! A DOO$?$??(?##,,  DOO$@$@@33ZBBHb0 ! + DOO$=$==&&.227;& ! ! ))**=*=wQV)W  !  ""*(=w  %%j&9&97U%S ! Q ! ,A ''00 	@ $ 	11=(
 ! 	 ,  2
 G	 ! s   (AN BN ;M/ N 0BN AN *N  6N /	N8NNN 	O0"O+2O9O+;O0<O3 	O%"O+$O%%O++O00O3 3Pc                   t         y ddlm}  ||       }t        D ]  }	 |j	                  |t
        j                  j                  z   d      \  }}	 t        j                  ||z         }|j                  t
        j                  j                  d      }|j                  |      r|dz   }|j                  |j                  |      ||      }	|	c S  y # t        $ r Y w xY w# t        $ r Y w xY w)Nr   rW      rU   z	.__init__)	zipimportr]   rX   ZIP_IMPORT_EXTSrsplitru   rY   sep
ValueErrorzipimporterreplace
is_packagerg   
get_sourcer   )
r3   r`   rX   builderexteggpathresourceimporterzmodnamer   s
             r!   r}   zAstroidManager.zip_import_data   s     	3 &"C$,OOC"''++4Eq$I!
$003?#++BGGKK=&&x0'+5H --''18X  #      s$   0CA;C 	CC 	C,+C,c           	     N   	 | j                   ||f   }t        |t              r|j                  d       |S # t        $ re 	 t        |j                  d      |      }n3# t        $ r'}t        d||j                  d             }Y d }~nd }~ww xY w|| j                   ||f<   Y w xY w)NrU   )r   z6Failed to import module {modname} with error:
{error}.)ra   error)	r'   KeyErrorr   splitr[   r   with_traceback
isinstancer   )r3   ra   contextfiler;   r   s        r!   ry   z$AstroidManager.file_from_module_name:  s    	A((';)?@E e12&&t,,!  	A
.MM#&[  *M#**40	 <AD  ';!78	As9   6 	B$ AB$	B&BB$BB$#B$c                   |xs |j                   }|| j                  v r| j                  |   S 	 |j                  }t        |      r| j	                  ||      S 	 ddlm}  ||       j                  ||      S # t
        $ r Y )w xY w)z4Given an imported module, return the astroid object.r   rW   )	__name__r&   __file__r   rd   AttributeErrorr]   rX   module_build)r3   r   ra   r`   rX   s        r!   r   zAstroidManager.ast_from_moduleQ  s     ,V__d(((%%g..	H)))(G<< * 	3d#00AA  		s   (A7 7	BBc                   |	 |j                   }| j	                  |      }|j                  |j                        d   }t        |t        j                        sJ |S # t        $ r}t        d|t        |      |      |d}~ww xY w)z Get astroid for the given class.Nz,Unable to get module for class {class_name}.)cls
class_reprra   r   )

__module__r   r   r"   r_   getattrr   r   r	   ClassDef)r3   klassra   exc
modastroidrets         r!   ast_from_classzAstroidManager.ast_from_classf  s    ?** ..w7
  03#u~~...
 " *B(/#	
 s   A 	B&A??Bc              #    K   t        |d      rt        |t              s|j                  }n*t        |t              r|}nt	        ddt        |            	 |j                  }	 |j                  }| j                  |      }||u r|j                  ||      E d{    y|j                  ||      D ]  }|j                           y# t        $ r}t	        d|t        |            |d}~wt        $ r}t        d|t        |            |d}~ww xY w# t        $ r}t	        d|t        |            |d}~wt        $ r}t        d|t        |            |d}~ww xY w7 ɭw)	z"Infer astroid for the given class.	__class__z$Unable to get type for {class_repr}.N)r   r   z&Unable to get module for {class_repr}.zBUnexpected error while retrieving module for {class_repr}:
{error}z%Unable to get name for {class_repr}:
z@Unexpected error while retrieving name for {class_repr}:
{error})hasattrr   rz   r   r   r"   r   r   r   r   r   r_   igetattrinstantiate_class)	r3   r    contextr   ra   r   namer   inferreds	            r!   infer_ast_from_somethingz'AstroidManager.infer_ast_from_somethingw  s     3$ZT-BMMET"E&6$S> 
	&&G	>>D ..w7
C<!**4999&//g>0022 ?A  	&8$U+ 	
  	$$U+	
 	  	&8$U+ 	
  	$S$U+ 		 :sl   AE&C
 $D 0*E&E$/E&
	DC++D7DDE&	E! D88E!EE!!E&c                :    | j                   j                  |       y)a}  Registers a hook to resolve imports that cannot be found otherwise.

        `hook` must be a function that accepts a single argument `modname` which
        contains the name of the module or package that could not be imported.
        If `hook` can resolve the import, must return a node of type `astroid.Module`,
        otherwise, it must raise `AstroidBuildingError`.
        N)r(   append)r3   r   s     r!   register_failed_import_hookz*AstroidManager.register_failed_import_hook  s     	!!((.r5   c                P    | j                   j                  |j                  |       y)z<Cache a module if no module with the same name is known yet.N)r&   
setdefaultr   )r3   r   s     r!   cache_modulezAstroidManager.cache_module  s    %%fkk6:r5   c                0    ddl m} |j                          y)zBootstrap the required AST modules needed for the manager to work.

        The bootstrap usually involves building the AST for the builtins
        module, which is required by the rest of astroid to work correctly.
        r   )raw_buildingN)astroidr   _astroid_bootstrapping)r3   r   s     r!   	bootstrapzAstroidManager.bootstrap  s     	)++-r5   c                   ddl m} ddlm} ddlm} ddlm} ddlm	} ddl
m}  |        t                | j                  j                          | j                  j                          t!        j"                  t$              t&        j(                  d   _        |j,                  t.        t0        t2        j4                  |j6                  |j8                  |fD ]  }|j;                           | j=                           ||        y	)
zgClear the underlying caches, bootstrap the builtins module and
        re-register transforms.
        r   )register_all_brains)clear_inference_tip_cache)
_find_spec)ObjectModel)LookupMixIn)r   r.   N)astroid.brain.helpersr   astroid.inference_tipr    astroid.interpreter._import.specr   astroid.interpreter.objectmodelr   astroid.nodes._base_nodesr   astroid.nodes.scoped_nodesr   r   r&   clearr'   collectionsdefaultdictlistr$   r0   
transformslookupr   r   r   is_namespace
attributes_metaclass_lookup_attributecache_clearr   )r3   r   r   r   r   r   r   	lru_caches           r!   clear_cachezAstroidManager.clear_cache  s     	>C??97!#  """$ 9D8O8OPT8U\*5 """00
I !!#
 	 	D!r5   )returnNone)r   bool)r;   r   r   r   )r   int)r;   r   r   r   )r   nodes.Module)rQ   znodes.NodeNGr   r   )NTF)
r`   strra   
str | Nonerb   r   rc   r   r   r   )rk   N)rh   r   ra   r   r`   r   r   r   )ra   r   r   r   )ra   r   rY   zSequence[str]r   r   )ra   r   r   r   rq   )ra   r   r   r   r   r   r   r   )r`   r   r   znodes.Module | None)ra   r   r   r   r   zspec.ModuleSpecrE   )r   ztypes.ModuleTypera   r   r   r   )r   rz   ra   r   r   znodes.ClassDef)r    objectr   zInferenceContext | Noner   zIterator[InferenceResult])r   zCallable[[str], nodes.Module]r   r   )r   r   r   r   )#r   r   __qualname____doc__r   setr   r0   __annotations__r4   propertyr)   setterr*   r+   rF   rH   rK   r/   rR   rd   ri   rl   ro   rr   r_   r}   ry   r   r   r   r   r   r   r    r5   r!   r$   r$   0   s   
 D ""' #'*u5&(,E( 
A > > ""? #? 4 4 5 5 < <   = != 2 2 4 4 . . 4 4 5 5+ #(X(X (X 	(X
 (X 
(XV DH	J	J"%	J6@	J		J>=="/=	=
 $(	Q"Q" !Q" 	Q"
 
Q"f4)3	0 ?CB&B1;B	B*$ ?C1313$;13	"13f/;.$"r5   r$   )r    r   r   r   ),r   
__future__r   r   ru   typesr   collections.abcr   r   r   typingr   r   r   r	   astroid.contextr
   r   astroid.exceptionsr   r   astroid.interpreter._importr   r   astroid.modutilsr   r   r   r   r   r   r   r   r   r   astroid.transformsr   astroid.typingr   r   r   r"   r$   r   r5   r!   <module>r      s]   

 #  	   8 8    ? G 2   0 ?;v" v"r5   