a
    lc7j                     @   s  d dl 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 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 dl$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/ G dd de'Z0dd Z1dd Z2dd  Z3d!d" Z4d#d$ Z5d%d& Z6e/7 d'd( Z8G d)d* d*Z9d+d, Z:e ;d-Z<d.d/ Z=d0d1 Z>d2d3 Z?d7d5d6Z@dS )8    N)dedent)	Parameter)PythonTokenTypes)tree)search_ancestorLeaf)split_lines)debug)settings)classes)helpers)keywords)complete_dict)complete_file_name)imports)ValueSet)infer_call_of_leafparse_dotted_names)get_global_filters)TreeInstance)DocstringModule)ParamNameWrapperSubModuleName)convert_valuesconvert_namescut_value_at_position)plugin_managerc                   @   s   e Zd Zdd ZdS )ParamNameWithEqualsc                 C   s
   | j d S )N=)string_name)self r"   O/var/www/html/django/DPS/env/lib/python3.9/site-packages/jedi/api/completion.pyget_public_name   s    z#ParamNameWithEquals.get_public_nameN)__name__
__module____qualname__r$   r"   r"   r"   r#   r      s   r   c                 c   sb   | D ]X}t |jD ]H\}}|j}||k r4|tjkr4q|tjtjfv r|j|vrt|jV  qqd S N)		enumerateparamskindr   POSITIONAL_OR_KEYWORDKEYWORD_ONLYnamer   _name)
signaturespositional_countused_kwargsZcall_sigipr+   r"   r"   r#   _get_signature_param_names"   s    r5   c                 C   sn   |rdS d}| D ]X}t |jD ]@\}}|j}|tju r>  dS ||kr|tjtjfv rd} q`q|s qjq|S )NTF)r)   r*   r+   r   VAR_POSITIONALr,   POSITIONAL_ONLY)r0   r1   r2   Zmust_be_kwarg	signaturer3   r4   r+   r"   r"   r#   _must_be_kwarg.   s     
r9   c              	   c   s   t  }tjr| }|D ]}|j}tjr0| }tj|||drtj| ||t	|||d}	|	j
|	jf}
|
|vr||
 |j}|d ur| }|d ur|jdkrq|	V  qd S )Nfuzzy)is_fuzzycached_nameZdel_stmt)setr
   Zcase_insensitive_completionlowerr    r   matchr   
Completionlenr.   completeadd	tree_nameZget_definitiontype)inference_statecompletion_namesstackZ	like_namer;   r=   Zcomp_dctr.   stringnewkrE   Z
definitionr"   r"   r#   filter_namesD   s2    
rM   c                    s    dd |D   fdd| D S )Nc                 S   s   h | ]
}|j qS r"   r.   ).0dr"   r"   r#   	<setcomp>a       z%_remove_duplicates.<locals>.<setcomp>c                    s   g | ]}|j  vr|qS r"   rN   rO   cnamesr"   r#   
<listcomp>b   rR   z&_remove_duplicates.<locals>.<listcomp>r"   )completionsZother_completionsr"   rU   r#   _remove_duplicates`   s    rY   c                 C   s   | j j|dd}| |S )zK
    Returns the scope in which the user resides. This includes flows.
    TZinclude_prefixes)	tree_nodeget_leaf_for_positioncreate_context)module_contextpositionleafr"   r"   r#   get_user_contexte   s    ra   c                 C   s,   | j |dd}t|tjtjfs(|j}q|S )NTrZ   )r\   
isinstancer   ZScopeZFlowparent)module_noder_   noder"   r"   r#   get_flow_scope_nodem   s    rf   c                 C   s   g S r(   r"   )contextfunction_nameZdecorator_nodesr"   r"   r#   complete_param_namesu   s    ri   c                   @   sz   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zd ddZd!ddZdd Zdd ZdS )"rA   Fc                 C   sB   || _ || _|j| _|| _t| j||| _|| _|| _	|| _
d S r(   )_inference_state_module_contextr[   _module_node_code_linesr   Zget_on_completion_name
_like_name_original_position_signatures_callback_fuzzy)r!   rG   r^   
code_linesr_   signatures_callbackr;   r"   r"   r#   __init__}   s    zCompletion.__init__c           	      C   s   | j j| jdd}t|| j\}}}t| j| j|p4|| j|d u rDd n|| | jd}|d ur|stt	| j
| j|||| j| j| j| j| j
}|d ur|sd|v r| ||}|S | |\}}tt| j
|| j| j| j|d}t||t|dd d S )	NTrZ   r:   
)r=   c                 S   s    | j d| j d| j  fS )N___)r.   
startswithr?   )xr"   r"   r#   <lambda>   s   

z%Completion.complete.<locals>.<lambda>)key)rl   r\   ro   _extract_string_while_in_stringr   rk   rm   rq   listr   rj   rn   rp   _complete_in_string_complete_pythonrM   rI   rY   sorted)	r!   r`   rJ   
start_leafquoteZprefixed_completionsr=   rH   rX   r"   r"   r#   rC      sB    	
zCompletion.completec              
      s  | j j}d | _}| jd | jd t| j f| _d}zt|| j	|| j | _}W nV tj
y } z<|jj}|dkr|g fW  Y d}~S ||  fW  Y d}~S d}~0 0 t|  d v r| jj| jdd}| }| jd }|j| j  kr|jksn |jd }|dur|}	t|	dd	d
dd}	|	du r>q|	j}
|
dkrn|	jd }t|trn|jd }
|	jd |kr|
dkr ddg7  n,|
dkr g d7  n|
d	kr d qg }d}t fddtjtjfD rpdd |D }t|}|r,|d dv r,|t| j ddfS d|v rrt!|d|v \}}d|v oXd|v  }|| j"|||d7 }n|d dv r|d dkr| j| j}|jdkr| }| #| \}}||7 }n| $ r|| %|7 }n|d dv rN|d d v rN| j&| j }|rN|d j'}t|( }|) }|t*|||7 }t+|||}|sp||  7 }|| j dd7 }|s| j	| jd d  d| jd  }|| j, | p|d d!v o|d"d d#k d$7 }||fS )%a  
        Analyzes the current context of a completion and decides what to
        return.

        Technically this works by generating a parser stack and analysing the
        current stack for possible grammar nodes.

        Possible enhancements:
        - global/nonlocal search global
        - yield from / raise from <- could be only exceptions/generators
        - In args: */**: no completion
        - In params (also lambda): no completion before =
        Nr      .ifTrZ   Zif_stmtZfor_stmtZ
while_stmtZtry_stmt
error_nodeZ_stmtelifelse)exceptfinallyr   Fc                 3   s   | ]}| v V  qd S r(   r"   )rO   tallowed_transitionsr"   r#   	<genexpr>  rR   z.Completion._complete_python.<locals>.<genexpr>c                 S   s   g | ]
}|j qS r"   )nonterminal)rO   
stack_noder"   r"   r#   rW     rR   z/Completion._complete_python.<locals>.<listcomp>)asdefclass)is_functionZimport_stmtZimport_fromimportonly_modules)trailerZdotted_nameZ	endmarker)(,)r   arglist	decoratorz 	.;z...)only_values)-rj   grammarrI   ro   rB   rn   	_positionr   Zget_stack_at_positionrm   ZOnErrorLeaf
error_leafvalue_complete_global_scoper}   Z)_allowed_transition_names_and_token_typesrl   r\   get_previous_leaf	start_posend_posr   rF   childrenrb   r   appendanyr   NAMEINDENT_gather_nodes_complete_inheritedr   _get_importer_names_complete_trailer_is_parameter_completion_complete_paramsrp   Z_call_detailsZiter_used_keyword_argumentsZcount_positional_argumentsr5   r9   _complete_keywords)r!   r`   r   rI   r=   er   previous_leafindentstmttype_firstrH   Zkwargs_onlyZnonterminalsnodeslevelrV   r   dotnr0   Zcall_detailsr2   r1   current_liner"   r   r#   r      s    
"


 
















"zCompletion._complete_pythonc                 C   sL   | j d }|jdkr&t|jdkr&dS |jdv r4dS |jdv oJ|jd dkS )Nr   Zlambdefr   T
parameters)ZtypedargslistZvarargslistr   )rI   r   rB   r   )r!   Ztosr"   r"   r#   r   G  s    

z#Completion._is_parameter_completionc                 C   s   | j d }|jdkr| j d }|jdkrt| j| j}t|dd}|d ur|jdkr|jd }|jdkrp|j}q|jdkr|g}qg }n| }|j	d	 }t
||j|S g S )
Nr   r   funcdefr   r   
decoratorsr   r   )rI   r   ra   rk   r   r   rF   r   Zget_decoratorsr   ri   r   )r!   r`   r   rg   re   r   r   rh   r"   r"   r#   r   T  s$    








zCompletion._complete_paramsc                 c   s<   |D ]2}t |tr| r|r&|dv rt| j|V  qd S )N)TrueFalseNone)rb   strisalphar   ZKeywordNamerj   )r!   r   r   rL   r"   r"   r#   r   k  s    zCompletion._complete_keywordsc                 C   sT   t | j| j}td| t| j| j}t|| j|}g }|D ]}|| 7 }q>|S )Nzglobal completion scope: %s)	ra   rk   r   r	   dbgrf   rl   r   values)r!   rg   Zflow_scope_nodefiltersrH   filterr"   r"   r#   r   q  s    z!Completion._complete_global_scopec                 C   sv   | j |}t||}tjd|dd d }t|dkrh|\}| rht|jdkrh|jd }|dv rh|}|| |fS )Nztrailer completion values: %sZMAGENTA)colorr   r   )numpyZ
tensorflowZ
matplotlibZpandas)	rk   r]   r   r	   r   rB   Z	is_moduleZstring_names_complete_trailer_for_values)r!   r   Zinferred_contextr   r=   vmodule_namer"   r"   r#   r     s    

zCompletion._complete_trailerc                 C   s   t | j| j}t||S r(   )ra   rk   r   complete_trailer)r!   r   user_contextr"   r"   r#   r     s    z'Completion._complete_trailer_for_valuesr   Tc                 C   s2   dd |D }t | j|| j|}|j| j|dS )Nc                 S   s   g | ]
}|j qS r"   )r   rO   r   r"   r"   r#   rW     rR   z2Completion._get_importer_names.<locals>.<listcomp>r   )r   ZImporterrj   rk   rH   )r!   rV   r   r   r3   r"   r"   r#   r     s    zCompletion._get_importer_namesc                 c   s   | j j| jdd}t|d}|du r*dS | j|}|jd |jd krNdS |jdd}t	| |D ]&}|
 D ]}|jdk|krr|V  qrqfdS )zP
        Autocomplete inherited methods when overriding in child class.
        TrZ   ZclassdefNr   )Zis_instancefunction)rl   r\   r   r   r   rk   Zcreate_valuer   get_filtersnextr   api_type)r!   r   r`   clsZclass_valuer   r   r.   r"   r"   r#   r     s    zCompletion._complete_inheritedc                    sz    fdd}t |}t|dd t| }|d durPdd |D }| |S td	 d }|rv| |d
gS g S )aU  
        To make it possible for people to have completions in doctests or
        generally in "Python" code in docstrings, we use the following
        heuristic:

        - Having an indented block of code
        - Having some doctest code that starts with `>>>`
        - Having backticks that doesn't have whitespace inside it
        c                 3   sR   d} D ]D}|s$| ds$| dr6tdd|V  nd V  ttd|}qd S )NFz>>> z^( *>>> ?| +) z *>>>)rx   resubboolr@   )linesZinclude_next_linelrr   r"   r#   iter_relevant_lines  s    z;Completion._complete_in_string.<locals>.iter_relevant_linesT)keependsr   Nc                 S   s   g | ]}|d u rdn|qS )Nru   r"   rS   r"   r"   r#   rW     rR   z2Completion._complete_in_string.<locals>.<listcomp>z
`([^`\s]+)r   )r   r   r}   _complete_code_linesr   searchgroup)r!   r   rJ   r   Zrelevant_code_linesr@   r"   r   r#   r~     s    


zCompletion._complete_in_stringc                 C   sN   | j jd|}t| j| j ||d}t| j | ||jdd | j	d
 S )Nr   )Zin_module_contextrG   rd   rr   c                  _   s   g S r(   r"   )argskwargsr"   r"   r#   rz     rR   z1Completion._complete_code_lines.<locals>.<lambda>)rr   r_   rs   r;   )rj   r   parsejoinr   rk   rA   
as_contextr   rq   rC   )r!   rr   rd   Zmodule_valuer"   r"   r#   r     s    zCompletion._complete_code_linesN)F)r   T)T)r%   r&   r'   rt   rC   r   r   r   r   r   r   r   r   r   r~   r   r"   r"   r"   r#   rA   |   s    
+ 

 rA   c                 C   s.   g }| D ] }|j jdkrg }q||j7 }q|S )NZ
small_stmt)ZdfaZ	from_ruler   )rI   r   r   r"   r"   r#   r     s    r   z^\w*(\'{3}|"{3}|\'|")c                    s   fdd} | j k rdS | jdkr,|| S g }| d ur| jdkrd| jv sXd| jv rt| jdkrn|| S d }| js|  }|d u s|jd	kstd
d |j D sd }d fdd|D |p| |d u rdn|jt	|   fS | j
 d krq|d|  |  } q0dS )Nc                    s   i }| j  d kr$ d | j |d< tj| jfi |}|s@dS |d}| j  d krr d | j|  k rrdS t|  | d  | |fS )Nr   r   endposNNN)linecolumn_string_startr@   r   r   endr   )r`   r   r@   startr_   r"   r#   return_part_of_leaf  s    
$z<_extract_string_while_in_string.<locals>.return_part_of_leafr   rJ   r   "'r   r.   c                 s   s   | ]}|d v V  qdS )ZrubfNr"   rS   r"   r"   r#   r     rR   z2_extract_string_while_in_string.<locals>.<genexpr>r   c                 3   s   | ]}t | V  qd S r(   r   )rO   r   r   r"   r#   r     rR   r   )r   rF   r   rB   prefixr   allr?   r   r   r   insert)r`   r_   r   leavesZprefix_leafr"   r   r#   r|     s8    



r|   c                 C   s   g }|D ]D}|j | jdD ]}|| 7 }q| st|tr|t| |7 }qt|}|D ],}||vrZ|j | jdD ]}|| 7 }qtqZ|S )N)Zorigin_scope)r   r[   r   Zis_stubrb   r   _complete_getattrr   )r   r   rH   r   r   Zpython_valuesrT   r"   r"   r#   r   "  s    r   c                 C   s8  | dp| d}tdd |D }|D ]}|j}|du s,|jdkrLq,| D ]}|jdkrdqT|jd }|jd	krzqT|jd
 }|jd }	t|jdksT|jdksT|jdkrqT|	jd }
|
jdksTt|
jdk rqT|	 }|
jd
 }|
jd }|
||j}tdd |D sqT||}t| |    S q,g S )aV  
    A heuristic to make completion for proxy objects work. This is not
    intended to work in all cases. It works exactly in this case:

        def __getattr__(self, name):
            ...
            return getattr(any_object, name)

    It is important that the return contains getattr directly, otherwise it
    won't work anymore. It's really just a stupid heuristic. It will not
    work if you write e.g. `return (getatr(o, name))`, because of the
    additional parentheses. It will also not work if you move the getattr
    to some other place that is not the return statement itself.

    It is intentional that it doesn't work in all cases. Generally it's
    really hard to do even this case (as you can see below). Most people
    will write it like this anyway and the other ones, well they are just
    out of luck I guess :) ~dave.
    __getattr____getattribute__c                 s   s   | ]}|  V  qd S r(   )infer)rO   r.   r"   r"   r#   r   I  s   z$_complete_getattr.<locals>.<genexpr>Nr   return_stmtr   	atom_exprr      r.   getattrr      c                 s   s   | ]}|j d kV  qdS )paramN)r   r   r"   r"   r#   r   h  rR   )Zget_function_slot_namesr   Z	from_setsr[   rF   Ziter_return_stmtsr   rB   r   r   Zgotor   r   Z
infer_noder   )r   instancerV   Z	functionsfuncr[   r   r   Zatomr   r   rg   Zobject_node	name_node	name_listobjectsr"   r"   r#   r   3  sD    











r   Fc	              	   c   s0  |d d D ]b}	g }
|D ]:}|	|j kr|jd ur@|jdv r@|r@q|
t|| 7 }
qtd|
|d d  |
}q|d  }|D ]}|j  }|rtj	|||ds|s||krt
|trdd | D }n|g}|rt|}|D ]F}|rtj| |d t||d}nt| |}|r"||jkr|V  qqd S )	Nr   )module	namespacezdot lookup on search %s from %s
   r:   c                 S   s   g | ]
}|j qS r"   rN   )rO   r   r"   r"   r#   rW     rR   z$search_in_module.<locals>.<listcomp>)rI   Zlike_name_lengthr<   )r    rE   r   r   r   r	   r   r?   r   r@   rb   r   r   r   rA   rB   NamerF   )rG   r^   rV   Zwanted_namesZwanted_typerC   r;   Zignore_importsconvertsZ	new_namesr   	last_namerJ   Zn2Zdef_r"   r"   r#   search_in_modules  sL    


r  )FFFF)Ar   textwrapr   inspectr   Zparso.python.tokenr   Zparso.pythonr   Z
parso.treer   r   Zparsor   Zjedir	   r
   Zjedi.apir   r   r   Zjedi.api.stringsr   Zjedi.api.file_namer   Zjedi.inferencer   Zjedi.inference.base_valuer   Zjedi.inference.helpersr   r   Zjedi.inference.contextr   Zjedi.inference.valuer   Zjedi.inference.docstring_utilsr   Zjedi.inference.namesr   r   Z!jedi.inference.gradual.conversionr   r   Zjedi.parser_utilsr   Zjedi.pluginsr   r   r5   r9   rM   rY   ra   rf   Zdecorateri   rA   r   compiler   r|   r   r   r  r"   r"   r"   r#   <module>   sV   
  k

0A  