
    Æe!                         d dl mZmZmZmZmZmZmZ d dlm	Z	m
Z
 d dlmZmZ  G d d      Z G d d      Z G d d	      Zy
)    )evaluate
exceptionslibutilspynames
taskhandleutilsworder)ChangeContents	ChangeSet)occurrencessourceutilsc                   T    e Zd Zd Zdddej
                  fdZd Zd Zd Z	d Z
d Zy)	EncapsulateFieldc                 t   || _         t        j                  ||      | _        | j                   j	                  |      }t        j                  ||      | _        | j                  | j                        st        j                  d      | j                  j                         d   j                         | _        y )Nz:Encapsulate field should be performed on class attributes.r   )projectr	   get_name_atnameget_pymoduler   eval_locationpyname_is_an_attributer   RefactoringErrorget_definition_locationget_resourceresource)selfr   r   offsetthis_pymodules        A/usr/lib/python3/dist-packages/rope/refactor/encapsulate_field.py__init__zEncapsulateField.__init__   s    &&x8	11(;,,]FC$$T[[1--L  ;;=a@MMO    Nc                    || j                   j                         }t        d| j                  z        }|j	                  dt        |            }|d| j                  z   }|d| j                  z   }t        | j                   | j                  | j                  ||      }|D ]  }|j                  |j                         || j                  k(  r:| j                  ||||      }	|j                  t        | j                  |	             n.|j                  |      }	|	|j                  t        ||	             |j                           |S )a  Get the changes this refactoring makes

        If `getter` is not `None`, that will be the name of the
        getter, otherwise ``get_${field_name}`` will be used.  The
        same is true for `setter` and if it is None set_${field_name} is
        used.

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

        zEncapsulate field <%s>zCollecting Changesget_set_)r   get_python_filesr   r   create_jobsetlenGetterSetterRenameInModuler   started_jobpathr   _change_holding_module
add_changer
   get_changed_modulefinished_job)
r   gettersetter	resourcestask_handlechangesjob_setrenamerfileresults
             r   get_changeszEncapsulateField.get_changes   s*   & 557I4tyy@A++,@#i.Q>dii'F>dii'F,LL$))T[[&&
  		#D		*t}}$44WgvvV"">$--#HI 33D9%&&~dF'CD  "		# r!   c                     | j                   S )z,Get the name of the field to be encapsulated)r   r   s    r   get_field_namezEncapsulateField.get_field_name<   s    yyr!   c                    |t        |t        j                        r| j                  j	                         \  }}|j                         j                  |      }|j                         dk(  r ||j                         j                         v S |j                  }|3|j                         dk(  r ||j                         j                         v S y)NClassF)
isinstancer   AssignedNamer   r   	get_scopeget_inner_scope_for_lineget_kind	get_namesvaluesparent)r   r   pymodulelinenoscoperE   s         r   r   z!EncapsulateField._is_an_attribute@   s    *VW5I5I"J#{{BBDHf&&(AA&IE~~7*!2!9!9!;;;\\F!foo&77&B!1!1!3!:!:!<<<r!   c                 d    | j                         }|j                         dk(  r|j                  }|S )NFunction)_get_defining_scoperB   rE   )r   defining_scopes     r   _get_defining_class_scopez*EncapsulateField._get_defining_class_scopeK   s2    113""$
2+22Nr!   c                 z    | j                   j                         \  }}|j                         j                  |      S N)r   r   r@   rA   )r   rF   lines      r   rK   z$EncapsulateField._get_defining_scopeQ   s2    <<>$!!#<<TBBr!   c                 |   | j                   j                  | j                        }| j                         }| j	                         j
                  }t        j                  |      \  }}	|j                  |||	      }
|
Xt        j                  | j                   |
| j                        }|j                         j                  |j                               }t        j                  | j                         dz  }d| d| d| j                   }d| d| d| j                   d}t        j                   ||||g      }
|
S )	N)rF   
skip_startskip_end zdef z(self):
zreturn self.z(self, value):
zself.z = value)r   r   r   rM   rK   pyobjectr   get_body_regionr-   r   get_string_moduler@   rA   	get_start
get_indentr   add_methods)r   r3   r5   r/   r0   rF   class_scopedefining_objectstartend
new_sourceindentss               r   r+   z'EncapsulateField._change_holding_moduleU   s/   <<,,T]];446224== 00A
s//%# 0 

 !11j$--H #,,.GG%%'K ((6<xy	dii[Ix/ydii[Q ,,X{VVDTU
r!   )__name__
__module____qualname__r    r   DEFAULT_TASK_HANDLEr8   r;   r   rM   rK   r+    r!   r   r   r      s<    	P 22(T	Cr!   r   c                       e Zd Zd Z	 ddZy)r(   c                 t    || _         || _        t        j                  |||      | _        || _        || _        y rO   )r   r   r   create_finderfinderr/   r0   )r   r   r   r   r/   r0   s         r   r    z#GetterSetterRenameInModule.__init__m   s4    	!//vFr!   Nc                 @    t        | ||||      }|j                         S rO   )_FindChangesForModuler-   )r   r   rF   rR   rS   change_finders         r   r-   z-GetterSetterRenameInModule.get_changed_modulet   s*     .(Hj(
 //11r!   )NNr   r   )ra   rb   rc   r    r-   re   r!   r   r(   r(   l   s     DE2r!   r(   c                       e Zd Zd Zd Zd Zd Zeej                  d               Z
eej                  d               Zeej                  d               Zy)	rk   c                     |j                   | _         |j                  | _        |j                  | _        |j                  | _        || _        || _        d| _        d | _        d | _        || _	        || _
        y Nr   )r   ri   r/   r0   r   rF   last_modifiedlast_set	set_indexrR   rS   )r   ri   r   rF   rR   rS   s         r   r    z_FindChangesForModule.__init__~   s`    ~~mmmmmm  $ r!   c                 @   g }| j                   j                  | j                  | j                        D ]  }|j	                         \  }}| j
                  |cxk  r| j                  k  rn n:| j                  ||       |j                  | j                  | j                  |        | j                  |      rt        j                  d      |j                         r,| j                  j!                  |      }|dk(  r|j                  | j"                  dz          nZ| j                  |j%                         d   | | j&                  z   dz   }|j                  | j"                  dz   |z   d|d d z  z          | j(                  j+                  |      }| j                  j,                  j/                  |      \  }}	| j(                  j1                  |	      | _        | j                  j5                  d|      dz   }t7        |      | _        n|j                  | j&                  dz          || _
         | j                  dk7  r^| j                  t7        | j                        |       |j                  | j                  | j                  d         d	j;                  |      S y )
Nz5Cannot handle tuple assignments in encapsulate field.=(r   z()z %s     )ri   find_occurrencesr   rF   get_word_rangerR   rS   _manage_writesappendsourcerp   "_is_assigned_in_a_tuple_assignmentr   r   
is_writtenr	   get_assignment_typer0   get_primary_ranger/   linesget_line_numberlogical_lineslogical_line_inget_line_endrq   indexr'   rr   join)
r   r7   
occurrencer]   r^   assignment_typevar_namecurrent_line
start_lineend_lines
             r   r-   z(_FindChangesForModule.get_changed_module   s?   ++66t}}dmmT  	%J#224JE3%7$--7v.MM$++d&8&85AB66zB 11K  $$&"&++"A"A%"H"c)MM$++"34 J$@$@$B1$EN++& 
 MMc)H4vPSQS@T7TT  $zz99%@'+}}'B'B'R'R ($
H !%

 7 7 Akk''S1A5!$VdkkD01!$DA 	%B "DKK 0&9MM$++d&8&8&:;<776?"r!   c                 p   | j                   | j                   |k  r|j                  | j                  | j                  | j                           dj	                  || j
                  d        j                         }|| j
                  d = |j                  |dz          | j                   | _        d | _         y y y )Nrx   ))rq   r|   r}   rp   r   rr   strip)r   r   r7   	set_values       r   r{   z$_FindChangesForModule._manage_writes   s    ==$&)@MM$++d&8&84==IJt~~'7 89??AIt~~'(MM)c/*!%D DM *A$r!   c                 ^    |j                         d   }| j                  j                  |      S ro   )rz   r	   !is_assigned_in_a_tuple_assignment)r   r   r   s      r   r~   z8_FindChangesForModule._is_assigned_in_a_tuple_assignment   s*    **,Q/{{<<VDDr!   c                 z    | j                   | j                   j                         S | j                  j                  S rO   )r   readrF   source_coder:   s    r   r}   z_FindChangesForModule.source   s1     ==$==%%''==,,,r!   c                     | j                   *| j                  j                  | j                        | _         | j                   j                  S rO   )rF   r   r   r   r   r:   s    r   r   z_FindChangesForModule.lines   s8     ==  LL55dmmDDM}}"""r!   c                 @    t        j                  | j                        S rO   )r	   Worderr}   r:   s    r   r	   z_FindChangesForModule.worder   s     }}T[[))r!   N)ra   rb   rc   r    r-   r{   r~   propertyr   saveitr}   r   r	   re   r!   r   rk   rk   }   sx    !'R!E 
\\-  - 
\\#  #
 
\\*  *r!   rk   N)	rope.baser   r   r   r   r   r   r	   rope.base.changer
   r   rope.refactorr   r   r   r(   rk   re   r!   r   <module>r      s7    X X X 6 2c cL2 2"V* V*r!   