
    8@dr                      F   d dl Z d dlmZmZmZmZmZmZ 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 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  e j        e          Z dZ!de!z  Z"dZ#edee$ee$ee$ef         f         f         fd            Z%dej&        dej'        de(fdZ)dedej&        dej'        de(fdZ*dej'        dej&        de(fdZ+dej'        dej&        de(fdZ,dedej'        fdZ-dee         de$de$ded edeee$ef         ddf         fd!Z.d"e
dee$         fd#Z/ed$ed%ed efd&            Z0d'e$de$fd(Z1d)e2d*e$d+e$de2fd,Z3d-e2de$fd.Z4d4d$ed%ed/eee                  fd0Z5ed$ed%efd1            Z6ed$ed%efd2            Z7ed$ed%ed efd3            Z8dS )5    N)AnyDict	GeneratorListOptionalSet)Script)tree)
NodeOrLeaf)Resource)SearchResult)
AutoImport)hookimpl)Config)Document	Workspace   )PylspTaskHandle   
   i  returnc                      dddddiiS )Npluginsrope_autoimportF)enabledmemory r       =lib/python3.11/site-packages/pylsp/plugins/rope_autoimport.pypylsp_settingsr       s     )u+N+NOPPr   expr	word_nodec                    |sdS t          | j                  dk    rdS | j        d         }t          |t          j                  rd|j        v rdS ||k    rdS t          | j                  dk    r t          d | j        D                       rdS t          |t          j        t          j        f          rt          ||          S t          || |          S )z
    Check if we should insert the word_node on the given expr.

    Works for both correct and incorrect code. This is because the
    user is often working on the code as they write it.
    Fr   T#r   c              3   T   K   | ]#}|j         d k    r	d|j        v p
|j         dk    V  $dS )operator.trailerN)typevalue).0nodes     r   	<genexpr>z!_should_insert.<locals>.<genexpr>3   sU       
 
 I#9tz(9STY)=S
 
 
 
 
 
r   )lenchildren
isinstancer
   	EndMarkerprefixanyPythonErrorNode
PythonNode_should_insert_handle_first_child)r!   r"   first_childs      r   r6   r6   !   s      u
4=Qt-"K+t~.. +$$$5it
4=A 
 

 
 
 
 
 	 5+ 4doFGG 6 k9555{D)<<<r   r8   c                 @   t          | t          j                  rdS t          | t          j        t          j        f          r| j        dv rdS t          | t          j                  r6| j        dk    rt          ||          S | j        dk    rt          ||          S dS )z<Check if we suggest imports given the following first child.F)importfromdefclassT)	r0   r
   Import
PythonLeafPythonErrorLeafr*   Keyword_should_import_function_should_import_class)r8   r!   r"   s      r   r7   r7   ?   s    +t{++ u+1EFGG  2225+t|,, 9%%*9d;;;'''	48884r   c                     d }|j         D ]L}t          |t          j                  r.t          |t          j                  r|| k    r|j        dk    r dS |}MdS )N(TF)r/   r0   r
   NameOperatorr*   r"   r!   	prev_noder,   s       r   rC   rC   O   sj    I  dDI&& 	 )T]33  9$$C)?)?44		5r   c                     d }|j         D ]E}t          ||           r dS t          |t          j                  r|j        dk    r	|| k    r dS |}FdS )NTz->F)r/   _handle_argumentr0   r
   rG   r*   rH   s       r   rB   rB   [   sp    I  D),, 	44i// 	 $&&9$$44		5r   r,   c                     t          | t          j                  rF| j        dk    r| j        d         |k    rdS | j        dk    r| j        D ]}t          ||          r dS dS )Ntfpdef   T
parametersF)r0   r
   r5   r)   r/   rK   )r,   r"   	parameters      r   rK   rK   h   s{    $((  9  }Q9,,t9$$!]    	#Iy99  44 5r   suggestionsdoc_uriword
autoimportdocumentc              #   D  K   | D ]}|                     |j                  dz
  }|dd}||d}||j        dz   d}	t          |j        |j        |j        |          }
|
t
          k    rc|j        |j        t          |
          d|it          |j                  |	gdV  d S )	Nr   r   )line	character)startend
)rangenewTextrR   )labelkindsortTextdatadetailadditionalTextEdits)	find_insertion_linesourceimport_statement
_get_scorename
_score_maxitemkind_sort_import	_document)rQ   rR   rS   rT   rU   
suggestioninsert_linerY   
edit_rangeeditscores              r   _process_statementsrr   t   s       " 
 

 44X_EEI$155$U33
#
0Kd0RSS:,j.I:?\`aa:  _'$U++(
 ;<<$(6
 
 	
 	
 	
 	

 
r   scriptc                     |                      d          }t                              |           t          d |D                       S )z.Get all names to ignore from the current file.T)definitionsc              3   $   K   | ]}|j         V  d S N)rh   )r+   rh   s     r   r-   zget_names.<locals>.<genexpr>   s$      //Tty//////r   )	get_nameslogdebugset)rs   	raw_namess     r   rx   rx      sG      T 22IIIi//Y//////r   config	workspacec                    |j         |d                  }t          j        |          }|                    d|d         f          }t	          ||          sg S |j        }t                              d|            |                     |j	                  
                    di           }t          |                    d                    }	|                    |          }
t          |
                    ||		                    }t          t!          t#          ||j        ||
|          d
                     }t'          |          t(          k    r|dt(                   }|S )zGet autoimport suggestions.rW   r   rX   z autoimport: searching for word: )document_pathropeT)use_document_path)ignored_namesc                     | d         S )Nr`   r   )	statements    r   <lambda>z#pylsp_completions.<locals>.<lambda>   s    )J"7 r   )keyN)linesparsoparseget_leaf_for_positionr6   r*   ry   rz   settingspathgetrx   jedi_script_rope_autoimportlistsearch_fullsortedrr   urir.   MAX_RESULTS)r}   r~   rU   positionrW   r!   r"   rS   rope_configr   rT   rQ   resultss                r   pylsp_completionsr      sR    >(6*+D;tD**Ax/D+EFFI$	** 	?DII777888///>>BB62NNK'(<(<t(<(T(TUUM++K88Jz--d--PPQQKX\4XVV77	
 	
 	
 G 7||k!!,;,'Nr   rf   c                     d| z   S )Nz# Auto-Import
r   )rf   s    r   rl   rl      s     #333r   re   full_statementsuggested_namec                     t          d          }t          |          |z
  }t          |          t          |          z
  dz  }d| z  }||z   |z   S )Nr:   rN      )r.   )re   r   r   desired_nameimport_lengthfull_statement_scoresuggested_name_scoresource_scores           r   rg   rg      sZ    MMM~..> 003|3D3DD!K;L"66EEr   rq   c                     t          t          | t          dz
            d          } dt          |                               t
          d          z   S )Nr   r   z[z0)maxminri   strrjust
_score_pow)rq   s    r   rk   rk      sC    EJ!+,,a00E #e**"":s3333r   filesc                 r   |                      d                              dd          }|                                                     di           |                    |          }t	          |          }|d nfd|D             }|                    ||           |                    |           d S )Nr   r   Fr   c                 :    g | ]}|                               S r   )_rope_resource)r+   rU   r   s     r   
<listcomp>z!_reload_cache.<locals>.<listcomp>   s'    #_#_#_XH$;$;K$H$H#_#_#_r   )task_handle	resources)r   )plugin_settingsr   r   r   r   generate_cachegenerate_modules_cache)r}   r~   r   r   rT   r   r   r   s          @r   _reload_cacher      s    ))*;<<@@5QQF//##''33K++K@@J!),,K#_#_#_#_Y^#_#_#_  +KKK%%+%>>>>>r   c                 &    t          | |           dS zPInitialize AutoImport.

    Generates the cache for local and global items.
    Nr   r}   r~   s     r   pylsp_initializer           &)$$$$$r   c                 &    t          | |           dS r   r   r   s     r   pylsp_document_did_openr      r   r   c                 *    t          | ||g           dS )z/Update the names associated with this document.Nr   )r}   r~   rU   s      r   pylsp_document_did_saver      s     &)hZ00000r   rw   )9loggingtypingr   r   r   r   r   r   r   jedir	   parso.pythonr
   
parso.treer   rope.base.resourcesr   rope.contrib.autoimport.defsr   rope.contrib.autoimport.sqliter   pylspr   pylsp.config.configr   pylsp.workspacer   r   _rope_task_handler   	getLogger__name__ry   r   ri   r   r   r    BaseNodeLeafboolr6   r7   rC   rB   rK   rr   rx   r   rl   intrg   rk   r   r   r   r   r   r   r   <module>r      sa    < < < < < < < < < < < < < < < <              ! ! ! ! ! ! ( ( ( ( ( ( 5 5 5 5 5 5 5 5 5 5 5 5       & & & & & & / / / / / / / / . . . . . .g!!
^
 
QS$sDcN':";;< Q Q Q 
Q
= =49 = = = = =<Z t} QUQZ _c     	DI 	T] 	t 	 	 	 	
ty 
 
$ 
 
 
 
	: 	$) 	 	 	 	
l#

 
 	

 
 tCH~tT)*
 
 
 
40f 0S 0 0 0 0 
f  h    
04 4 4 4 4 4Fs FC F FWZ F F F F4 4 4 4 4 4	? 	?& 	?Y 	?xX?W 	? 	? 	? 	? 
%V %	 % % % 
% 
%F %y % % % 
% 
1F 1y 1H 1 1 1 
1 1 1r   