
    c1                     X   d Z ddlZddlZddlZddlmZmZmZm	Z	 ddl
mZ ddlmZ  G d dej                  Z G d d	          Z G d
 d          Z G d d          Z G d d          Z G d de          Z G d de          Z G d d          Z G d d          Zd Zd ZdS )z0This module can be used for finding similar code    N)astcodeanalyze
exceptionslibutils)
patchedast)MismatchedTokenErrorc                       e Zd ZdS )BadNameInCheckErrorN)__name__
__module____qualname__     ;lib/python3.11/site-packages/rope/refactor/similarfinder.pyr
   r
      s        Dr   r
   c                   .    e Zd ZdZddZd	dZd Zd ZdS )
SimilarFinderz`SimilarFinder` can be used to find similar pieces of code

    See the notes in the `rope.refactor.restructure` module for more
    info.

    Nc                    |j         | _        	 t          |j         |                                | j                  | _        n+# t          $ r t          d|j        j	        z              w xY w|| _
        |Wi | _        t          j        j                            |j        j                  fD ]}|| j        |                                <   dS || _        dS )zConstruct a SimilarFinderz
in file %sN)source_codesourceRawSimilarFinderget_ast_does_match
raw_finderr   printresourcepathpymodule	wildcardsroperefactorDefaultWildcardpycoreprojectget_name)selfr   r   wildcards       r   __init__zSimilarFinder.__init__   s    *	.$h&6&6&8&8$:J DOO $ 	 	 	,!2!77888	 ! 	'DN'778OPP ? ? 7?x002233? ?
 'DNNNs   2A (A)r   c                    |i }|| _         |t          | j                  }d }d|                    di           v r0|d         d         \  }}|| j                                        k    r|}| j                            ||||          S )Nskip )startendr)   )argslenr   getr   get_resourcer   get_matches)r%   coder-   r+   r,   skip_regionr   regions           r   r1   zSimilarFinder.get_matches+   s     	D	 	#dk""CTXXb"%%% 	%#Bx/Hf4=55777 %$**4u#K*XXXr   c              /   V   K    | j         |i |D ]}|                                V  d S N)r1   
get_region)r%   r-   kwdsmatchs       r   get_match_regionszSimilarFinder.get_match_regions8   sL      %T%t4t44 	% 	%E""$$$$$$	% 	%r   c                 ,   | j                             |d          }d}t          |t          t          f          r|d         }|d         }t
          j        j                            | j	        ||          }| j        |         
                    ||          S )Nr*   defaultr      )r-   r/   
isinstancetuplelistr   r    r   Suspectr   matches)r%   nodenameargkindsuspects         r   r   zSimilarFinder._does_match<   s    immD"%%cE4=)) 	q6Da&C-)11$-tLL~d#++GS999r   r6   )Nr   N)r   r   r   __doc__r'   r1   r:   r   r   r   r   r   r      sh         ' ' ' '(Y Y Y Y% % %: : : : :r   r   c                   @    e Zd ZdZddZd Zd ZddZd Zd	 Z	d
 Z
dS )r   z6A class for finding similar expressions and statementsNc                     |@	 t          j        |          }n*# t          $ r t          j        d|z   dz             }Y nw xY w|| j        | _        n|| _        |                     ||           d S )N())r   parseSyntaxError_simple_does_match
does_match_init_using_ast)r%   r   rC   rP   s       r   r'   zRawSimilarFinder.__init__I   s     	55y(( 5 5 5yv!3445  	)"5DOO(DOT6*****s    $A A c                 N    t          |t          j        t          j        f          S r6   )r>   r   exprName)r%   rC   rD   s      r   rO   z#RawSimilarFinder._simple_does_matchV   s    $38 4555r   c                 z    || _         i | _        t          |d          st          j        ||           || _        d S )Nr4   )r   _matched_astshasattrr   	patch_astr   )r%   rC   r   s      r   rQ   z RawSimilarFinder._init_using_astY   sA    tX&& 	/ v...r   r   c              #      K   |t          | j                  }|                     |          D ]D}|                                \  }}||k    r%||k    r||d         |k     r|d         |k    r@|V  EdS )a%  Search for `code` in source and return a list of `Match`-es

        `code` can contain wildcards.  ``${name}`` matches normal
        names and ``${?name} can match any expression.  You can use
        `Match.get_ast()` for getting the node that has matched a
        given pattern.

        Nr   r=   )r.   r   _get_matched_astsr7   )r%   r2   r+   r,   r)   r9   match_start	match_ends           r   r1   zRawSimilarFinder.get_matches`   s        	#dk""C++D11 	 	E%*%5%5%7%7"K# 	S(8  a9)< a;AV 	 	r   c                     || j         vrL|                     |          }t          | j        || j                                                  }|| j         |<   | j         |         S r6   )rV   _create_pattern_ASTMatcherr   rP   find_matches)r%   r2   wantedrB   s       r   rZ   z"RawSimilarFinder._get_matched_astsr   sa    t)) 	/))$//F!$(FDODDQQSSG'.Dt$!$''r   c                     |                      |          }t          j        |          }|j        }t	          |          dk    r.t          |d         t          j                  r|d         j        }n|}|S )Nr=   r   )_replace_wildcardsr   rM   bodyr.   r>   Exprvalue)r%   
expressionrC   nodesra   s        r   r^   z RawSimilarFinder._create_patterny   sk    ,,Z88
y$$	u::? 	z%(CH== 	1X^FFFr   c                     t                      t          |          }fd|                                D             }|                    |          S )Nc                 <    i | ]}|                     |          S r   )get_var).0rD   ropevars     r   
<dictcomp>z7RawSimilarFinder._replace_wildcards.<locals>.<dictcomp>   s'    PPP44..PPPr   )_RopeVariableCodeTemplate	get_names
substitute)r%   rg   templatemappingrm   s       @r   rc   z#RawSimilarFinder._replace_wildcards   sR    //
++PPPP8;M;M;O;OPPP""7+++r   )NN)r   NN)r   r   r   rH   r'   rO   rQ   r1   rZ   r^   rc   r   r   r   r   r   F   s        @@+ + + +6 6 6     $( ( (
 
 
, , , , ,r   r   c                   J    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )r_   c                 d    || _         || _        d| _        t                      | _        || _        dS )zSearches the given pattern in the body AST.

        body is an AST node and pattern can be either an AST node or
        a list of ASTs nodes
        N)rd   patternrB   ro   rm   matches_callback)r%   rd   rw   rP   s       r   r'   z_ASTMatcher.__init__   s2     	$ *r   c                 j    | j         &g | _         t          j        | j        | j                   | j         S r6   )rB   r   call_for_nodesrd   _check_noder%   s    r   r`   z_ASTMatcher.find_matches   s5    < 	<DL ty$*:;;;|r   c                     t          | j        t                    r|                     |           d S |                     |           d S r6   )r>   rw   r@   _check_statements_check_expressionr%   rC   s     r   r{   z_ASTMatcher._check_node   sJ    dlD)) 	)""4(((((""4(((((r   c                     i }|                      | j        ||          r*| j                            t	          ||                     d S d S r6   )_match_nodesrw   rB   appendExpressionMatch)r%   rC   rt   s      r   r   z_ASTMatcher._check_expression   sV    T\499 	@Lg > >?????	@ 	@r   c                     t          j        |          D ]6\  }}t          |t          t          f          r|                     |           7d S r6   )r   iter_fieldsr>   r@   r?   _ASTMatcher__check_stmt_list)r%   rC   fieldchilds       r   r~   z_ASTMatcher._check_statements   sT    OD11 	. 	.LE5%$// .&&u---	. 	.r   c                 R   t          t          |                    D ]}t          |          |z
  t          | j                  k    r_|||t          | j                  z            }i }|                     ||          r(| j                            t          ||                     d S r6   )ranger.   rw   _match_stmtsrB   r   StatementMatch)r%   rh   indexcurrent_stmtsrt   s        r   __check_stmt_listz_ASTMatcher.__check_stmt_list   s    3u::&& 	P 	PE5zzE!S%6%66 P %eec$,6G6G.G&G H$$]G<< PL''}g(N(NOOO	P 	Pr   c                    t          |t          j                  r6| j                            |j                  r|                     |||          S t          |t          j                  s||k    S |j        |j        k    rdS | 	                    |          }| 	                    |          }t          |          t          |          k    rdS t          ||          D ]\  }}t          |t          j                  r|                     |||          s dS :t          |t          t          f          rqt          |t          t          f          r t          |          t          |          k    r dS t          ||          D ] \  }}	|                     ||	|          s  dS !t          |          t          |          us||k    r dS dS NFT)r>   r   rT   rm   is_varid_match_wildcardAST	__class___get_childrenr.   zipr   r@   r?   type)
r%   expectedrC   rt   	children1	children2child1child2c1c2s
             r   r   z_ASTMatcher._match_nodes   s   h)) 	E|""8;// E++HdGDDD(CG,, 	$t##/ 	5&&x00	&&t,,	y>>S^^+ 	5!)Y77 	! 	!NFF&#'** !((AA ! 55!FT5M22 !!&4-88 !CKK3v;;<V ! 55!&&11 % %FB,,RW== %$uuu%% <<tF||3 !v7G ! 55!tr   c                 >    d t          j        |          D             S )z0Return not `ast.expr_context` children of `node`c                 L    g | ]!\  }}t          |t          j                  |"S r   )r>   r   expr_context)rl   r   r   s      r   
<listcomp>z-_ASTMatcher._get_children.<locals>.<listcomp>   s?     
 
 
ueS%566

 
 
r   )r   r   r   s     r   r   z_ASTMatcher._get_children   s-    
 
 # 5 5
 
 
 	
r   c                     t          |          t          | j                  k    rdS t          || j                  D ]\  }}|                     |||          s dS  dS r   )r.   rw   r   r   )r%   r   rt   stmtr   s        r   r   z_ASTMatcher._match_stmts   sp    }T\!2!22 	5!->> 	 	ND($$XtW== uutr   c                     | j                             |j                  }||vr|                     ||          r|||<   dS dS |                     ||         |i           S )NTF)rm   get_baser   rx   r   )r%   node1node2rt   rD   s        r   r   z_ASTMatcher._match_wildcard   sm    |$$UX..w 	?$$UD11  %t5$$WT]E2>>>r   N)r   r   r   r'   r`   r{   r   r~   r   r   r   r   r   r   r   r   r_   r_      s        
+ 
+ 
+  ) ) )@ @ @
. . .
P P P  8
 
 
  ? ? ? ? ?r   r_   c                        e Zd Zd Zd Zd ZdS )Matchc                     || _         d S r6   )rt   )r%   rt   s     r   r'   zMatch.__init__   s    r   c                     dS )zReturns match regionNr   r|   s    r   r7   zMatch.get_region   s      r   c                 8    | j                             |d          S )z3Return the ast node that has matched rope variablesN)rt   r/   r%   rD   s     r   r   zMatch.get_ast   s    |d+++r   N)r   r   r   r'   r7   r   r   r   r   r   r      sA          # # #, , , , ,r   r   c                   $     e Zd Z fdZd Z xZS )r   c                 X    t                                          |           || _        d S r6   )superr'   r   )r%   r   rt   r   s      r   r'   zExpressionMatch.__init__   s&    !!!r   c                     | j         j        S r6   )r   r4   r|   s    r   r7   zExpressionMatch.get_region  s    xr   r   r   r   r'   r7   __classcell__r   s   @r   r   r      sG                  r   r   c                   $     e Zd Z fdZd Z xZS )r   c                 X    t                                          |           || _        d S r6   )r   r'   ast_list)r%   r   rt   r   s      r   r'   zStatementMatch.__init__  s&    !!! r   c                 b    | j         d         j        d         | j         d         j        d         fS )Nr   r=   )r   r4   r|   s    r   r7   zStatementMatch.get_region
  s+    }Q&q)4=+<+CA+FFFr   r   r   s   @r   r   r     sN        ! ! ! ! !G G G G G G Gr   r   c                   @    e Zd Zd Zd Zd Zd ZdZed             Z	dS )rp   c                 <    || _         |                                  d S r6   )rs   _find_names)r%   rs   s     r   r'   zCodeTemplate.__init__  s!     r   c                    i | _         t                                                              | j                  D ]}d|                                v rw|                    d          b|                    d          \  }}| j        |dz   |dz
           }|| j         vr
g | j         |<   | j         |                             ||f           d S )NrD      r=   )	namesrp   _get_patternfinditerrs   	groupdictgroupspanr   )r%   r9   r+   r,   rD   s        r   r   zCodeTemplate._find_names  s    
!..0099$-HH 	6 	6E*** 6u{{6/B/B 6"ZZ//
s}UQYq%89tz) *')DJt$
4 ''555	6 	6r   c                 4    | j                                         S r6   )r   keysr|   s    r   rq   zCodeTemplate.get_names  s    z   r   c                    t          j        | j                  }| j                                        D ]3\  }}|D ]+}|                    |d         |d         ||                    ,4|                                }|| j        S |S )Nr   r=   )r   ChangeCollectorrs   r   items
add_changeget_changed)r%   rt   	collectorrD   occurrencesr4   results          r   rr   zCodeTemplate.substitute   s    />>	!%!1!1!3!3 	J 	JD+% J J$$VAYq	74=IIIIJ&&(( 	!= r   Nc                     | j         It          j                    dz   t          j                    z   dz   dz   }t	          j        |          | _         | j         S )N|z(?P<name>\$\{[^\s\$\}]*\}))_match_patternr   get_comment_patternget_string_patternrecompile)clsrw   s     r   r   zCodeTemplate._get_pattern,  sh     	5/110223  0	0  "$G!4!4C!!r   )
r   r   r   r'   r   rq   rr   r   classmethodr   r   r   r   rp   rp     sp          6 6 6! ! !   N
" 
" [
" 
" 
"r   rp   c                   D    e Zd ZdZdZdZd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )ro   z.Transform and identify rope inserted wildcards__rope__variable_normal___rope__variable_any_c                     |                     d          r|                     |          S |                     |          S N?)
startswith_get_any_get_normalr   s     r   rk   z_RopeVariable.get_var@  s<    ??3 	*==&&&##D)))r   c                 V    |                      |          p|                     |          S r6   )
_is_normal_is_varr   s     r   r   z_RopeVariable.is_varF  s%    t$$:T(:(::r   c                     |                      |          r|t          | j                  d          S |                     |          rd|t          | j                  d          z   S d S r   )r   r.   _normal_prefixr   _any_prefixr   s     r   r   z_RopeVariable.get_baseI  sq    ??4   	4D/002233<< 	7c$"23355666	7 	7r   c                     | j         |z   S r6   )r   r   s     r   r   z_RopeVariable._get_normalO  s    "T))r   c                 &    | j         |dd          z   S )Nr=   )r   r   s     r   r   z_RopeVariable._get_anyR  s    $qrr(**r   c                 6    |                     | j                  S r6   )r   r   r   s     r   r   z_RopeVariable._is_normalU  s    t2333r   c                 6    |                     | j                  S r6   )r   r   r   s     r   r   z_RopeVariable._is_varX  s    t/000r   N)r   r   r   rH   r   r   rk   r   r   r   r   r   r   r   r   r   ro   ro   :  s        88/N)K* * *; ; ;7 7 7* * *+ + +4 4 41 1 1 1 1r   ro   c                 F   t          |          }t          j        |           }d }t          | |          }|D ]N}|                    d|z            D ]3}|                                \  }}|                    ||d|z             4O|                                }	|	|	n| S )Nc                 L    t          | t          j                  o
| j        |k    S r6   )r>   r   rT   r   )rC   rD   s     r   rP   z make_pattern.<locals>.does_match`  s    $))=dgo=r   )rP   z${%s})setr   r   r   r1   r7   r   r   )
r2   	variablesr   rP   findervariabler9   r+   r,   r   s
             r   make_patternr   \  s    II+D11I> > > dz:::F A A''((:;; 	A 	AE))++JE3  Wx-?@@@@	A ""$$F166T1r   c                    g }t          | t          j        j        j        t          j        j        j        f          rd|                                  S | j        6|                    d|                                            | j        } | j        6t          j
        | j                  }d                    |                    d          |z             S )Nz__builtins__.r   .)r>   r   basebuiltinsBuiltinClassBuiltinFunctionr$   parentinsertr   modnamer   joinsplit)	pydefinedaddressmodule_names      r   _pydefined_to_strr  l  s    GDI&3TY5G5WX  6 6y1133555

 %q),,..///$	 
 % "9#566K88K%%c**W4555r   )rH   r   rope.base.builtinsr   rope.refactor.wildcards	rope.baser   r   r   r   rope.refactorr   rope.refactor.patchedastr   RefactoringErrorr
   r   r   r_   r   r   r   rp   ro   r   r  r   r   r   <module>r     s*   6 6 				         < < < < < < < < < < < < $ $ $ $ $ $ 9 9 9 9 9 9	 	 	 	 	*5 	 	 	4: 4: 4: 4: 4: 4: 4: 4:nC, C, C, C, C, C, C, C,La? a? a? a? a? a? a? a?H	, 	, 	, 	, 	, 	, 	, 	,    e   G G G G GU G G G)" )" )" )" )" )" )" )"X1 1 1 1 1 1 1 1D2 2 2 
6 
6 
6 
6 
6r   