
    c                       d Z ddlm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 ddlmZ ddlmZ erdd	l
mZ ej        d
k    rddlmZ nddlmZ  G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d deee          Z G d de          Z G d de          ZdS )zThis module contains some base nodes that can be inherited for the different nodes.

Previously these were called Mixin nodes.
    )annotationsN)Iterator)TYPE_CHECKINGClassVar)
decorators)AttributeInferenceError)NodeNG)nodes)      )cached_property)cachedpropertyc                  $    e Zd ZdZdZ	 d Zd ZdS )	StatementzpStatement node adding a few attributes.

    NOTE: This class is part of the public API of 'astroid.nodes'.
    Tc                    | j                             |           }|                    |           }	 ||dz            S # t          $ r Y dS w xY w)z|The next sibling statement node.

        :returns: The next sibling statement node.
        :rtype: NodeNG or None
           N)parentchild_sequenceindex
IndexErrorselfstmtsr   s      9lib/python3.11/site-packages/astroid/nodes/_base_nodes.pynext_siblingzStatement.next_sibling'   s`     **400D!!	## 	 	 	44	s   
< 
A
	A
c                    | j                             |           }|                    |           }|dk    r||dz
           S dS )zThe previous sibling statement.

        :returns: The previous sibling statement node.
        :rtype: NodeNG or None
        r   N)r   r   r   r   s      r   previous_siblingzStatement.previous_sibling4   sJ     **400D!!A: 	$##t    N)__name__
__module____qualname____doc__is_statementr   r    r   r   r   r      sF         
 L2  
 
 
 
 
r   r   c                      e Zd ZdZddZdS )NoChildrenNodez1Base nodes for nodes with no children, e.g. Pass.returnIterator[NodeNG]c              #     K   dE d {V  d S )Nr$   r$   r   s    r   get_childrenzNoChildrenNode.get_childrenD   s      r   N)r'   r(   )r   r    r!   r"   r+   r$   r   r   r&   r&   A   s.        ;;     r   r&   c                       e Zd ZdZddZd ZdS )FilterStmtsBaseNodez6Base node for statement filtering and assignment type.mystmtStatement | Nonec                D    |                      d          |u r|gdfS |dfS )zAMethod used in _filter_stmts to get statements and trigger break.TfutureF	statement)r   _node_stmtsr.   s        r   _get_filtered_stmtsz'FilterStmtsBaseNode._get_filtered_stmtsK   s5    >>>&&&0 	  64<u}r   c                    | S Nr$   r*   s    r   assign_typezFilterStmtsBaseNode.assign_typeS       r   Nr.   r/   )r   r    r!   r"   r8   r;   r$   r   r   r-   r-   H   s=        @@       r   r-   c                       e Zd ZdZd ZddZdS )AssignTypeNodez8Base node for nodes that can 'assign' such as AnnAssign.c                    | S r:   r$   r*   s    r   r;   zAssignTypeNode.assign_typeZ   r<   r   r.   r/   c                T    | |u r|dfS |                      d          |u r|gdfS |dfS )zMethod used in filter_stmts.Tr1   Fr3   )r   lookup_noder6   r7   r.   s        r   r8   z"AssignTypeNode._get_filtered_stmts]   sK    6> 	 4<>>>&&&0 	  64<u}r   Nr=   )r   r    r!   r"   r;   r8   r$   r   r   r?   r?   W   s=        BB       r   r?   c                      e Zd ZdZd ZdS )ParentAssignNodezGBase node for nodes whose assign_type is determined by the parent node.c                4    | j                                         S r:   )r   r;   r*   s    r   r;   zParentAssignNode.assign_typek   s    {&&(((r   N)r   r    r!   r"   r;   r$   r   r   rD   rD   h   s)        QQ) ) ) ) )r   rD   c                  D    e Zd ZU dZded<   	 ded<   	 d Zddd
ZddZdS )
ImportNodez$Base node for From and Import Nodes.
str | Nonemodnamezlist[tuple[str, str | None]]namesc                    |S r:   r$   )r   framenames      r   _infer_namezImportNode._infer_name   r<   r   Nr'   nodes.Modulec                    |                                  }t          | dd          }|| j        }|                    ||          |j        k    rd}nd}|                    ||t          |o|dk              |          S )zGReturn the ast for a module whose name is <modname> imported by <self>.levelNFTr   )rQ   relative_only	use_cache)rootgetattrrI   relative_to_absolute_namerM   import_modulebool)r   rI   mymodulerQ   rS   s        r   do_import_modulezImportNode.do_import_module   s    99;;#D'488 	#lG
 --gu==N 	III %%u3!44	 & 
 
 	
r   asnamestrc                    | j         D ]9\  }}|dk    r|c S |s|                    dd          d         }|}||k    r|c S :t          d| |          )zGet name from 'as' name.*.r   r   z:Could not find original name for {attribute} in {target!r})target	attribute)rJ   splitr   )r   r[   rM   _asnames       r   	real_namezImportNode.real_name   s    !Z 	 	MD's{  zz#q))!,  %H
 
 
 	
r   r:   )rI   rH   r'   rO   )r[   r\   r'   r\   )r   r    r!   r"   __annotations__rN   rZ   rd   r$   r   r   rG   rG   o   s|         ..
 ('''  
 
 
 
 
.
 
 
 
 
 
r   rG   c                  d    e Zd ZU dZdZded<   ed             Zd Zd Z	e
j        d             Zd	S )
MultiLineBlockNodea(  Base node for multi-line blocks, e.g. For and FunctionDef.

    Note that this does not apply to every node with a `body` field.
    For instance, an If node has a multi-line body, but the body of an
    IfExpr is not multi-line, and hence cannot contain Return nodes,
    Assign nodes, etc.
    r$   zClassVar[tuple[str, ...]]_multi_line_block_fieldsc                D     t           fd j        D                       S )Nc              3  8   K   | ]}t          |          V  d S r:   )rU   ).0fieldr   s     r   	<genexpr>z8MultiLineBlockNode._multi_line_blocks.<locals>.<genexpr>   s-      UUeWT5))UUUUUUr   )tuplerh   r*   s   `r   _multi_line_blocksz%MultiLineBlockNode._multi_line_blocks   s)    UUUUt7TUUUUUUr   c              #  l   K   | j         D ])}|D ]$}|j        r
|                                E d {V  %*d S r:   )ro   is_function _get_return_nodes_skip_functionsr   block
child_nodes      r   rr   z3MultiLineBlockNode._get_return_nodes_skip_functions   sr      , 	I 	IE# I I
) %FFHHHHHHHHHHI	I 	Ir   c              #  l   K   | j         D ])}|D ]$}|j        r
|                                E d {V  %*d S r:   )ro   	is_lambda_get_yield_nodes_skip_lambdasrs   s      r   rx   z0MultiLineBlockNode._get_yield_nodes_skip_lambdas   sr      , 	F 	FE# F F
' %CCEEEEEEEEEEF	F 	Fr   c                |    d | j         D             }t          t          j                            |                    S )Nc              3  H   K   | ]}|D ]}|                                 V  d S r:   )_get_assign_nodes)rk   rt   ru   s      r   rm   z7MultiLineBlockNode._get_assign_nodes.<locals>.<genexpr>   sY       !
 !
#!
 !
  ((**!
 !
 !
 !
 !
 !
 !
r   )ro   list	itertoolschainfrom_iterable)r   children_assign_nodess     r   r{   z$MultiLineBlockNode._get_assign_nodes   sE    !
 !
0!
 !
 !

 IO112GHHIIIr   N)r   r    r!   r"   rh   re   r   ro   rr   rx   r   cachedr{   r$   r   r   rg   rg      s           ;=<<<<V V _VI I IF F F J J J J Jr   rg   c                  0    e Zd ZdZed             ZddZdS )MultiLineWithElseBlockNodez>Base node for multi-line blocks that can have else statements.c                    | j         S r:   )linenor*   s    r   blockstart_tolinenoz.MultiLineWithElseBlockNode.blockstart_tolineno   s
    {r   Nc                    || j         k    r||fS |r2||d         j         k    r||d         j        fS ||d         j         dz
  fS ||p| j        fS )z_Handle block line numbers range for try/finally, for, if and while
        statements.
        r   r   )
fromlinenotolineno)r   r   orelselasts       r   _elsed_block_rangez-MultiLineWithElseBlockNode._elsed_block_range   st     T_$ 	"6>! 	4-- 3vbz2226!9/!333t,t},,r   r:   )r   r    r!   r"   r   r   r   r$   r   r   r   r      sG        HH  _
- 
- 
- 
- 
- 
-r   r   )r"   
__future__r   r}   syscollections.abcr   typingr   r   astroidr   astroid.exceptionsr   astroid.nodes.node_ngr	   r
   version_info	functoolsr   astroid.decoratorsr   r   r&   r-   r?   rD   rG   rg   r   r$   r   r   <module>r      sU  
 
 # " " " " "     



 $ $ $ $ $ $ * * * * * * * *       6 6 6 6 6 6 ( ( ( ( ( ( v E)))))))DDDDDD               F    V       &       V   ") ) ) ) )~ ) ) )8
 8
 8
 8
 8
$ni 8
 8
 8
v$J $J $J $J $J $J $J $JN- - - - -!3 - - - - -r   