
    i5/                        d dl 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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 d dlmZ  G d de          ZddZ G d de          ZdS )    )annotations)AssignmentStmtBlock	DecoratorDictionaryComprehension
ExpressionFuncDefFuncItemGeneratorExprImport
LambdaExpr
MemberExprMypyFileNameExprNode
SymbolNodeVar)ExtendedTraverserVisitorTraverserVisitor)Type)Errors)MissingTypesVisitorc                      e Zd ZdZdZd	dZdS )
_LambdaCheckerz:Check whether an AST subtree contains a lambda expression.F_or   returnNonec                    d| _         d S NT)found)selfr   s     \/root/projects/qq-shell/venv/lib64/python3.11/site-packages/mypyc/irbuild/prebuildvisitor.pyvisit_lambda_exprz _LambdaChecker.visit_lambda_expr    s    


    N)r   r   r   r   )__name__
__module____qualname____doc__r    r#    r$   r"   r   r      s3        DDE     r$   r   node'GeneratorExpr | DictionaryComprehensionr   boolc                <   t                      }t          | t                    r| j                            |           n4| j                            |           | j                            |           | j        D ]}|D ]}|                    |           |j        S )zReturn True if a comprehension body contains a lambda.

    Only checks body expressions (left_expr/key/value and conditions),
    not the sequences, since sequences are evaluated in the enclosing scope.
    )	r   
isinstancer   	left_expracceptkeyvalue	condlistsr    )r*   checkercondsconds       r"   _comprehension_has_lambdar7   $   s     G$&& #g&&&&   
'""" ! ! 	! 	!DKK    	!=r$   c                       e Zd ZdZd8 fdZd9dZd: fdZd; fdZd< fdZd=dZ	d>dZ
d? fd"Zd@ fd$ZdA fd&ZdB fd(ZdC fd+ZdDd-ZdEd0ZdFd3ZdGd6ZdFd7Z xZS )HPreBuildVisitora  Mypy file AST visitor run before building the IR.

    This collects various things, including:

    * Determine relationships between nested functions and functions that
      contain nested functions
    * Find non-local variables (free variables)
    * Find property setters
    * Find decorators of functions
    * Find module import groups

    The main IR build pass uses this information.
    errorsr   current_filer   decorators_to_removedict[FuncDef, list[int]]typesdict[Expression, Type]r   r   c                Z   t                                                       i | _        i | _        g | _        t                      | _        i | _        i | _        i | _	        || _
        i | _        d | _        || _        || _        t          |          | _        d | _        d| _        i | _        d S )Nr   )super__init__free_variablessymbols_to_funcsfuncssetprop_settersencapsulating_funcsnested_funcsfuncs_to_decoratorsr<   module_import_groups_current_import_groupr:   r;   r   missing_types_visitor_module_fitem_comprehension_countercomprehension_to_fitem)r!   r:   r;   r<   r>   	__class__s        r"   rB   zPreBuildVisitor.__init__E   s     	 @B =? &(
 +.%% DF  79 EG  ?S!
 AC!48"$&2%8%?%?" .2 '(# _a###r$   or   r,   c                >    t          |t                    sd | _        dS r   )r.   r   rL   )r!   rR   s     r"   visitzPreBuildVisitor.visit   s!    !V$$ 	.)-D&tr$   stmtr   c                    |j         r|j                            | j                   t	                                          |          S N)is_alias_defrvaluer0   rM   rA   visit_assignment_stmt)r!   rU   rQ   s     r"   rZ   z%PreBuildVisitor.visit_assignment_stmt   sA      	;Kt9:::ww,,T222r$   blockr   c                f    d | _         t                                          |           d | _         d S rW   )rL   rA   visit_block)r!   r[   rQ   s     r"   r]   zPreBuildVisitor.visit_block   s1    %)"E"""%)"""r$   decr   c                   |j         rt          |j         d         t                    r6|j         d         j        dk    r | j                            |j                   na|j                                         }|j        | j        v r+| j        |j                 }t          |          D ]}||= |sd S || j
        |j        <   t                                          |           d S )Nr   setter)
decoratorsr.   r   namerG   addfunccopyr<   reversedrJ   rA   visit_decorator)r!   r^   decorators_to_store	to_removeirQ   s        r"   rg   zPreBuildVisitor.visit_decorator   s    > 	I #.+Z88 IS^A=N=SW_=_=_!%%ch////&)n&9&9&;&;#8t888 $ 9#( CI%i00 3 3/22 / 5H(2$$$$$r$   fdefr	   c                Z    |                      |           |                     |           d S rW   )
visit_funcvisit_symbol_node)r!   rk   s     r"   visit_func_defzPreBuildVisitor.visit_func_def   s.    t$$$$$r$   exprr   c                0    |                      |           d S rW   )rm   r!   rp   s     r"   r#   z!PreBuildVisitor.visit_lambda_expr   s    r$   rd   r
   c                Z   | j         rN| j                            | j         d         g                               |           | j         d         | j        |<   | j                             |           t                                          |           | j                                          d S N)rE   rH   
setdefaultappendrI   rA   rm   pop)r!   rd   rQ   s     r"   rm   zPreBuildVisitor.visit_func   s    
 : 	5 $//
2CCJJ4PPP '+jnDd#
$4   
r$   r+   c                   d}| j         sH| j         t          d          | _        d| j        _        | j                             | j                   d}t          d| j         d          }| xj        dz  c_        |j        |_        || j        |<   | j                            | j         d         g                               |           | j         d         | j	        |<   | j                             |           t          |t                    r"t                                          |           n!t                                          |           | j                                          |r| j                                          dS dS )	zVisit a comprehension that contains lambdas.

        Creates a synthetic FuncDef to represent the comprehension's scope,
        registers it in the function nesting hierarchy, and traverses the
        comprehension body with it on the stack.
        FN__mypyc_module__   T__comprehension___ru   )rE   rN   r	   linerw   rO   rP   rH   rv   rI   r.   r   rA   visit_generator_exprvisit_dictionary_comprehensionrx   )r!   rR   pushed_modulecomprehension_fdefrQ   s       r"   _visit_comprehension_with_scopez/PreBuildVisitor._visit_comprehension_with_scope   s    z 	!!)%,-?%@%@"*+"'Jd0111 M %%W8S%W%W%WXX##q(##"#&);#A& 	 ++DJrNB??FFGYZZZ04
2,- 	
,---a'' 	6GG((++++GG221555
 	JNN	 	r$   r   c                    t          |          r|                     |           d S t                                          |           d S rW   )r7   r   rA   r   r!   rR   rQ   s     r"   r   z$PreBuildVisitor.visit_generator_expr   sK    $Q'' 	,0033333GG((+++++r$   r   c                    t          |          r|                     |           d S t                                          |           d S rW   )r7   r   rA   r   r   s     r"   r   z.PreBuildVisitor.visit_dictionary_comprehension   sK    $Q'' 	60033333GG22155555r$   impr   c                    | j         &| j        | j                                      |           n|g| j        |<   || _         t                                          |           d S rW   )rL   rK   rw   rA   visit_import)r!   r   rQ   s     r"   r   zPreBuildVisitor.visit_import   sc    %1%d&@AHHMMMM.1UD%c*),D&S!!!!!r$   r   c                    t          |j        t          t          f          r|                     |j                   d S d S rW   )r.   r*   r   r	   rn   rr   s     r"   visit_name_exprzPreBuildVisitor.visit_name_expr  s@    di#w00 	.""49-----	. 	.r$   varr   c                0    |                      |           d S rW   )rn   )r!   r   s     r"   	visit_varzPreBuildVisitor.visit_var  s    s#####r$   symbolr   c                   | j         sd S || j        v r| j        |         }|                     | j         d         |          r\| j         d         | j        |<   | j                            | j         d         t                                                    |           d S |                     || j         d                   r|                     |           d S d S | j         d         | j        |<   d S rt   )rE   rD   	is_parentrC   rv   rF   rc   add_free_variable)r!   r   	orig_funcs      r"   rn   z!PreBuildVisitor.visit_symbol_node  s    z 	 FT***-f5I~~djni88 /
 15
2%f-#..tz"~suuEEII&QQQQQ	4:b>:: / &&v.....	/ / -1JrND!&)))r$   fitemchildc                j    || j         vrdS | j         |         }||k    p|                     ||          S )NF)rI   r   )r!   r   r   parents       r"   r   zPreBuildVisitor.is_parent%  sA     )))5"5)?$.."?"??r$   c                    | j         |         }| j                            |t                                                    |           d S rW   )rD   rC   rv   rF   rc   )r!   r   rd   s      r"   r   z!PreBuildVisitor.add_free_variable-  sB     $V,&&tSUU3377?????r$   )
r:   r   r;   r   r<   r=   r>   r?   r   r   )rR   r   r   r,   )rU   r   r   r   )r[   r   r   r   )r^   r   r   r   )rk   r	   r   r   )rp   r   r   r   )rd   r
   r   r   )rR   r+   r   r   )rR   r   r   r   )rR   r   r   r   )r   r   r   r   )rp   r   r   r   )r   r   r   r   )r   r   r   r   )r   r
   r   r
   r   r,   )r%   r&   r'   r(   rB   rT   rZ   r]   rg   ro   r#   rm   r   r   r   r   r   r   rn   r   r   __classcell__)rQ   s   @r"   r9   r9   6   s        <a <a <a <a <a <a|   
3 3 3 3 3 3* * * * * *
% % % % % %6% % % %
        "# # # # # #J, , , , , ,6 6 6 6 6 6" " " " " ". . . .$ $ $ $; ; ; ;:@ @ @ @@ @ @ @ @ @ @ @r$   r9   N)r*   r+   r   r,   )
__future__r   
mypy.nodesr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   mypy.traverserr   r   
mypy.typesr   mypyc.errorsr    mypyc.irbuild.missingtypevisitorr   r   r7   r9   r)   r$   r"   <module>r      s   " " " " " "                                   $ F E E E E E E E             @ @ @ @ @ @    %      ${@ {@ {@ {@ {@. {@ {@ {@ {@ {@r$   