
    eb                    @   U 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	Z	ddl
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 dd	lmZ dd
lmZ  ej:                  e      Zee	j@                  e	jB                  e	jD                  e	jF                  e	jH                  e	jJ                  f   Z& e'ejP                        Z) e*d      Z+ e*e,      Z- e*d      Z.d$dZ/d%dZ0efd$dZ1d$dZ2d&dZ3d'd(dZ4	 d)	 	 	 	 	 	 	 d*dZ5	 	 	 	 	 	 d+	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d,dZ6d-dZ7d'd.dZ8	 	 	 	 	 	 	 	 d/dZ9	 	 	 	 d0dZ:	 	 	 	 	 	 	 	 d1dZ;	 	 	 	 	 	 	 	 d2dZ<	 	 	 	 	 	 	 	 d1dZ=	 	 d3	 	 	 	 	 	 	 	 	 	 	 d4dZ>	 	 	 	 	 	 	 	 	 	 d5dZ?d6dZ@ G d d      ZAi ZBd eCd!<   d7d"ZDd%d#ZEy)8zthis module contains a set of functions to create astroid trees from scratch
(build_* functions) or from living object (object_build_* functions)
    )annotationsN)Iterable)redirect_stderrredirect_stdout)AnyUnion)basesnodes)_EMPTY_OBJECT_MARKERIS_PYPY)AstroidManager)node_classes.c                4    ||_         | j                  |       y N)nameadd_local_node)parentnoder   s      6/usr/lib/python3/dist-packages/astroid/raw_building.py_attach_local_noder   /   s    DI
$    c                    |j                   }t        |dd      }|sy|j                  D cg c]  }|j                   }}t	        |||j
                        }|g| j                  d<   yc c}w )zFAdd a __class__ member to the given func node, if we can determine it.__name__N	__class__)r   getattr	__bases__r   build_class__doc__instance_attrs)funcmember
python_clscls_nameancestor	cls_bases	ast_klasss          r   _add_dunder_classr'   4   sl    !!Jz:t4H3=3G3GHx""HIHHi1C1CDI(1{D$ Is   A(c                T    t        j                         }||_        t        | ||       y)zdcreate a dummy node and register it in the locals of the given
    node with the specified name
    N)r
   	EmptyNodeobjectr   )r   r   runtime_objectenodes       r   attach_dummy_noder-   ?   s#     OOE!ELtUD)r   c                b    || j                   vr!t        | t        j                  |      |       yy)zdcreate a Const node and register it in the locals of the given
    node with the specified name
    N)special_attributesr   r
   const_factory)r   r   values      r   attach_const_noder2   H   s.     4***4!4!4U!;TB +r   c                P    t        j                  ||dfg      }t        | ||       y)zicreate a ImportFrom node and register it in the locals of the given
    node with the specified name
    N)r
   
ImportFromr   )r   modname
membername	from_nodes       r   attach_import_noder8   P   s*       J+=*>?ItY
3r   c                    t        j                  | dd      }|j                  g |rt        j                  |      nd       |S )z,create and initialize an astroid Module nodeF)pure_pythonpackager1   N)bodydoc_node)r
   ModulepostinitConst)r   docr   s      r   build_modulerC   X   s?    <<%?DMM+.3'D   Kr   c                   t        j                  | ddddt        j                               }|j                  |D cg c]  }t        j                  |dd|dd       c}g d|rt        j
                  |      nd       |S c c}w )z/Create and initialize an astroid ClassDef node.r   lineno
col_offset
end_linenoend_col_offsetr   N)r   rF   rG   r   rH   rI   r<   r	   r=   
decoratorsr>   )r
   ClassDefUnknownr@   NamerA   )r   	basenamesrB   r   bases        r   r   r   b   s     >>}}D 	MM "

  JJ#

 +.3'D    K

s   "Bc                D   t        j                  | ddt        j                         dd      }t        j                  |dd      }|)|D 	cg c]  }	t        j
                  |	|dddd       }
}	nd}
|d}n6g }|D ]/  }t        j                  |      }||_        |j                  |       1 |d}n6g }|D ]/  }t        j                  |      }||_        |j                  |       1 |j                  |
||xs dD 	cg c]  }	t        j
                  |	|dddd       c}	|g |xs dD 	cg c]  }	t        j
                  |	|dddd       c}	g g        |j                  |g |rt        j                  |      nd	       |rt        |       |S c c}	w c c}	w c c}	w )
z1create and initialize an astroid FunctionDef noder   )rF   rG   r   rI   rH   N)r   varargkwarg)r   r   rF   rG   rH   rI    )argsdefaults
kwonlyargskw_defaultsr   posonlyargskwonlyargs_annotationsposonlyargs_annotationsr<   )rU   r=   r>   )r
   FunctionDefr   rM   	Arguments
AssignNamer0   r   appendr@   rA   register_arguments)r   rU   rY   rV   rB   rW   kwonlydefaultsr    argsnodearg	argumentsdefault_nodesdefaultdefault_nodekwonlydefault_nodeskwonlydefaultkwonlydefault_nodes                    r   build_functionrk      s    ##%D d4tDH
  

  #

	 

 	  	/G ..w7L"*L  .	/ " + 	;M!&!4!4]!C(0%&&'9:	;  "'R

  #

 ( #(b

  #

  " "9  < 	MM+.3'D  
 4 KS

N



s   "F>"F,"Fc                X    t        j                  | |D cg c]  }|df c}      S c c}w )z<create and initialize an astroid ImportFrom import statementN)r
   r4   )fromnamenamesr   s      r   build_from_importro      s'    H&Fd|&FGG&Fs   '
c                   || j                   j                  r0| j                  | j                   j                  | j                          | j                   j                  r0| j                  | j                   j                  | j                          | j                   j                   }|y|D ]O  }t	        |t
        j                        r| j                  |j                  |       :t        | |j                         Q y)z{add given arguments to local

    args is a list that may contains nested lists
    (i.e. def func(a, (b, c, d)): ...)
    N)
rU   rR   	set_localrS   
isinstancer
   r^   r   r`   elts)r    rU   rc   s      r   r`   r`      s     |99NN499++TYY799??NN499??DII6yy~~< /c5++,NN388S)tSXX.	/r   c                p    |j                   D cg c]  }|j                   }}t        | |||      S c c}w )z(create astroid for a living class object)	localname)r   r   _base_class_object_build)r   r!   ru   rP   rO   s        r   object_build_classrw     s7     ,2+;+;<4<I<#D&)yQQ =s   3c                   t        j                  |       }g }g }g }g }g }|j                  j                         D ]  \  }}|j                  t         j
                  j                  k(  r|j                  |       n&|j                  t         j
                  j                  k(  r|j                  |       n|j                  t         j
                  j                  k(  r|j                  |       n|j                  t         j
                  j                  k(  r|j                  |       n{|j                  t         j
                  j                  k(  rT|j                  |       |j                  t         j
                  j                  ur|j                  |j                         g|j                  t         j
                  j                  us|j                  |j                          |||||fS )zjReturns args, posonlyargs, defaults, kwonlyargs.

    :note: currently ignores the return annotation.
    )inspect	signature
parametersitemskind	ParameterPOSITIONAL_ONLYr_   POSITIONAL_OR_KEYWORDVAR_POSITIONALVAR_KEYWORDKEYWORD_ONLYrf   empty)	r!   rz   rU   rV   rY   rW   ra   
param_nameparams	            r   _get_args_info_from_callabler     sp    !!&)IDHKJ "N&11779 +
E::**:::z*ZZ7,,BBBKK
#ZZ7,,;;;KK
#ZZ7,,888KK
#ZZ7,,999j)}}G$5$5$;$;;%%emm4== 1 1 7 77OOEMM*+" h
NBBr   c           	         t        |      \  }}}}}t        t        |dd      xs |||||j                  ||      }| j	                  ||       y)z+create astroid for a living function objectr   N)rW   ra   )r   rk   r   r   r   )	r   r!   ru   rU   rY   rV   rW   kwonly_defaultsr    s	            r   object_build_functionr   .  se     	%V, 
D)6Y&D 	i(r   c                    t        | |g |      S )z2create astroid for a living data descriptor object)rv   )r   r!   r   s      r   object_build_datadescriptorr   G  s     $D&"d;;r   c                    t        t        |dd      xs ||j                        }| j                  ||       t	        ||       y)z4create astroid for a living method descriptor objectr   N)rB   )rk   r   r   r   r'   )r   r!   ru   r    s       r   object_build_methoddescriptorr   N  sA     
D)6YFNND 	i(dF#r   c                   |xs t        |dd      xs |}t        |t              sJ t        |||j                        }t        |t
              |_        | j                  ||       	 t        |t              r |       j                  }nt        	 |j                         D ]>  \  }}	t        j                         }
|	|
_        ||
_        d|
_        |
g|j$                  |<   @ |S # t        $ r Y |S w xY w)zbcreate astroid for a living class object, with a given set of base names
    (e.g. ancestors)
    r   N   )r   rr   strr   r   type	_newstyler   
issubclass	Exception__dict__	TypeErrorr|   r
   r)   r*   r   rF   r   )r   r!   rO   r   ru   
class_nameklassinstdict	item_nameobjvalnodes              r   rv   rv   \  s     GT:GiJj#&&&E
 !.EOy)8
 fi(x((HO  'nn. 	8NIsoo'G GN"GNGN/6iE  +	8 L   Ls   '(C# #	C0/C0c                    	 |j                   }t        |dd       }| t        |t              sJ t        | ||       y |t        |dd       k7  rt        | ||       y t        | ||       y # t        $ r d }Y hw xY w)Nco_filename__file__)__code__AttributeErrorr   rr   r*   r   r-   r   )r   r   r!   modulecodefilenames         r   _build_from_functionr     s    
 t]D1H&&)))%dFD9	WVZ6	6$f-dFD1   s   A) )A76A7c                :    	 t        | |      S # t        $ r Y yw xY w)zwRequired because unexpected RunTimeError can be raised.

    See https://github.com/pylint-dev/astroid/issues/1958
    F)hasattrr   )r   r!   s     r   _safe_has_attributer     s&    
sF## s    	c                  b    e Zd ZU dZdZded<   d
ddZ	 	 d	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZdd	Z	y)InspectBuilderzclass for building nodes from living object

    this is actually a really minimal representation, including only Module,
    FunctionDef and ClassDef nodes and some others as guessed.
    FboolbootstrappedNc                <    |xs
 t               | _        i | _        |  y r   )r   _manager_done)selfmanager_instances     r   __init__zInspectBuilder.__init__  s    (<N,<SU
r   c                   || _         ||j                  }	 t        ||j                        }||x|_        |_        n9t        j
                  j                  |      g|_        |j
                  d   |_        ||_	        | j                  j                  |       t        |d      |_        i | _        | j                  ||       |S # t        $ r t        |      }Y w xY w)zbuild astroid from a living module (i.e. using inspect)
        this is used when there is no python source code available (either
        because it's a built-in module or because the .py is not available)
        r   __path__)_moduler   rC   r   r   pathfileosabspathr   r   cache_moduler   r;   r   object_build)r   r   r5   r   r   s        r   inspect_buildzInspectBuilder.inspect_build  s     ?ooG	)8D <$((DI	./DI		!DI	""4(vz2
$'  	)(D	)s   C CCc                   || j                   v ry|| j                   |<   t        |      D ]  }t        xr |dk(  }	 t        j                         5  t        j
                  d       t        ||      }ddd       t        j                        r|s|j                  }t        j                  |      rt        |||| j                         t        j                  |      s|r"| j!                  |||      rt#        |||       t        j$                  |      r| j!                  |||      r|| j                   v r\| j                   |   }t'        |t(        j*                        sJ ||j,                  j/                  |d      vr2|j1                  ||       nt3        |||      }| j5                  ||       |dk(  s|j6                  | j                   | j                     |_        t        j8                  |      rt#        |||       t        j:                  |      rt=        |||       
t'        |t>              rtA        |||       )t        jB                  |      rt        |||| j                         XtE        |d      r,tG        |      }tI        |||       | j5                  ||       t        |||        y# 1 sw Y   [xY w# t        $ r t        ||       Y w xY w)z}recursive method which create a partial ast from real objects
        (only function, class, and method are handled)
        N__class_getitem__ignorerT   r   __all__)%r   dirr   warningscatch_warningssimplefilterr   r   r-   ry   ismethod__func__
isfunctionr   r   	isbuiltinimported_memberr   isclassrr   r
   rL   localsgetr   rw   r   r   ismethoddescriptorisdatadescriptorr   
_CONSTANTSr2   	isroutiner   rC   r   )r   r   r   r   pypy__class_getitem__r!   
class_noder   s           r   r   zInspectBuilder.object_build  s    $**

3H 3	6D %,$K8K0K!,,. 0))(3$S$/F0 '0E!!&)$T4F""6*.C''fd;-dFDA(''fd;TZZ'!%F!3J%j%..AAA!r)BB++J=!3D&$!GJ%%j&9;&:+<+<+D(,

4<<(@J%++F3-dFDA))&1+D&$?FJ/!$f5""6* %T4F$VY7%d+"46!!&&1 "$f5g3	6h _0 0 " !$-s)   K"K2KK	KK10K1c                v   	 t        |dd      }|#|dv rt        j                  }nt	        |||       y|dk(  r| j
                  j                  dk(  sydd	ij                  ||      }|| j
                  j                  k7  r	 t        t        j                               5 }t        t        j                               5 }t        t        j                  |   |       |j                         }|r)t        j                  d
|t        j                  |   |       |j                         }	|	r)t        j!                  d|t        j                  |   |	       ddd       ddd       t#        |||       yy# t        $ r d}Y nw xY w# 1 sw Y   2xY w# 1 sw Y   6xY w# t$        t&        f$ r t	        |||       Y yw xY w)z1verify this is not an imported class or handle it
__module__N>   __new____subclasshook__T_iobuiltinsFgtkgtk_gtkz,Captured stderr while getting %s from %s:
%sz,Captured stdout while getting %s from %s:
%s)r   r   r   r   r-   r   r   r   ioStringIOr   sysmodulesgetvalueloggererrorinfor8   KeyErrorr   )
r   r   r!   r   r5   	real_namestderrstdoutstderr_valuestdout_values
             r   r   zInspectBuilder.imported_member  s   
	flD9G ?66 #++!$f5
 eDLL$9$9Z$GI&**7G<	---8$R[[]3 vKKM@ CKK0$7#)??#4L#K KK0(	 $*??#4L#K KK0(	 . #4$7c  	G	0   ( n- 6!$f5 	6sT   E/ F F<BFFF /E>=E>F
	FFF F87F8r   )r   zAstroidManager | NonereturnNoneNN)r   types.ModuleTyper5   
str | Noner   r   r   nodes.Module)r   nodes.Module | nodes.ClassDefr   ztypes.ModuleType | typer   r   )r   r   r   r   )
r   r   __qualname__r   r   __annotations__r   r   r   r   rT   r   r   r   r     sn     L$' #	   	
 
<=1=8O=	=~8r   r   zdict[type, nodes.ClassDef]_CONST_PROXYc                <    t         | j                  j                     S r   )r   r1   r   )consts    r   _set_proxiedr   Q  s    --..r   c            
     
   t               } | j                  t              }t        j                  j                         D ]  \  }}|t        u rt        d      }||_        np|t        u rt        d      }||_        nU|t        u rt        d      }||_        n:|j                  |j                        d   }t        |t        j                        sJ |t         t"        t$        t&        fv r||_        |t*        |<    t-        t.              t        j0                  _        t        j                  t2        j4                  j                  ddddt        j6                               }||_        t2        j4                  j8                  r.t        j0                  t2        j4                  j8                        nd}|j;                  g g d|       |t<        j>                  _        | jA                  t<        j>                  j(                  t2        j4                         tC        t2        d	      rt        j                  t2        jD                  j                  ddddt        j6                               }||_        t2        jD                  j8                  r.t        j0                  t2        jD                  j8                        nd}|j;                  g g d|       |t<        jF                  _        | jA                  t<        jF                  j(                  t2        jD                         tC        t2        d
      rt        j                  t2        jH                  j                  ddddt        j6                               }	||	_        t2        jH                  j8                  r.t        j0                  t2        jH                  j8                        nd}
|	j;                  g g d|
       |	t<        jH                  _        | jA                  t<        jH                  j(                  t2        jH                         t2        jJ                  t2        j4                  t2        jL                  t        t        t2        jN                  t2        jP                  t2        jR                  t2        jT                  t2        jV                  f
}|D ]  }|j                  |vst        j                  |j                  ddddt        j6                               }||_        |j;                  g g d|j8                  r t        j0                  |j8                        nd       | jA                  ||       |||j                  <    dt         _,        ddl-m.}  |        y)z)astroid bootstrapping the builtins moduleNoneTypeNotImplementedTypeEllipsisr   rE   r<   NrJ   AsyncGeneratorType	UnionTypeT)on_bootstrap)/r   r   r   r   	CONST_CLSr|   	TYPE_NONEr   r   TYPE_NOTIMPLEMENTEDTYPE_ELLIPSISr   r   rr   r
   rL   dictlistsettuple_proxiedr   propertyr   rA   typesGeneratorTyperM   r   r@   r	   	Generatorr   r   r   AsyncGeneratorr   GetSetDescriptorTypeMemberDescriptorTypeFunctionType
MethodTypeBuiltinFunctionType
ModuleTypeTracebackTyper   %astroid.brain.brain_builtin_inferencer   )builderastroid_builtinclsnode_clsproxy_GeneratorTypegenerator_doc_node_AsyncGeneratorTypeasync_generator_doc_node_UnionTypeTypeunion_type_doc_nodebuiltin_types_typer   r   s                  r   _astroid_bootstrappingr!  V  sL    G++H5O%//557 &X)
+E*EL'' 45E*ELM!
+E*EL#++CLL9!<EeU^^4444sE** %H %L!&& $L1EKK^^$$}}N ,N && 	%--556 
 #	    .EOO1153F3FGu*+#nn$$--==?
 &5" ''// KKe66>>? 	!
 	$$-	 	% 	
 )<%U11::E<T<TUuk"OO$$==?
 !0 && KKeoo556 	
 	(	 	  	
 $2 U__55uG 	""""!!M  4>>0NN }}E +ELNN=B]]5==9PT	     ..3OENN+%4( #'N C Nr   )r   r   r   r   )r   r   )r5   r   r6   r   r   r   r   )r   r   rB   r   r   r   )rT   N)r   r   rO   zIterable[str]rB   r   r   nodes.ClassDef)NNNNNN)r   r   rU   list[str] | NonerY   r#  rV   list[Any] | NonerB   r   rW   r#  ra   r$  r   nodes.FunctionDef)rm   r   rn   	list[str]r   znodes.ImportFrom)r    r%  rU   zlist | Noner   r   )r   r   r!   r   ru   r   r   r"  )r!   _FunctionTypesr   z<tuple[list[str], list[str], list[Any], list[str], list[Any]])r   r   r!   r'  ru   r   r   r   )r   r   r!   r   r   r   r   r"  r   )r   r   r!   r   rO   r&  r   r   ru   r   r   r"  )
r   r   r   r   r!   r'  r   r   r   r   )r!   r   r   r   )r   r"  )Fr   
__future__r   r   ry   r   loggingr   r   r  r   collections.abcr   
contextlibr   r   typingr   r   astroidr	   r
   astroid.constr   r   astroid.managerr   astroid.nodesr   	getLoggerr   r   r  r  r  WrapperDescriptorTypeMethodDescriptorTypeClassMethodDescriptorTyper'  r  r   r   r   r   NotImplementedr   r  r   r'   r-   r2   r8   rC   r   rk   ro   r`   rw   r   r   r   r   rv   r   r   r   r   r   r   r!  rT   r   r   <module>r6     s  
 #   	  	 
   $ 7    7 * &			8	$ 						##% <))*
J	>* S	 
3 7K *C4 AE
'3=B "$(!%#''+d
d
d "d 	d
 
d !d %d dNH
/.R
'R15RBERRCCACD)
')1?)LO)	)2<
'<15<=@<<$
'$$ $ 
	$$  %
'%% % 	%
 % %P2
'2
2 2 	2
 
2.c cP ,.( -/
Jr   