
    Mh                     $   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlm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 dZd Zej        ed                         Z ed          ed                         Zd Zd Zd Z dS )a  
One of the really important features of |jedi| is to have an option to
understand code like this::

    def foo(bar):
        bar. # completion here
    foo(1)

There's no doubt wheter bar is an ``int`` or not, but if there's also a call
like ``foo('str')``, what would happen? Well, we'll just show both. Because
that's what a human would expect.

It works as follows:

- |Jedi| sees a param
- search for function calls named ``foo``
- execute these calls and check the input.
    )settings)debug)get_parent_scope)inference_state_method_cache)TreeArguments)get_executed_param_names)is_stdlib_path)to_list)instance)ValueSet	NO_VALUES)#get_module_contexts_containing_name)	recursion   c                       fd}|S )Nc                 (   | j         }t          j        || j                  5 }|rN|xj        dz  c_        	  | |          |xj        dz  c_        cd d d            S # |xj        dz  c_        w xY wt
          cd d d            S # 1 swxY w Y   d S )N   )inference_stater   execution_allowed	tree_nodedynamic_params_depthr   )function_valueparam_indexinfallowedfuncs       ]/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jedi/inference/dynamic_params.pywrapperz"_avoid_recursions.<locals>.wrapper&   s   ,(n.FGG 
	7  2((A-((24<<,,1,,
	 
	 
	 
	 
	 
	 
	 
	 ,,1,,,,,,
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	s(   BABA11	BBB )r   r   s   ` r   _avoid_recursionsr    %   s#         N    c                       j         j        st          S  j        }                                                                 }|t          |          rt          S |j        dk    rt          |          }|t          S n|j	        j
        }t          j        d|d                                            }t          |||          }t          j         fd|D                       }t          j        dd           |S )a:  
    A dynamic search for param values. If you try to complete a type:

    >>> def func(foo):
    ...     foo
    >>> func(1)
    >>> func("")

    It is not known what the type ``foo`` without analysing the whole code. You
    have to look for all calls to ``func`` to find out what ``foo`` possibly
    is.
    NlambdefzDynamic param search in %s.MAGENTA)colorc              3   h   K   | ],}t          |                                                   V  -d S )N)r   infer).0	argumentsr   r   s     r   	<genexpr>z'dynamic_param_lookup.<locals>.<genexpr>\   sY            	!I	
 	

	uww           r!   zDynamic param result finished)r   do_dynamic_params_searchr   r   get_root_context
py__file__r	   type_get_lambda_namenamevaluer   dbg_search_function_argumentsr   	from_sets)r   r   funcdefpathstring_namemodule_contextarguments_listvaluess   ``      r   dynamic_param_lookupr;   6   s'    )B &G**,,7799DN400
 |y  &w//  l(	I+[	JJJJ#4466N/UUN           (	       F 
I-Y????Mr!   N)defaultc           	   #     K   |}|dk    r(t          |          }|j        dk    r|j        j        }|}d}d}| j        }t
          j        rt          || g|d          }n| g}|D ]j}	t          |	|          D ]R\  }
}|dz  }||j	        z  t          k    r  dS |	                    |
          }t          ||||
|          D ]}d	}|V  	S|r dS kdS )
z(
    Returns a list of param names.
    __init__classdefFr      )limit_reductionr   NT)r   r.   r0   r1   r   r    dynamic_params_for_other_modulesr   _get_potential_nodesr   MAX_PARAM_SEARCHEScreate_context_check_name_for_execution)r8   r5   r7   compare_nodeclsfound_argumentsir   module_contextsfor_mod_contextr0   trailerrandom_contextr)   s                 r   r3   r3   f   sL      Lj  w''8z!!(.KLO	A$4O0 +=n-{
 
 
 ***  1/;OO 	  	 MD'FA
 ?77:LLL,;;DAAN6#^\4R R    	"&   	FF	% r!   c                     | j         }|j        dk    rGt          |                                d           }|dk    r|j        d         }|j        dk    r|j        S d S )N	expr_stmt=r   r0   )parentr.   nextyield_operatorschildrenr1   )nodestmtfirst_operatorfirsts       r   r/   r/      sb    ;DyKd2244d;;S  M!$EzV##{"4r!   c              #      K   	 | j                                         |         }n# t          $ r Y d S w xY w|D ]4}|                                }|j        }|j        dk    r|dk    r||fV  5d S )NrM   ()r   get_used_namesKeyErrorget_next_leafrR   r.   )module_valuefunc_string_namenamesr0   bracketrM   s         r   rC   rC      s      &55778HI        $$&&.<9$$C-	   s   $ 
22c           	   #      K   ddl m}  fd}                     |          D ]9}|j        }||k    r ||          V  t	          |j        |          r|j        dk    r|j                                        }	t          |	          dk    rl|	d                                         }
d |
D             |gk    r	                                }|
                     ||                    }t          ||	d         j                  }|D ]R\  }|j        |j        cxk     r|j        k     r1n $|                    |          }t!           |||          E d {V  S;d S )Nr   )BaseFunctionExecutionContextc                    j         d         }|dk    rd }t          |          }ddlm} | j        j        dk    r(t          j        | j        | |          } |||          S | 	                                r || j        |          }|S )Nr   )r   )InstanceArgumentsr?   )
rU   r   jedi.inference.value.instancerg   r   r.   r   TreeInstanceparent_contextis_bound_method)r1   arglistargsrg   created_instancecontextr   rM   s        r   create_argsz._check_name_for_execution.<locals>.create_args   s    "1%c>>G_gwHHCCCCCC?:--'4$	    %$%5t<<<$$&& ?((>>Kr!   r5   r   c                     g | ]	}|j         
S r   )r   )r(   vs     r   
<listcomp>z-_check_name_for_execution.<locals>.<listcomp>   s    ,,,,,,r!   )jedi.inference.value.functionrd   r'   r   
isinstancerj   r.   get_param_nameslenr,   
as_contextrC   r7   	start_posend_posrE   rF   )r   ro   rG   r0   rM   rd   rp   r1   
value_nodeparam_namesr:   r8   execution_contextpotential_nodesrN   s   ``  `          r   rF   rF      s     JJJJJJ      & !&&w55  _
:%%+e$$$$$$,.JKK 	 %22  .>>@@K;1$$ ^))++F,,V,,,>>!(!9!9!;!;$)$4$4[[5G5G$H$H!"6~{ST~Ga"b"b%4 	 	MD'!+dnQQQQz?QQQQQQ):)I)I$)O)O#<+*( #$ $       + r!   )!__doc__jedir   r   jedi.parser_utilsr   jedi.inference.cacher   jedi.inference.argumentsr   jedi.inference.paramr   jedi.inference.helpersr	   jedi.inference.utilsr
   jedi.inference.valuer   jedi.inference.base_valuer   r   jedi.inference.referencesr   jedi.inferencer   rD   r    increase_indentr;   r3   r/   rC   rF   r   r!   r   <module>r      s   &             . . . . . . = = = = = = 2 2 2 2 2 2 9 9 9 9 9 9 1 1 1 1 1 1 ( ( ( ( ( ( ) ) ) ) ) ) 9 9 9 9 9 9 9 9 I I I I I I $ $ $ $ $ $    " + +  +\ d++++ + 	 ,++\	 	 	
  
  
 1 1 1 1 1r!   