
    8@d;                        d dl Z d dlZd dlmZ d dlZd dlZd dlZd dlZd dlm	Z	m
Z
mZ d dlmZ d dlZddlmZmZmZ  ej        e          ZdgZ ej        d          Z ej        d	          Zd
 Z G d d          Z G d d          ZdS )    N)contextmanager)Optional	GeneratorCallable)RLock   )lspuris_utilsnumpyz[A-Za-z_0-9]*$z^[A-Za-z_0-9]*c                 F     t          j                    fd            }|S )z&Define an atomic region over a method.c                 ^    | j         5   | g|R i |cd d d            S # 1 swxY w Y   d S N)_lock)selfargskwargsmethods      /lib/python3.11/site-packages/pylsp/workspace.pywrapperzlock.<locals>.wrapper   s    Z 	1 	16$000000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   "&&)	functoolswraps)r   r   s   ` r   lockr      s8    _V1 1 1 1 1 N    c                      e Zd ZdZdZdZdZdZd&dZd'd	e	d
e
fdZd Zed             Zed             Zed             Zd Zd Zd Zd&dZd Zd&dZd Zd Zd Ze	 	 d(dede	e         de	e         deeee	e         gdf         ddf         fd            Z	 	 d(dede	e         de	e         defdZ 	 	 d(dede	e         de	e         ddfd Z!d&dede	e         ddfd!Z"e#j$        j%        fd"Z&d# Z'd(d$Z(d% Z)dS ))	WorkspaceztextDocument/publishDiagnosticsz
$/progresszwindow/workDoneProgress/createzworkspace/applyEditzwindow/showMessageNc                     || _         || _        || _        t          j        | j                  d         | _        t          j        | j                  | _        i | _        i | _	        d | _
        d | _        d | _        d S )Nr   )_config	_root_uri	_endpointr
   urlparse_root_uri_scheme
to_fs_path
_root_path_docs_environments_Workspace__rope_Workspace__rope_config_Workspace__rope_autoimport)r   root_uriendpointconfigs       r   __init__zWorkspace.__init__,   ss    !! $dn = =a @/$.99
   !!%r   Frope_configmemoryc                 x    ddl m} | j        '|                     |          } |||          | _        | j        S )Nr   )
AutoImport)r/   )rope.contrib.autoimport.sqliter1   r)   _rope_project_builder)r   r.   r/   r1   projects        r   _rope_autoimportzWorkspace._rope_autoimport<   sP    ======!)00==G%/Z%G%G%GD"%%r   c                    ddl m} | j        | j        |k    r|                    d          }|r || j        |          | _        n || j                  | _        | j        j                            d|                    dg                      | j        j                            dd           | j        j                            d	d           | j                                         | j        S )
Nr   )Project
ropeFolder)
ropefolderextension_modulesextensionModulesignore_syntax_errorsTignore_bad_imports)	rope.base.projectr7   r'   r(   getr$   prefssetvalidate)r   r.   r7   rope_folders       r   r3   zWorkspace._rope_project_builderD   s    ------ ;$"4"C"C%//,77K 7%gdo+NNN%gdo66K!!"5"-//2Db"I"IK K KK!!"8$???K!!"6==={r   c                     | j         S r   )r%   r   s    r   	documentszWorkspace.documentsV   s
    zr   c                     | j         S r   )r$   rE   s    r   	root_pathzWorkspace.root_pathZ   s
    r   c                     | j         S r   )r   rE   s    r   r*   zWorkspace.root_uri^   s
    ~r   c                 \    | j         dv o#t          j                            | j                  S )N) file)r"   ospathexistsr$   rE   s    r   is_localzWorkspace.is_localb   s%    %5Z27>>$/;Z;ZZr   c                 `    | j                             |          p|                     |          S )zReturn a managed document if-present, else create one pointing at disk.

        See https://github.com/Microsoft/language-server-protocol/issues/177
        )r%   r?   _create_documentr   doc_uris     r   get_documentzWorkspace.get_documente   s+    
 z~~g&&H$*?*?*H*HHr   c                 6    | j                             |          S r   )r%   r?   rS   s     r   get_maybe_documentzWorkspace.get_maybe_documentl   s    z~~g&&&r   c                 F    |                      |||          | j        |<   d S )N)sourceversion)rR   r%   )r   rT   rY   rZ   s       r   put_documentzWorkspace.put_documento   s*    "33GFT[3\\
7r   c                 :    | j                             |           d S r   )r%   poprS   s     r   rm_documentzWorkspace.rm_documentr   s    
wr   c                 j    | j         |                             |           || j         |         _        d S r   )r%   apply_changerZ   )r   rT   changerZ   s       r   update_documentzWorkspace.update_documentu   s2    
7((000&-
7###r   c                     | j                             |pi                     di                      | j        D ]*}|                     |                              |           +d S Npylsp)r   updater?   rF   rU   update_config)r   settingsrT   s      r   rg   zWorkspace.update_configy   sl    X^00"==>>>~ 	? 	?Gg&&44X>>>>	? 	?r   c                 F    | j                             | j        d|i          S )Nedit)r    requestM_APPLY_EDIT)r   rj   s     r   
apply_editzWorkspace.apply_edit~   s!    ~%%d&7&$HHHr   c                 N    | j                             | j        ||d           d S )N)uridiagnosticsparams)r    notifyM_PUBLISH_DIAGNOSTICS)r   rT   rp   s      r   publish_diagnosticszWorkspace.publish_diagnostics   s/    d8alAmAmnnnnnr   titlemessage
percentagereturnc              #      K    j         r5 j         j                            di                               dd          }nd}|r	                      |||          ddt          dt
          t                   dd f fd}	 |V                                  n#                                 w xY wd S # t          $ r t          
                    dd	
           Y nw xY wddt          dt
          t                   dd fd}|V  d S )NwindowworkDoneProgressFrw   rx   ry   c                 6                         | |           d S r   )_progress_report)rw   rx   r   tokens     r   progress_messagez3Workspace.report_progress.<locals>.progress_message   s!    ))%*EEEEEr   zThere was an error while trying to initialize progress reporting.Likely progress reporting was used in a synchronous LSP handler, which is not supported by progress reporting yet.T)exc_infoc                     d S r    )rw   rx   s     r   dummy_progress_messagez9Workspace.report_progress.<locals>.dummy_progress_message   s    Dr   r   )r   capabilitiesr?   _progress_beginstrr   int_progress_end	Exceptionlogwarning)r   rv   rw   rx   "client_supports_progress_reportingr   r   r   s   `      @r   report_progresszWorkspace.report_progress   s      < 	7)--h;;??@RTYZZ /. 27.- 	,,UGZHHF Fc Fx} FX\ F F F F F F F.****&&u----D&&u----#    H "	      ,	 	C 	Xc] 	VZ 	 	 	 	 %$$$$$s   B7 B B27&C C c                     t          t          j                              }| j                            | j        d|i                              d           d|d}|||d<   |||d<   | j                            | j        ||d	           |S )
Nr   g      ?)timeoutbegin)kindrv   rw   rx   r   valuerq   )	r   uuiduuid4r    rk   M_INITIALIZE_PROGRESSresultrs   
M_PROGRESS)r   rv   rw   rx   r   r   s         r   r   zWorkspace._progress_begin   s     DJLL!!t9GU;KLLSS\_S``` 
 
 &E)!",E,O  	 	
 	
 	
 r   r   c                 r    ddi}|r||d<   |r||d<   | j                             | j        ||d           d S )Nr   reportrw   rx   r   rq   r    rs   r   )r   r   rw   rx   r   s        r   r~   zWorkspace._progress_report   st     H
  	'&E) 	-",E,O  	 	
 	
 	
 	
 	
r   c                 d    ddi}|r||d<   | j                             | j        ||d           d S )Nr   endrw   r   rq   r   )r   r   rw   r   s       r   r   zWorkspace._progress_end   s`    E
  	'&E)O  	 	
 	
 	
 	
 	
r   c                 N    | j                             | j        ||d           d S )N)typerw   rq   )r    rs   M_SHOW_MESSAGE)r   rw   msg_types      r   show_messagezWorkspace.show_message   s/    d18X_:`:`aaaaar   c                     t          j        | j        |ddg          pg }t          d |D                       p| j        gS )z/Return the source roots for the given document.zsetup.pyzpyproject.tomlc                 L    h | ]!}t           j                            |          "S r   )rM   rN   dirname).0project_files     r   	<setcomp>z)Workspace.source_roots.<locals>.<setcomp>   s&    MMM|RW__\22MMMr   )r   find_parentsr$   list)r   document_pathfiless      r   source_rootszWorkspace.source_roots   sM    #DO]ZQaDbccigiMMuMMMNNcSWSbRccr   c           	          t          j        |          }t          || |||                     |          | j                  S )N)rY   rZ   extra_sys_pathrope_project_builder)r
   r#   Documentr   r3   )r   rT   rY   rZ   rN   s        r   rR   zWorkspace._create_document   sK    w'',,T22!%!;
 
 
 	
r   c                 J    | j         | j                                          d S d S r   )r)   closerE   s    r   r   zWorkspace.close  s.    !-"((***** .-r   r   )FNN)*__name__
__module____qualname__rt   r   r   rl   r   r-   r   boolr5   r3   propertyrF   rH   r*   rP   rU   rW   r[   r^   rb   rg   rm   ru   r   r   r   r   r   r   r   r~   r   r	   MessageTypeInfor   r   rR   r   r   r   r   r   r   $   s       =J<(L)N& & & & & &H &d & & & &  $   X   X   X[ [ [I I I' ' '] ] ] ]     . . . .? ? ?
I I Io o o  "&$(	*% *%*% #*% SM	*%
 
8S(3-0$67tC	D*% *% *% ^*%^ "&$(	  # SM	
 
   > "&$(	
 

 #
 SM	

 

 
 
 
,
 
3 
# 
$ 
 
 
 
 .1_-A b b b bd d d
	
 	
 	
 	
+ + + + +r   r   c                       e Zd Z	 	 ddZd Zd Zeed                         Zeed                         Z	d Z
ed	             Zd
 Zd Zedd            Zedd            ZddZddZdS )r   NTc                 x   || _         || _        t          j        |          | _        t          j        | j                  | _        t          j        	                    | j                  | _
        i | _        |j        | _        || _        || _        || _        |pg | _        || _        t%                      | _        d S r   )ro   rZ   r
   r#   rN   r   path_to_dot_namedot_pathrM   basenamefilenameshared_datar   
_workspace_local_source_extra_sys_pathr3   r   r   )r   ro   	workspacerY   rZ   localr   r   s           r   r-   zDocument.__init__  s    OC((	/	::((33 (#-3%9"WW


r   c                 *    t          | j                  S r   )r   ro   rE   s    r   __str__zDocument.__str__  s    48}}r   c                 j    ddl m} |                    |                     |          | j                  S )Nr   )libutils)	rope.baser   path_to_resourcer3   rN   )r   r.   r   s      r   _rope_resourcezDocument._rope_resource   s<    &&&&&&(()C)CK)P)PRVR[\\\r   c                 6    | j                             d          S )NT)rY   
splitlinesrE   s    r   lineszDocument.lines%  s     {%%d+++r   c                     | j         Ht          j        | j        dd          5 }|                                cd d d            S # 1 swxY w Y   | j         S )Nrzutf-8)encoding)r   ioopenrN   read)r   fs     r   rY   zDocument.source*  s     <C':::  avvxx                               |s   AA	A	c                 f    | j                             |pi                     di                      d S rd   )r   rf   r?   )r   rh   s     r   rg   zDocument.update_config2  s2    X^00"==>>>>>r   c                    |d         }|                     d          }|s	|| _        dS |d         d         }|d         d         }|d         d         }|d         d         }|t          | j                  k    r| j        |z   | _        dS t          j                    }t          | j                  D ]\  }	}
|	|k     r|                    |
           !|	|k    r|                    |
           =|	|k    r2|                    |
d|                    |                    |           |	|k    r|                    |
|d                    |	                                | _        dS )zApply a change to the document.textrangeNstartline	characterr   )
r?   r   lenr   rY   r   StringIO	enumeratewritegetvalue)r   ra   r   change_range
start_line	start_colend_lineend_colnewir   s              r   r`   zDocument.apply_change5  s`    f~zz'** 	DLF!'*62
 )+6	&v.u%k2 TZ((;-DLFkmm
 !,, 	* 	*GAt:~~		$8||		$J		$z	z*+++		$H}}		$wxx.)))||~~r   c           	      ~    |d         t          d                    | j        d|d                                      z   S )z8Return the byte-offset pointed at by the given position.r   rK   Nr   )r   joinr   )r   positions     r   offset_at_positionzDocument.offset_at_positiona  s8    $s2774:>Ox?O>O3P+Q+Q'R'RRRr   c                 *   |d         t          | j                  k    rdS | j        |d                  }|d         }|d|         }||d         }t                              |          }t                              |          }|d         |d         z   S )zDGet the word under the cursor returning the start and end positions.r   rK   r   Nr   )r   r   RE_START_WORDfindallRE_END_WORD)r   r   r   r   r   r   m_startm_ends           r   word_at_positionzDocument.word_at_positione  s    Fs4:..2z(6*+[!RaR122h  ''..##C((qzE"I%%r   Fc                 Z    |                                  }|                    |||          S )N)
all_scopesdefinitions
references)jedi_script	get_names)r   r   r   r   scripts        r   
jedi_nameszDocument.jedi_namesw  s7    !!##:;+5   7 7 	7r   c                 P   g }d }d }| j         r| j                             d| j                  }|                    dt                    t
          j        _        |                    d          }|                    d          pg }|                    d          }|t          j	        
                                }|                    dd            |r|                     ||          nd }|                     ||          |z   }| j        j        }	|rE|t          j                            t          j                            | j                            gz  }| j        | j        |t          j        |	|	          d
}
|r|
t)          j        | |          z  }
t          j        di |
S )Njedi)r   auto_import_modulesenvironmentextra_pathsenv_vars
PYTHONPATH)r  )rN   sys_path)coderN   r  r4   r   )r   plugin_settingsrN   r?   DEFAULT_AUTO_IMPORT_MODULESr  rh   r  rM   environcopyr]   get_enviromentr	  r   rH   normpathr   rY   r7   r   position_to_jedi_linecolumnScript)r   r   use_document_pathr  environment_pathr  jedi_settingsr  r	  project_pathr   s              r   r   zDocument.jedi_script}  s   < 	5 L88ty8YYM0=0A0ABWB]1_ 1_DM-,00??'++M::@bK$((44H z((H\4(((Rbld))*:X)NNNhl==!1H=EES0  	G))"'//$)*D*DEEFFH KI&|III	
 
  	If8xHHHF{$$V$$$r   c                     |$t           j        j                                        }nW|| j        j        v r| j        j        |         }n6t           j        j                            |d|          }|| j        j        |<   |S )NF)rN   safer  )r  apir  get_cached_default_environmentr   r&   create_environment)r   r  r  r  s       r   r  zDocument.get_enviroment  s    #(.MMOOKK4?#@@@"o;<LM"h2EEK[KPOW F Y Y CN-.>?r   c                     t          | j                  }|                     ||          }|                    |                                           |S )N)r  r  )r   r   r  extendget_sys_path)r   r  r  rN   r  s        r   r	  zDocument.sys_path  sQ     D())));KV^)__K,,..///r   )NNTNN)FTF)NFr   )r   r   r   r-   r   r   r   r   r   rY   rg   r`   r   r   r  r   r  r	  r   r   r   r   r   
  sN       ]a&*   "  ] ] ]
 	, , 
T X, 	  
T X? ? ? 
)& )& 
T)&VS S S& & &$ 
7 7 7 
T7
 
&% &% &% 
T&%P        r   r   )r   logging
contextlibr   rM   rer   r   typingr   r   r   	threadingr   r  rK   r	   r
   r   	getLoggerr   r   r  compiler   r   r   r   r   r   r   r   <module>r&     se   
			  % % % % % % 				 				      0 0 0 0 0 0 0 0 0 0                 g!!&i  
+,,bj)**  c+ c+ c+ c+ c+ c+ c+ c+Lq q q q q q q q q qr   