
    c2                         d dl Z d dlZd dlZd dlZd dlZd dl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mZmZmZ  G d d          Z G d d          Z G d d          Zd	 Z G d
 d          ZdS )    N)builtins
exceptionspyobjectsdefstdmods
taskhandleutilsc                      e Zd Zd Zd Zd Zd Zed             Zd+dZ	d Z
 ej        d	          d+d
            Zd Zd Z ej        d          d             Z ej        d          d,d            Z ej        d          d+d            Zd+dZ ej        d          d             Z ej        d          d+d            Z ej        d          d             Z ej        d          d             Zd-dZ ej        d          d             Zd  Zd! Zd.d"Zd# d$ dfd%Zej        fd&Z d' Z! ej        d(          d)             Z"eej#        d*                         Z$dS )/PyCorec                 F   || _         |                                  g | _        t          |           | _        t          |           | _        t          j        j	        j
                            |          | _        |                                  |                                  d S N)project_init_resource_observercache_observers_ModuleCachemodule_cache_ExtensionCacheextension_cacheropebaseoi
objectinfoObjectInfoManagerobject_info_init_python_files_init_automatic_soa)selfr   s     0lib/python3.11/site-packages/rope/base/pycore.py__init__zPyCore.__init__   s    $$&&&!(...t449<2DDWMM!!!  """""    c                     d | _         | j        j                            dd           }|Dt          j        j                                        | _         | j                             |           d S d S )Npython_files)	python_matcherr   prefsgetr   r   	resources_ResourceMatcherset_patterns)r   patternss     r   r   zPyCore._init_python_files   sl    "<%)).$?? 	7"&)"5"F"F"H"HD,,X66666	7 	7r   c                     | j         }t          j        j                            |||          }t          j        j                            |          | _        | j                            | j                   d S N)changedmovedremoved)	_invalidate_resource_cacher   r   resourceobserverResourceObserverFilteredResourceObserverobserverr   add_observerr   callbackr2   s      r   r   zPyCore._init_resource_observer!   sj    29->>Hh ? 
 
 	2KKHUU!!$-00000r   c                     | j         sd S | j        }t          j        j                            |||          }| j                            |           d S r*   )automatic_soa_file_changed_for_soar   r   r/   r0   r   r3   r4   s      r   r   zPyCore._init_automatic_soa)   s^    ! 	F-9->>Hh ? 
 
 	!!(+++++r   c                     | j         j                            dd           }| j         j                            d|          S )Nautomatic_soir7   )r   r#   r$   )r   auto_soas     r   r7   zPyCore.automatic_soa2   s7    <%))/4@@|!%%ox@@@r   Nc                 x    | j         j                            |          }|t          | j         ||           d S d S r   )r   historycontents_before_current_changeperform_soa_on_changed_scopes)r   resourcenew_resourceold_contentss       r   r8   zPyCore._file_changed_for_soa7   sI    |+JJ8TT 	P)$,,OOOOO	P 	Pr   c                     |                                 rdS | j        |j                            d          S | j                            |          S )NF.py)	is_folderr"   nameendswith
does_matchr   r@   s     r   is_python_filezPyCore.is_python_file<   sS     	5 	1=))%000"--h777r   z Use `project.get_module` insteadc                 8    | j                             ||          S )z-Returns a `PyObject` if the module was found.)r   
get_module)r   rF   folders      r   rL   zPyCore.get_moduleC   s     |&&tV444r   c                     i }| j         D ]P}|                    |dz             r6|t          |          dz   d          }d|vr|                     |          ||<   Q|S )N.   )extension_modules
startswithlenbuiltin_module)r   modnameresult	extensionrF   s        r   _builtin_submoduleszPyCore._builtin_submodulesH   s{    / 	B 	BI##GcM22 B W!1!3!34d? B#'#6#6y#A#AF4Lr   c                 6    | j                             |          S r   )r   get_pymodule)r   rF   s     r   rT   zPyCore.builtin_moduleQ   s    #00666r   z)Use `project.get_relative_module` insteadc                 :    | j                             |||          S r   )r   get_relative_module)r   rF   rM   levels       r   r\   zPyCore.get_relative_moduleT   s    |//feDDDr   z(Use `libutils.get_string_module` insteadFc                 2    t          j        | |||          S )zReturns a `PyObject` object for the given code

        If `force_errors` is `True`, `exceptions.ModuleSyntaxError` is
        raised if module has syntax errors.  This overrides
        ``ignore_syntax_errors`` project config.

        force_errors)r   PyModule)r   coder@   r`   s       r   get_string_modulezPyCore.get_string_moduleX   s     $T4UUUUr   z'Use `libutils.get_string_scope` insteadc                 L    t           j        j                            ||          S )z+Returns a `Scope` object for the given code)r   r   libutilsget_string_scope)r   rb   r@   s      r   rf   zPyCore.get_string_scopec   s     y!224BBBr   c                 0    | j         D ]} ||           d S r   )r   )r   r@   rA   r2   s       r   r.   z!PyCore._invalidate_resource_cacheh   s1    , 	 	HHX	 	r   z-Use `project.get_python_path_folders` insteadc                 4    | j                                         S r   )r   get_python_path_foldersr   s    r   ri   zPyCore.get_python_path_foldersl   s    |33555r   z!Use `project.find_module` insteadc                 8    | j                             ||          S )zjReturns a resource corresponding to the given module

        returns None if it can not be found
        )r   find_module)r   rU   rM   s      r   rl   zPyCore.find_modulep   s     |''888r   z*Use `project.find_relative_module` insteadc                 :    | j                             |||          S r   )r   find_relative_module)r   rU   rM   r]   s       r   rn   zPyCore.find_relative_modulex   s    |00&%HHHr   z(Use `project.get_source_folders` insteadc                 4    | j                                         S )zReturns project source folders)r   get_source_foldersrj   s    r   rp   zPyCore.get_source_folders   s     |..000r   c                 8    | j                             ||          S r   )r   rZ   )r   r@   r`   s      r   resource_to_pyobjectzPyCore.resource_to_pyobject   s     --hEEEr   z&Use `project.get_python_files` insteadc                 4    | j                                         S )z1Returns all python files available in the project)r   get_python_filesrj   s    r   rt   zPyCore.get_python_files   s     |,,...r   c                 |    |                     d          o'|                    d                                           S )Nz__init__.py)	has_child	get_childrE   )r   rM   s     r   _is_packagezPyCore._is_package   s>    ]++ @$$]33==???	
r   c                 z   |                                 D ]}|                     |          r|gc S g }|                                D ]3}|j                            d          r|                    |            n4|                                 D ]*}|                    |                     |                     +|S )NrD   )get_foldersrx   	get_filesrF   rG   appendextend_find_source_folders)r   rM   r@   rV   s       r   r~   zPyCore._find_source_folders   s    **,, 	  	 H))  x ((** 	 	H}%%e,, f%%% **,, 	? 	?HMM$33H==>>>>r   c                 h   | j         j                            dd          }| j         j                            d|          }| j        j        }|sd}t
          j        j        j        	                    | |||||          }|
                    | j        j                   |                                 |S )zRun `resource` module

        Returns a `rope.base.oi.doa.PythonFileRunner` object for
        controlling the process.

        perform_doiTperform_doaN)r   r#   r$   r   doa_data_receivedr   r   r   doaPythonFileRunneradd_finishing_observerr   forget_all_datarun)r   r@   argsstdinstdoutr   receiverrunners           r   
run_modulezPyCore.run_module   s     l(,,]DAAl(,,]KHH#5 	H!22(D%
 
 	%%d&7&GHHH

r   c                     dS NT pys    r   <lambda>zPyCore.<lambda>   s    $ r   c                     dS r   r   r   s    r   r   zPyCore.<lambda>   s    D r   c                     | | j         j                            dd          }|                     |          }| j                                         t          j        j        j	        
                    | ||||           dS )a  Analyze `resource` module for static object inference

        This function forces rope to analyze this module to collect
        information about function calls.  `should_analyze` is a
        function that is called with a `PyDefinedObject` argument.  If
        it returns `True` the element is analyzed.  If it is `None` or
        returns `False` the element is not analyzed.

        `search_subscopes` is like `should_analyze`; The difference is
        that if it returns `False` the sub-scopes are all ignored.
        That is it is assumed that `should_analyze` returns `False`
        for all of its subscopes.

        `followed_calls` override the value of ``soa_followed_calls``
        project config.
        Nsoa_followed_callsr   )r   r#   r$   rr   r   r   r   r   r   soaanalyze_module)r   r@   should_analyzesearch_subscopesfollowed_callspymodules         r   r   zPyCore.analyze_module   s    .  	M!\/334H!LLN,,X66))+++	''(N,<n	
 	
 	
 	
 	
r   c                 >    t          j        dt          d           g S )Nz$`PyCore.get_classes()` is deprecated   )
stacklevel)warningswarnDeprecationWarning)r   task_handles     r   get_classeszPyCore.get_classes   s+    24FST	
 	
 	
 	
 	r   c                 T    t          | j                  t          | j                  z   S r   )strr   r   rj   s    r   __str__zPyCore.__str__   s#    4$%%D,<(=(===r   zUse `libutils.modname` insteadc                 J    t           j        j                            |          S r   )r   r   re   rU   rI   s     r   rU   zPyCore.modname   s    y!))(333r   c                     t          | j        j                            dg                     }| j        j                            dd          r&|                    t          j                               |S )NrQ   import_dynload_stdmodsF)setr   r#   r$   updater   dynload_modules)r   rV   s     r   rQ   zPyCore.extension_modules   se     T\'++,?DDEE<!!":EBB 	5MM'133444r   r   )NFF)NNN)%__name__
__module____qualname__r   r   r   r   propertyr7   r8   rJ   r   
deprecatedrL   rX   rT   r\   rc   rf   r.   ri   rl   rn   rp   rr   rt   rx   r~   r   r   r   DEFAULT_TASK_HANDLEr   r   rU   cacheitrQ   r   r   r   r
   r
      sS       # # #7 7 71 1 1, , , A A XAP P P P
8 8 8 U8995 5 5 :95  7 7 7 UABBE E CBE U@AAV V V BAV U?@@C C C A@C    UEFF6 6 GF6 U9::9 9 9 ;:9 UBCCI I DCI U@AA1 1 BA1F F F F U>??/ / @?/
 
 
     , '(
 
 
 
> '1&D    > > > U6774 4 874 
]  ] X  r   r
   c                   .    e Zd Zd Zd ZddZd Zd ZdS )	r   c                     || _         i | _        | j         j                            | j                   | j         j        | _        d S r   )pycore
module_mapr   r|   _invalidate_resourcer2   r   r   s     r   r   z_ModuleCache.__init__   s<    #**4+DEEE,r   c                     || j         v r8|                                  | j                            |           | j         |= d S d S r   )r   r   r2   remove_resourcerI   s     r   r   z!_ModuleCache._invalidate_resource   sS    t& 	*  """M))(333)))	* 	*r   Fc                 &   || j         v r| j         |         S |                                rt          j        | j        ||          }n%t          j        | j        ||          }|j        r|S || j         |<   | j                            |           |S )Nr_   )r@   r`   )	r   rE   r   	PyPackager   ra   
has_errorsr2   add_resource)r   r@   r`   rV   s       r   rZ   z_ModuleCache.get_pymodule   s    t& 	-?8,, 	!+)  FF "*!)  F
   $*!""8,,,r   c                 f    | j                                         D ]}|                                 d S r   )r   values_forget_concluded_data)r   r   s     r   r   z_ModuleCache.forget_all_data  s>    ..00 	. 	.H++----	. 	.r   c                 0    dt          | j                  z  S )NzPyCore caches %d PyModules
)rS   r   rj   s    r   r   z_ModuleCache.__str__  s    -DO0D0DDDr   Nr   )r   r   r   r   r   rZ   r   r   r   r   r   r   r      si        - - -* * *   *. . .E E E E Er   r   c                       e Zd Zd Zd ZdS )r   c                 "    || _         i | _        d S r   )r   
extensionsr   s     r   r   z_ExtensionCache.__init__  s    r   c                     |dk    rt           j         S | j        j        }|| j        vr&||v r"t          j        || j                  | j        |<   | j                            |          S )N__builtin__)r   r   rQ   r   BuiltinModuler$   )r   rF   alloweds      r   rZ   z_ExtensionCache.get_pymodule  so    =  	%$$+/t& 	N47? 	N$,$:4$M$MDOD!""4(((r   N)r   r   r   r   rZ   r   r   r   r   r     s2          ) ) ) ) )r   r   c                 h   | j         }|                                r|                    |          rt          j        t
          j                  5  |                                }t          ||          fd}fd}|	                    |||           d d d            d S # 1 swxY w Y   d S d S d S )Nc                     |                                  }                    |                                |                                          S r   )	get_scope
is_changed	get_startget_end)	pydefinedscopedetectors     r   r   z7perform_soa_on_changed_scopes.<locals>.search_subscopes*  s<    !++--**5??+<+<emmooNNNr   c                     |                                  }|                                }|                                }                    ||          S r   )r   r   r   consume_changes)r   r   startendr   s       r   r   z5perform_soa_on_changed_scopes.<locals>.should_analyze.  sF    !++--))mmoo//s;;;r   )
r   existsrJ   
contextlibsuppressr   ModuleSyntaxErrorread_TextChangeDetectorr   )r   r@   rB   r   new_contentsr   r   r   s          @r   r?   r?   "  sE   ^F NV228<< N !=>> 	N 	N#==??L*<FFHO O O O O< < < < < !!(N<LMMM	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	NN N N Ns   AB##B'*B'c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )r   c                 J    || _         || _        |                                  d S r   )oldnew
_set_diffs)r   r   r   s      r   r   z_TextChangeDetector.__init__8  s&    r   c                 n   t          j                    }g | _        d}|                    | j                            d          | j                            d                    D ]Q}|                    d          r|dz  }|                    d          r|dz  }| j                            |           Rd S )Nr   T rP   -)	difflibDifferlinescomparer   
splitlinesr   rR   r|   )r   differlinenolines       r   r   z_TextChangeDetector._set_diffs=  s    !!
NNH%%tx':':4'@'@
 
 	* 	*D s## *!%% *!
!!&)))	* 	*r   c                 @    |                      ||          \  }}||k     S )z~Tell whether any of start till end lines have changed

        The end points are inclusive and indices start from 1.
        )_get_changedr   r   r   leftrights        r   r   z_TextChangeDetector.is_changedJ  s'    
 ''s33ee|r   c                 `    |                      ||          \  }}||k     r
| j        ||= ||k     S )z5Clear the changed status of lines from start till end)r   r   r   s        r   r   z#_TextChangeDetector.consume_changesR  s?    ''s33e%< 	'
4:&e|r   c                 r    t          j        | j        |          }t          j        | j        |          }||fS r   )bisectbisect_leftr   bisect_rightr   s        r   r   z _TextChangeDetector._get_changedY  s4    !$*e44#DJ44U{r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   7  s_          
* * *        r   r   )r   r   r   r   rope.base.libutilsr   rope.base.oi.doarope.base.oi.objectinforope.base.oi.soarope.base.resourceobserverrope.base.resources	rope.baser   r   r   r   r   r   r
   r   r   r?   r   r   r   r   <module>r     sr                          ! ! ! !     T T T T T T T T T T T T T T T TX X X X X X X Xv'E 'E 'E 'E 'E 'E 'E 'ET) ) ) ) ) ) ) )N N N*% % % % % % % % % %r   