
    c                     h    d dl mZmZmZmZmZ d dlmZmZ d dl	m
Z
mZmZmZ  G d d          ZeZdS )    )evaluate
exceptionslibutils	pyobjects
taskhandle)ChangeContents	ChangeSet)importutilsoccurrencesrenamesourceutilsc                   \    e Zd Zd Zddej        fdZd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZdS )IntroduceFactoryc                    || _         || _        | j                             |          }t          j        ||          | _        | j        1t          | j                                        t          j	                  st          j        d          | j                                                                        | _        | j                                                                        | _        | j                                        | _        d S )Nz1Introduce factory should be performed on a class.)projectoffsetget_pymoduler   eval_location
old_pyname
isinstance
get_objectr   PyClassr   RefactoringErrorget_nameold_name
get_modulepymoduleget_resourceresource)selfr   r   r   this_pymodules        ?lib/python3.11/site-packages/rope/refactor/introduce_factory.py__init__zIntroduceFactory.__init__   s    11(;;"0GG? 	*O&&(()*;+
 +
 	 -C   2244==??2244??AA2244    FNc                     || j                                         }t          d|z            }|                    dt	          |                    }|                     |||||           |S )a  Get the changes this refactoring makes

        `factory_name` indicates the name of the factory function to
        be added.  If `global_factory` is `True` the factory will be
        global otherwise a static method is added to the class.

        `resources` can be a list of `rope.base.resource.File` that
        this refactoring should be applied on; if `None` all python
        files in the project are searched.

        NzIntroduce factory method <%s>zCollecting Changes)r   get_python_filesr	   create_jobsetlen_change_module)r    factory_nameglobal_factory	resourcestask_handlechangesjob_sets          r"   get_changeszIntroduceFactory.get_changes   so    $  	85577I;lJKK++,@#i..QQIwngVVVr$   c                     | j         S )zReturn the name of the classr   )r    s    r"   r   zIntroduceFactory.get_name0   s
    }r$   c                 r   |rd|z  }n|                      ||          }|D ]}|                    |j                   || j        k    r,|                     |||           |                                 T|                     |||          }||rnt          j        | j	        || j                  }	t          j
        | j                  }
t          j        | j	        |	|
|          \  }}|                    ||          }|                    t          ||                     |                                 d S )Nz__rope_factory_%s_)_new_function_namestarted_jobpathr   _change_resourcefinished_job_rename_occurrencesr   get_string_moduler   modnamer
   
add_importreplace
add_changer   )r    r,   r.   r*   global_r/   replacementfile_changed_codenew_pymoduler;   importeds               r"   r)   zIntroduceFactory._change_module4   s]    	I.=KK11,HHK 	# 	#E
+++% %%g|WEEE$$&&&33E;PPL 
H O#+#=lDM$ $L '.t}==G-8-ClG\. .*L( $0#7#7X#N#NL"">%#F#FGGG  """"%	# 	#r$   c                    | j                                                                         }|                     | j        |                     ||          |          }|| j        j        }n&t          j	        | j
        || j                  | _        | j        j        }|                     ||          }|d |         }||                     ||||          z  }|||d          z  }|                    t          | j        |                     d S )N)r   )r   r   	get_scoper9   r   r4   r   source_coder   r:   r   lines_get_insertion_offset_get_factory_methodr>   r   )	r    r.   r*   r?   class_scoperG   rH   startresults	            r"   r7   z!IntroduceFactory._change_resourceN   s   o0022<<>>..M422<II7
 
  	-3KK$6kDM  DM #**;>>VeV$$**5+|WUUU+eff%%>$-@@AAAAAr$   c                     |                                 }|                                r,|                                d                                          }|                    |          dz   }|S )N   )get_end
get_scopesget_line_end)r    rK   rH   
start_linerL   s        r"   rI   z&IntroduceFactory._get_insertion_offset`   sg     ((**
!!## 	@$//11"5==??J"":..2r$   c                    dt          j        | j                  z  }|rJ|                     ||          dk    rt	          j        d          d                    ||| j                  S d|z  | d| j         dz   }|                     ||          t          j        | j                  z   }dt          j        ||          z   S )	N r   z5Cannot make global factory method for nested classes.z3
def {}(*args, **kwds):
{}return {}(*args, **kwds)
z%@staticmethod
def %s(*args, **kwds):
zreturn z(*args, **kwds)

)	r   
get_indentr   _get_scope_indentsr   r   formatr   indent_lines)r    rH   rK   r*   r?   unit_indentsunindented_factoryindentss           r"   rJ   z$IntroduceFactory._get_factory_methodg   s    [3DLAAA 		&&uk::Q>  1K   LRR   6DFFdmFFFG 	 ))%==@VLA
 A
 
 k./A7KKKKr$   c                 P    t          j        ||                                          S )N)r   get_indents	get_start)r    rH   scopes      r"   rY   z#IntroduceFactory._get_scope_indents|   s    &ueoo.?.?@@@r$   c                 $    |r|S | j         dz   |z   S )N.r2   )r    r*   r?   s      r"   r4   z#IntroduceFactory._new_function_name   s"     	6=3&55r$   c                     t          j        | j        | j        | j        d          }t          j        ||||          S )NT)
only_calls)r   replace_primary)r   create_finderr   r   r   r   rename_in_module)r    rA   changed_namer+   finders        r"   r9   z$IntroduceFactory._rename_occurrences   sM    *L$-T
 
 
 &L5.
 
 
 	
r$   )__name__
__module____qualname__r#   r   DEFAULT_TASK_HANDLEr0   r   r)   r7   rI   rJ   rY   r4   r9    r$   r"   r   r      s        5 5 5& 2   2  # # #4B B B$  L L L*A A A6 6 6
 
 
 
 
r$   r   N)	rope.baser   r   r   r   r   rope.base.changer   r	   rope.refactorr
   r   r   r   r   IntroduceFactoryRefactoringrp   r$   r"   <module>ru      s    K K K K K K K K K K K K K K 6 6 6 6 6 6 6 6 G G G G G G G G G G G GE
 E
 E
 E
 E
 E
 E
 E
P /   r$   