Your IP : 3.139.86.53


Current Path : /opt/alt/python312/lib64/python3.12/lib2to3/__pycache__/
Upload File :
Current File : //opt/alt/python312/lib64/python3.12/lib2to3/__pycache__/refactor.cpython-312.pyc

�

�Q�fsk�� �dZdZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
ddlmZm
Z
mZddlmZddlmZmZdd	lmZdd
�ZGd�de�Zd
�Zd�Zd�Zd�Zd�ZGd�de�ZGd�de�Z Gd�de�Z!Gd�de �Z"y)z�Refactoring framework.

Used as a main program, this can refactor any number of files and/or
recursively descend down directories.  Imported as a module, this
provides infrastructure to write your own refactoring tool.
z#Guido van Rossum <guido@python.org>�N)�chain�)�driver�tokenize�token)�	find_root)�pytree�pygram)�btm_matcherc���t|ggdg�}g}tj|j�D]0\}}}|j	d�s�|r|dd}|j|��2|S)zEReturn a sorted list of all available fix names in the given package.�*�fix_�N)�
__import__�pkgutil�iter_modules�__path__�
startswith�append)�	fixer_pkg�
remove_prefix�pkg�	fix_names�finder�name�ispkgs       �7/opt/alt/python312/lib64/python3.12/lib2to3/refactor.py�get_all_fix_namesrsj��
�Y��B���
.�C��I�&�3�3�C�L�L�A����e��?�?�6�"���A�B�x�����T�"�	 B�
��c��eZdZy)�
_EveryNodeN��__name__�
__module__�__qualname__�rrr!r!+���rr!c���t|tjtjf�r|j�t
�|jhSt|tj�r'|jrt|j�St
�t|tj�r>t�}|jD]#}|D]}|jt|����%|Std|z��)zf Accepts a pytree Pattern Node and returns a set
        of the pattern types which will match first. z$Oh no! I don't understand pattern %s)
�
isinstancer	�NodePattern�LeafPattern�typer!�NegatedPattern�content�_get_head_types�WildcardPattern�set�update�	Exception)�pat�r�p�xs    rr/r//s����#��*�*�F�,>�,>�?�@��8�8�������z���#�v�,�,�-��;�;�"�3�;�;�/�/����#�v�-�-�.��E�����A��������+�,�����
�:�S�A�
B�Brc�X�tjt�}g}|D]|}|jr2	t	|j�}|D]}||j|���A|j�||jj|��l|j|��~ttjjj�tjj�D]}||j|��t|�S#t$r|j|�Y��
wxYw)z^ Accepts a list of fixers and returns a dictionary
        of head node type --> fixer list.  )�collections�defaultdict�list�patternr/rr!�_accept_typerr
�python_grammar�
symbol2number�values�tokens�extend�dict)�
fixer_list�
head_nodes�every�fixer�heads�	node_types      r�_get_headnode_dictrJKs���(�(��.�J��E����=�=�
8�'��
�
�6��"'�I��y�)�0�0��7�"'��!�!�-��5�-�-�.�5�5�e�<����U�#���6�0�0�>�>�E�E�G�!�0�0�7�7�9�	��9��$�$�U�+�9��
�����
$����U�#�
$�s�D�D)�(D)c�L�t|d�D�cgc]
}|dz|z��c}Scc}w)zN
    Return the fully qualified names for fixers in the package pkg_name.
    F�.)r)�pkg_name�fix_names  r�get_fixers_from_packagerOds=��
.�h��>�@�>��
�s�N�X�%�>�@�@��@s�!c��|S�Nr&)�objs r�	_identityrSks���Jrc�|��d}tjtj|�j���fd�}ttjtjtjh�}t�}		|�\}}||vr�|tjk(r|rn�d}n�|tjk(r�|dk(r�|�\}}|tjk7s|dk7rn�|�\}}|tjk7s|dk7rn�|�\}}|tjk(r|dk(r
|�\}}|tjk(rT|j|�|�\}}|tjk7s|dk7rn |�\}}|tjk(r�Rnn��t|�S#t$r
Yt|�SwxYw)	NFc�.��t��}|d|dfS)Nrr)�next)�tok�gens �r�advancez(_detect_future_features.<locals>.advancers����3�i���1�v�s�1�v�~�rT�from�
__future__�import�(�,)r�generate_tokens�io�StringIO�readline�	frozensetr�NEWLINE�NL�COMMENTr1�STRING�NAME�OP�add�
StopIteration)�source�have_docstringrY�ignore�features�tp�valuerXs       @r�_detect_future_featuresrros�����N�
�
"�
"�2�;�;�v�#6�#?�#?�
@�C����
�
�x�{�{�E�M�M�B�
C�F��u�H�
���	�I�B���V�|���u�|�|�#�!��!%���u�z�z�!�e�v�o�#�I�	��E�����#�u��'<��#�I�	��E�����#�u��'8��#�I�	��E�����>�e�s�l� '�	�I�B���E�J�J�&��L�L��'� '�	�I�B���U�X�X�~��#��� '�	�I�B���E�J�J�&��3�8�X�����
���X���
�s�>DF%�F%�%	F;�:F;c��eZdZdZy)�
FixerErrorzA fixer could not be loaded.N)r#r$r%�__doc__r&rrrtrt�s��&rrtc��eZdZdddd�ZdZdZdd�Zd�Zd�Zd	�Z	d
�Z
d�Zdd�Zdd
�Z
d�Zdd�Zd�Zd d�Zd�Zd�Z		d!d�Zd"d�ZdZdZd�Zd�Zd�Zd�Zd�Zd�Zy)#�RefactoringToolF)�print_function�
exec_function�write_unchanged_files�FixrNc���||_|xsg|_|jj�|_|�|jj|�tjj�|_|jdr|jjd=n&|jdr|jjd=|jjd�|_g|_tjd�|_g|_d|_t%j&|jt(j*|j�	�|_|j-�\|_|_g|_t5j6�|_g|_g|_t?|j0|j.�D]~}|j@r|j8jC|��+||j.vr|j:jE|��U||j0vs�d|j<jE|���tG|j:�|_$tG|j<�|_%y)
z�Initializer.

        Args:
            fixer_names: a list of fixers to import
            options: a dict with configuration.
            explicit: a list of fixers to run even if they are explicit.
        Nrx�printry�execrzrwF)�convert�logger)&�fixers�explicit�_default_options�copy�optionsr2r
r>�grammar�keywords�getrz�errors�logging�	getLoggerr��	fixer_log�wroter�Driverr	r�
get_fixers�	pre_order�
post_order�files�bm�
BottomMatcher�BM�
bmi_pre_order�bmi_post_orderr�
BM_compatible�	add_fixerrrJ�bmi_pre_order_heads�bmi_post_order_heads)�self�fixer_namesr�r�rGs     r�__init__zRefactoringTool.__init__�s���"��� ��B��
��,�,�1�1�3������L�L����(��,�,�1�1�3����<�<�(�)����%�%�g�.�
�\�\�/�
*����%�%�f�-�
&*�\�\�%5�%5�6M�%N��"�����'�'�(9�:��������
��m�m�D�L�L�,2�N�N�+/�;�;�8���+/�/�/�*;�'�������
��"�"�$������ ����4�?�?�D�N�N�;�E��"�"����!�!�%�(��$�.�.�(��"�"�)�)�%�0��$�/�/�)��#�#�*�*�5�1�<�$6�d�6H�6H�#I�� �$6�t�7J�7J�$K��!rc	���g}g}|jD�]w}t|iidg�}|jdd�d}|j|j�r|t|j�d}|j
d�}|jdj|D�cgc]}|j���c}�z}	t||�}	|	|j|j�}
|
jr0|jd	ur"||jvr|j!d
|���|j#d|�|
j$dk(r|j'|
���@|
j$d
k(r|j'|
���btd|
j$z��t)j*d�}|j-|��|j-|��||fScc}w#t$rtd|�d|���d�wxYw)aInspects the options to load the requested patterns and handlers.

        Returns:
          (pre_order, post_order), where pre_order is the list of fixers that
          want a pre-order AST traversal, and post_order is the list that want
          post-order traversal.
        r
rLr���N�_�zCan't find TzSkipping optional fixer: %szAdding transformation: %s�pre�postzIllegal fixer order: %r�	run_order��key)r�r�rsplitr�FILE_PREFIX�len�split�CLASS_PREFIX�join�title�getattr�AttributeErrorrtr�r�r��log_message�	log_debug�orderr�operator�
attrgetter�sort)r��pre_order_fixers�post_order_fixers�fix_mod_path�modrN�partsr6�
class_name�	fix_classrG�key_funcs            rr�zRefactoringTool.get_fixers�s������� �K�K�L��\�2�r�C�5�9�C�#�*�*�3��2�2�6�H��"�"�4�#3�#3�4�#�C��(8�(8�$9�$:�;���N�N�3�'�E��*�*�R�W�W��5O��A�a�g�g�i��5O�-P�P�J�
X�#�C��4�	��d�l�l�D�N�N�;�E��~�~�$�-�-�t�";� ��
�
�5�� � �!>��I���N�N�6��A��{�{�e�#� �'�'��.�����&�!�(�(��/� �!:�U�[�[�!H�I�I�/(�2�&�&�{�3�����(��+����8��,� �"3�4�4��-6P��"�
X� �x��!L�M�SW�W�
X�s�G	�8G�G*c���)zCalled when an error occurs.r&)r��msg�args�kwdss    r�	log_errorzRefactoringTool.log_errors��
rc�H�|r||z}|jj|�y)zHook to log a message.N)r��info�r�r�r�s   rr�zRefactoringTool.log_messages �����*�C�������rc�H�|r||z}|jj|�yrQ)r��debugr�s   rr�zRefactoringTool.log_debug
s �����*�C������#�rc��y)zTCalled with the old version, new version, and filename of a
        refactored file.Nr&)r��old_text�new_text�filename�equals     r�print_outputzRefactoringTool.print_outputs��	
rc��|D]H}tjj|�r|j|||��6|j	|||��Jy)z)Refactor a list of files and directories.N)�os�path�isdir�refactor_dir�
refactor_file)r��items�write�
doctests_only�dir_or_files     r�refactorzRefactoringTool.refactorsB��!�K��w�w�}�}�[�)��!�!�+�u�m�D��"�"�;��}�E�	!rc��tjdz}tj|�D]�\}}}|jd|�|j	�|j	�|D]m}|jd�r�tjj|�d|k(s�;tjj||�}	|j|	||��o|D�
cgc]}
|
jd�r�|
��c}
|dd��ycc}
w)z�Descends down a directory and refactor every Python file found.

        Python files are assumed to have a .py extension.

        Files and subdirectories starting with '.' are skipped.
        �pyzDescending into %srLrN)
r��extsep�walkr�r�rr��splitextr�r�)r��dir_namer�r��py_ext�dirpath�dirnames�	filenamesr�fullname�dns           rr�zRefactoringTool.refactor_dir s������T�!��,.�G�G�H�,=�(�G�X�y��N�N�/��9��M�M�O��N�N��!������,��G�G�$�$�T�*�1�-��7�!�w�w�|�|�G�T�:�H��&�&�x��
�F�	"�)1�K��"��
�
�c�8J�2��K�H�Q�K�->��Ls�C<�/C<c��	t|d�}	tj|j
�d}|j
�tj|d|d��5}|j�|fcddd�S#t$r}|jd||�Yd}~yd}~wwxYw#|j
�wxYw#1swYyxYw)	zG
        Do our best to decode a Python source file correctly.
        �rbzCan't open %s: %sN�NNrr5r���encoding�newline)	�open�OSErrorr�r�detect_encodingrb�closer`�read)r�r��f�errr�s     r�_read_python_sourcez#RefactoringTool._read_python_source4s���	��X�t�$�A�	��/�/��
�
�;�A�>�H�
�G�G�I�
�W�W�X�s�X�r�
B�a��6�6�8�X�%�	&�	&���	��N�N�.��#�>���	��
�G�G�I��
B�
B�s.�A6�"B�B4�6	B�?B�B�B1�4B=c��|j|�\}}|�y|dz
}|r^|jd|�|j||�}|js||k7r|j	|||||�y|jd|�y|j||�}|js|r.|jr"|j	t|�dd|||��y|jd|�y)zRefactors a file.N�
zRefactoring doctests in %szNo doctest changes in %sr�)r�r�zNo changes in %s)r�r��refactor_docstringrz�processed_file�refactor_string�was_changed�str)r�r�r�r��inputr��output�trees        rr�zRefactoringTool.refactor_fileDs����2�2�8�<���x��=��
��
����N�N�7��B��,�,�U�H�=�F��)�)�V�u�_��#�#�F�H�e�U�H�M����9�8�D��'�'��x�8�D��)�)�d�t�7G�7G��#�#�C��I�c�r�N�H�*/�(�$�D����1�8�<rc��t|�}d|vrtj|j_	|jj|�}	|j|j_||_
|jd|�|j||�|S#t$rM}|jd||jj|�Yd}~|j|j_yd}~wwxYw#|j|j_wxYw)aFRefactor a given input string.

        Args:
            data: a string holding the code to be refactored.
            name: a human-readable name for use in error/log messages.

        Returns:
            An AST corresponding to the refactored input stream; None if
            there were errors during the parse.
        rxzCan't parse %s: %s: %sNzRefactoring %s)
rrr
�!python_grammar_no_print_statementrr��parse_stringr3r��	__class__r#�future_featuresr��
refactor_tree)r��datarror�r�s      rr�zRefactoringTool.refactor_string[s���+�4�0���x�'�"(�"J�"J�D�K�K��	/��;�;�+�+�D�1�D�#'�,�,�D�K�K��'������'��.����4��&�����	��N�N�3�����!7�!7��
>��"&�,�,�D�K�K���	��
#'�,�,�D�K�K��s)�B�	C*�(C%�C-�%C*�*C-�-D
c��tjj�}|rZ|jd�|j	|d�}|j
s||k7r|j
|d|�y|jd�y|j|d�}|j
s|r)|jr|j
t|�d|�y|jd�y)NzRefactoring doctests in stdinz<stdin>zNo doctest changes in stdinzNo changes in stdin)
�sys�stdinr�r�r�rzr�r�r�r�)r�r�r�r�r�s     r�refactor_stdinzRefactoringTool.refactor_stdinvs����	�	��� ����N�N�:�;��,�,�U�I�>�F��)�)�V�u�_��#�#�F�I�u�=����<�=��'�'��y�9�D��)�)�d�t�7G�7G��#�#�C��I�y�%�@����4�5rc���t|j|j�D]}|j||��|j	|j
|j��|j	|j|j��|jj|j��}t|j���r�|jjD�]�}||vs�	||s�||jtjj d��|j"r-||jtjj$��t'||�D�]}|||vr||j)|�	t+|�|j.r||j.vr�F|j1|�}|s�Z|j3||�}|��o|j5|�|j�D]0}|j.sg|_|j.j7|��2|jj|j��}|D]"}	|	|vrg||	<||	j9||	��$�����t|j��r���t|j|j�D]}|j;||��|j<S#t,$rY���wxYw)a�Refactors a parse tree (modifying the tree in place).

        For compatible patterns the bottom matcher module is
        used. Otherwise the tree is traversed node-to-node for
        matches.

        Args:
            tree: a pytree.Node instance representing the root of the tree
                  to be refactored.
            name: a human-readable name for this tree.

        Returns:
            True if the tree was modified, False otherwise.
        T)r��reverser�)rr�r��
start_tree�traverse_byr�r�r��run�leaves�anyr@r�r�r	�Base�depth�keep_line_order�
get_linenor;�remover�
ValueError�fixers_applied�match�	transform�replacerrB�finish_treer�)
r�r�rrG�	match_set�node�results�new�new_matches�fxrs
          rrzRefactoringTool.refactor_tree�sv�� �4�>�>�4�?�?�;�E����T�4�(�<�	
����1�1�4�>�>�3C�D�����2�2�D�O�O�4E�F��G�G�K�K����
�.�	��)�"�"�$�%��������I�%�)�E�*:��e�$�)�)�f�k�k�.?�.?��)�N��,�,�"�%�(�-�-�&�+�+�2H�2H�-�I� $�Y�u�%5� 6���9�U�#3�3�%�e�,�3�3�D�9�%�%�d�O� �.�.�5�D�<O�<O�3O�$�"'�+�+�d�"3��"�"'�/�/�$��"@�C�"�� $���S� 1�,/�N�N�,<�D�,0�+>�+>�>@��(;�$(�$7�$7�$>�$>�u�$E�-=�/3�g�g�k�k�#�*�*�,�.G��+6�C�+.�)�+;�79�	�#��$-�c�N�$9�$9�+�c�:J�$K�	,7�A!7�(��)�"�"�$�%�b�4�>�>�4�?�?�;�E����d�D�)�<������E *�%�%�%�s�	K � 	K-�,K-c��|sy|D]R}||jD]>}|j|�}|s�|j||�}|��,|j|�|}�@�Ty)aTraverse an AST, applying a set of fixers to each node.

        This is a helper method for refactor_tree().

        Args:
            fixers: a list of fixer instances.
            traversal: a generator that yields AST nodes.

        Returns:
            None
        N)r,rrr)r�r��	traversalrrGrrs       rrzRefactoringTool.traverse_by�s^�����D���	�	�*���+�+�d�+����/�/�$��8�C������S�)�"��
+�rc�2�|jj|�|�|j|�d}|�y||k(}|j||||�|r|j	d|�|j
sy|r|j
||||�y|j	d|�y)zR
        Called when a file has been refactored and there may be changes.
        NrzNo changes to %szNot writing changes to %s)r�rr�r�r�rz�
write_file)r�r�r�r�r�r�r�s       rr�zRefactoringTool.processed_file�s���
	
�
�
���(�#����/�/��9�!�<�H�����H�$�����(�H�h��>���N�N�-�x�8��-�-����O�O�H�h��(�C��N�N�6��Arc�`�	tj|d|d��}|5	|j	|�ddd�|jd|�d|_y#t$r}|jd||�Yd}~yd}~wwxYw#t$r}|jd||�Yd}~�ld}~wwxYw#1swY�uxYw)	z�Writes a string to a file.

        It first shows a unified diff between the old text and the new text, and
        then rewrites the file; the latter is only done if the write option is
        set.
        �wr�r�zCan't create %s: %sNzCan't write %s: %szWrote changes to %sT)r`r�r�r�r�r�r�)r�r�r�r�r��fpr�s       rr$zRefactoringTool.write_files���	�����3��2�F�B�
�
D�����"��
	
���,�h�7���
���	��N�N�0�(�C�@���	���
D����3�X�s�C�C��
D���R�sE�A�B$�A;�	A8�A3�3A8�;	B!�B�B$�B!�!B$�$B-z>>> z... c	���g}d}d}d}d}|jd��D�]}|dz
}|j�j|j�rK|�#|j	|j||||��|}|g}|j
|j�}	|d|	}�}|�S|j||jz�s#|||jj�zdzk(r|j|���|�#|j	|j||||��d}d}|j|���|�#|j	|j||||��dj|�S)a�Refactors a docstring, looking for doctests.

        This returns a modified version of the input string.  It looks
        for doctests, which start with a ">>>" prompt, and may be
        continued with "..." prompts, as long as the "..." is indented
        the same as the ">>>".

        (Unfortunately we can't use the doctest module's parser,
        since, like most parsers, it is not geared towards preserving
        the original source.)
        NrT��keependsrr�r�)�
splitlines�lstripr�PS1rB�refactor_doctest�find�PS2�rstriprr�)
r�r�r��result�block�block_lineno�indent�lineno�line�is
          rr�z"RefactoringTool.refactor_docstringsg�������������$�$�d�$�3�D��a�K�F��{�{�}�'�'����1��$��M�M�$�"7�"7��|�8>��#J�K�%������I�I�d�h�h�'���b�q����$��?�?�6�D�H�H�#4�5��6�D�H�H�O�O�$5�5��<�<����T�"��$��M�M�$�"7�"7��|�8>��#J�K������
�
�d�#�)4�*���M�M�$�/�/��|�06��B�
C��w�w�v��rc���	|j|||�}|j||�r�t|�jd��}|d|dz
||dz
d}}	|	dg|dz
zk(sJ|	��|djd�s
|dxxdz
cc<||jz|j!d	�zg}|r#||D�cgc]}||j"z|z��c}z
}|S#t$r�}|jjtj
�r(|D]#}|j
d|jd���%|jd|||jj|�|cYd}~Sd}~wwxYwcc}w)
z�Refactors one doctest.

        A doctest is given as a block of lines, the first of which starts
        with ">>>" (possibly indented), while the remaining lines start
        with "..." (identically indented).

        z
Source: %sr�z+Can't parse docstring in %s line %s: %s: %sNTr)rr�r)�parse_blockr3r��isEnabledForr��DEBUGr�r1r�rr#rr�r+�endswithr-�popr0)
r�r3r6r5r�r�r�r7r�clippeds
          rr.z RefactoringTool.refactor_doctestDsa��	��#�#�E�6�6�:�D����d�H�-��d�)�&�&��&�5�C��y��q��>�3�v�a�x�y�>�S�G��t�f��q��1�1�:�7�:�1��r�7�#�#�D�)��B��4����d�h�h�&������3�4�E���s�C�s�t�&�4�8�8�+�d�2�s�C�C�����#�	��{�{�'�'��
�
�6�!�D��N�N�<����T�1B�C�"��N�N�H�#�V�S�]�]�-C�-C�S�
J��L��
	�� Ds$�C�/E!�	E�A;E�E�Ec�X�|jrd}nd}|js|jd|�n4|jd|�|jD]}|j|��|jr3|jd�|jD]}|j|��|jr{t|j�dk(r|jd�n%|jdt|j��|jD]\}}}|j|g|��i|���yy)	N�werez
need to bezNo files %s modified.zFiles that %s modified:z$Warnings/messages while refactoring:rzThere was 1 error:zThere were %d errors:)r�r�r�r�r�r�)r�rA�file�messager�r�r�s       r�	summarizezRefactoringTool.summarizeas����:�:��D��D��z�z����4�d�;����6��=��
�
��� � ��&�#��>�>����C�D��>�>��� � ��)�*��;�;��4�;�;��1�$�� � �!5�6�� � �!8�#�d�k�k�:J�K�#'�;�;���T�4� �� � ��4�t�4�t�4�$/�rc�|�|jj|j|||��}t�|_|S)z�Parses a block into a tree.

        This is necessary to get correct line number / offset information
        in the parser diagnostics and embedded into the parse tree.
        )r�parse_tokens�	wrap_toksrcr)r�r3r6r5r�s     rr:zRefactoringTool.parse_blockxs4���{�{�'�'����u�f�f�(M�N��(�{����rc#��K�tj|j||�j�}|D]+\}}\}}\}	}
}||dz
z
}|	|dz
z
}	||||f|	|
f|f���-y�w)z;Wraps a tokenize stream to systematically modify start/end.rN)rr_�	gen_lines�__next__)r�r3r6r5rAr,rq�line0�col0�line1�col1�	line_texts            rrGzRefactoringTool.wrap_toks�s}�����)�)�$�.�.���*G�*P�*P�Q��DJ�@�D�%��%��
���y��V�a�Z��E��V�a�Z��E����t�}�u�d�m�Y�F�F�EK�s�A!A#c#�K�||jz}||jz}|}|D]R}|j|�r|t|�d��n,||j	�dzk(rd��ntd|�d|����|}�T	d����w)z�Generates lines as expected by tokenize from a list of lines.

        This strips the first len(indent + self.PS1) characters off each line.
        Nr�zline=z	, prefix=r�)r-r0rr�r1�AssertionError)r�r3r5�prefix1�prefix2�prefixr7s       rrIzRefactoringTool.gen_lines�s�����
�4�8�8�#���4�8�8�#�����D����v�&��3�v�;�<�(�(������4�/�/��
�$�T�6�%J�K�K��F����H��s�A>Br�)FF)F)NFNrQ)r#r$r%r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr�r$r-r0r�r.rDr:rGrIr&rrrwrw�s���+0�).�27�9���L��K�3L�n&5�P���

�
F�L�(&� =�.�66� M �^#�.GL� $�B�*�*�C�
�C�)�V�:5�.�G�rrwc��eZdZy)�MultiprocessingUnsupportedNr"r&rrrVrV�r'rrVc�B��eZdZ�fd�Z		d�fd�	Z�fd�Z�fd�Z�xZS)�MultiprocessRefactoringToolc�H��tt|�
|i|��d|_d|_yrQ)�superrXr��queue�output_lock�r�r��kwargsrs   �rr�z$MultiprocessRefactoringTool.__init__�s'���
�)�4�9�4�J�6�J���
���rc���|dk(rtt|�|||�S	ddl}|j�td��|j�|_|j�|_
t|�D�cgc]}|j|j���� }}	|D]}|j��tt|�|||�|jj�t|�D]}|jj!d��|D]#}|j#�s�|j��%d|_y#t$rt
�wxYwcc}w#|jj�t|�D]}|jj!d��|D]#}|j#�s�|j��%d|_wxYw)Nrrz already doing multiple processes)�target)rZrXr��multiprocessing�ImportErrorrVr[�RuntimeError�
JoinableQueue�Lockr\�range�Process�_child�startr��put�is_alive)
r�r�r�r��
num_processesrar8�	processesr6rs
         �rr�z$MultiprocessRefactoringTool.refactor�s�����A���4�d�D��u�m�-�
-�	-�"��:�:�!��A�B�B�$�2�2�4��
�*�/�/�1���#�M�2�4�2��%�,�,�D�K�K�,�@�2�	�4�	������	���-�t�=�e�U�>K�
M�
�J�J�O�O���=�)���
�
���t�$�*����:�:�<��F�F�H���D�J��)�	-�,�,�	-��4��
�J�J�O�O���=�)���
�
���t�$�*����:�:�<��F�F�H���D�J�s$�D6�/#E	�,E�6E�AG�*Gc���|jj�}|�Q|\}}	tt|�|i|��|jj�|jj�}|��Pyy#|jj�wxYwrQ)r[r�rZrXr��	task_done)r��taskr�r^rs    �rrhz"MultiprocessRefactoringTool._child�s�����z�z�~�~������L�D�&�
'��1�4�F��%�#�%��
�
�$�$�&��:�:�>�>�#�D�����
�
�$�$�&�s�A0�0Bc�~��|j�|jj||f�ytt|�|i|��SrQ)r[rjrZrXr�r]s   �rr�z)MultiprocessRefactoringTool.refactor_file�sA����:�:�!��J�J�N�N�D�&�>�*��4�d�I��!��!�
!r)FFr)r#r$r%r�r�rhr��
__classcell__)rs@rrXrX�s$��� �
:?� ��:	$�!�!rrX)T)#ru�
__author__r`r�rrr�r�r9�	itertoolsr�pgen2rrr�
fixer_utilrr�r	r
rr�rr3r!r/rJrOrSrrrt�objectrwrVrXr&rr�<module>rxs����3�
�
�	��
�����+�*�!���	�	��	�C�8�2@��%�P'��'�F�f�F�R	��	�4!�/�4!r

?>