
    e                    P   U d dl mZ d dlZd dlmZ d dlmZmZ d dl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mZ 	 d dlZ	 d dlmZ e	rd dlmZ daded<   	 d	 	 	 	 	 ddZ	 	 	 	 ddZ 	 	 	 	 	 	 ddZ!	 d	 	 	 	 	 	 	 	 	 ddZ"y# e$ r dZY Lw xY w# e$ r dZY Rw xY w)    )annotationsN)defaultdict)IterableSequence)TYPE_CHECKINGAny)	reporters)_augment_sys_path)Message)FileItem)LinterStatsmerge_stats)ProcessPoolExecutor)PyLinterzPyLinter | None_worker_linterc                B   t        j                  |       at        sJ t        j                  t	        j
                                t        j                          t        j                  t        j                  d       t        j                          |rt        |       yy)zFunction called to initialize a worker for a Process within a concurrent Pool.

    :param linter: A linter-class (PyLinter) instance pickled with dill
    :param extra_packages_paths: Extra entries to be added to `sys.path`
    T)forceN)dillloadsr   set_reporterr	   CollectingReporteropenload_plugin_modules_dynamic_pluginsload_plugin_configurationr
   )linterextra_packages_pathss     6/usr/lib/python3/dist-packages/pylint/lint/parallel.py_worker_initializer   &   sw     ZZ'N> 	 < < >? &&~'F'Fd&S,,../     c                   t         st        d      t         j                          t         j                  |        t	        t
              }t         j                         D ]3  }|j                         }|||j                     j                  |       5 t         j                  j                  }t        t         j                  t        j                        sJ t         j                  j                          t!        t#        j$                               t         j&                  | j(                  t         j*                  j,                  |t         j.                  t         j0                  |fS )Nz!Worker linter not yet initialised)r   RuntimeErrorr   check_single_file_itemr   listget_checkersget_map_datanameappendreportermessages
isinstancer	   r   resetidmultiprocessingcurrent_processcurrent_namefilepath
file_state	base_namestats
msg_status)	file_itemmapreduce_datacheckerdatamsgss        r   _worker_check_single_filer;   @   s    >??)))4 &N!..0 6##%7<<(//56 ""++Dn--y/K/KLLL!!#
?**,-##!!++!!	 	r    c                <   t        t              }|j                         D ]5  }|D ].  }|j                         D ]  \  }}||   j	                  |        0 7 | j                         }|D ]0  }|j                  |v s|j                  | ||j                            2 y)zJMerges map/reduce data across workers, invoking relevant APIs on checkers.N)r   r$   valuesitemsextendr%   r'   reduce_map_data)	r   all_mapreduce_datacollated_map_reduce_datalinter_datarun_datachecker_namer9   original_checkersr8   s	            r   _merge_mapreduce_datarG   d   s     =H<M)002 D# 	DH&.nn&6 D"d(6==dCD	DD ++-$ T<<33 ##F,DW\\,RS	Tr    c           
        t        j                  t        |      }t        ||t	        j
                  |       f      5 }| j                          g }t        t              }|j                  t        |      D ]  \  }}	}
}}}}}|| j                  _        d| j                  _        | j                  |	|
       |D ]  }| j                  j!                  |        |j#                  |       ||   j#                  |       | xj$                  |z  c_         	 ddd       t'        |        t)        | j*                  g      | _        y# 1 sw Y   3xY w)a  Use the given linter to lint the files with given amount of workers (jobs).

    This splits the work filestream-by-filestream. If you need to do work across
    multiple files, as in the similarity-checker, then implement the map/reduce functionality.
    )r   )max_workersinitializerinitargsFN)	functoolspartialr   r   r   dumpsr   r   r$   mapr;   r2   r3   _is_base_filestateset_current_moduler)   handle_messager(   r5   rG   r   r4   )r   jobsfilesr   rJ   executor	all_statsrA   
worker_idxmodule	file_pathr3   r*   r4   r5   r7   msgs                    r   check_parallelr[   |   sI    ##1EK 
kTZZ=O<Q
 ,		  	  \\3U;	, 	
*3F'38F0%%fi8 4..s34U#z*11.A+#	,,> &"459y9:FLA, ,s   CEE)N)r   bytesr   Sequence[str] | NonereturnNone)r6   r   r^   zWtuple[int, str, str, str, list[Message], LinterStats, int, defaultdict[str, list[Any]]])r   r   rA   z3defaultdict[int, list[defaultdict[str, list[Any]]]]r^   r_   )
r   r   rS   intrT   zIterable[FileItem]r   r]   r^   r_   )#
__future__r   rL   collectionsr   collections.abcr   r   typingr   r   r   pylintr	   pylint.lint.utilsr
   pylint.messager   pylint.typingr   pylint.utilsr   r   r.   ImportErrorconcurrent.futuresr   pylint.lintr   r   __annotations__r   r;   rG   r[    r    r   <module>ro      s  
 #  # . %   / " " 16 $ #' & AE00)=0	04!!	!HTTKT 
T8 26	1;1;
1; 1; /	1;
 
1;M  O
  s$   B B BBB%$B%