o
    bc&                     @   s|   d Z ddlmZ ddlmZmZ ddlmZmZ eZ	eZ
ejZeZdZdZdZG dd	 d	eZdddZdd Zdd Zd
S )z0Utility functions used by the btm_matcher module   )pytree)grammartoken)pattern_symbolspython_symbolsc                   @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )MinNodezThis class serves as an intermediate representation of the
    pattern tree during the conversion to sets of leaf-to-root
    subpatternsNc                 C   s.   || _ || _g | _d| _d | _g | _g | _d S )NF)typenamechildrenleafparentalternativesgroup)selfr   r    r   (/usr/lib/python3.10/lib2to3/btm_utils.py__init__   s   
zMinNode.__init__c                 C   s   t | jd t | j S )N )strr   r   )r   r   r   r   __repr__   s   zMinNode.__repr__c                 C   s   | }g }|rt|j tkr0|j| t|jt|jkr(t|jg}g |_|j}q|j}d}	 |S |j tkrY|j	| t|j	t|jkrQt
|j	}g |_	|j}q|j}d}	 |S |j tjkri|jri||j n||j  |j}|s|S )zInternal method. Returns a characteristic path of the
        pattern tree. This method must be run for all leaves until the
        linear subpatterns are merged into a singleN)r   TYPE_ALTERNATIVESr   appendlenr   tupler   
TYPE_GROUPr   get_characteristic_subpatterntoken_labelsNAMEr   )r   nodesubpr   r   r   leaf_to_root!   s>   


	"zMinNode.leaf_to_rootc                 C   s&   |   D ]}| }|r|  S qdS )a  Drives the leaf_to_root method. The reason that
        leaf_to_root must be run multiple times is because we need to
        reject 'group' matches; for example the alternative form
        (a | b c) creates a group [b c] that needs to be matched. Since
        matching multiple linear patterns overcomes the automaton's
        capabilities, leaf_to_root merges each group into a single
        choice based on 'characteristic'ity,

        i.e. (a|b c) -> (a|b) if b more characteristic than c

        Returns: The most 'characteristic'(as defined by
          get_characteristic_subpattern) path for the compiled pattern
          tree.
        N)leavesr#   )r   lr"   r   r   r   get_linear_subpatternK   s   zMinNode.get_linear_subpatternc                 c   s0    | j D ]	}| E dH  q| j s| V  dS dS )z-Generator that returns the leaves of the treeN)r   r$   )r   childr   r   r   r$   `   s   

zMinNode.leaves)NN)	__name__
__module____qualname____doc__r   r   r#   r&   r$   r   r   r   r   r
      s    
	*r
   Nc                 C   s  d}| j tjkr| jd } | j tjkrIt| jdkr$t| jd |}nttd}| jD ]}| j	|d r7q,t||}|durF|j
| q,nw| j tjkrt| jdkruttd}| jD ]}t||}|rm|j
| q^|jssd}nKt| jd |}nA| j tjkrt| jd tjr| jd jdkrt| jd |S t| jd tjr| jd jdkst| jdkrt| jd dr| jd jdkrdS d	}d}d}d
}d}	d
}
| jD ].}|j tjkrd
}|}n|j tjkrd	}|}	n|j tjkr|}t|dr|jdkrd	}
q|
r!| jd }t|dr |jdkr | jd }n| jd }|j tjkrT|jdkr9ttd}nItt|jrJttt|jd}n8ttt|jd}n.|j tjkrv|jd}|tv rntt| d}nttj|d}n|j tjkrt||}|r|	jd jdkrd}n|	jd jdkrnt|r|dur|jdd D ]}t||}|dur|j
| q|r||_|S )z
    Internal function. Reduces a compiled pattern tree to an
    intermediate representation suitable for feeding the
    automaton. This also trims off any optional pattern elements(like
    [a], a*).
    N       )r   r   ([valueTF=   any')r   r   *+r   )r   symsMatcherr   Alternativesr   reduce_treer
   r   indexr   Alternativer   Unit
isinstancer   Leafr0   hasattrDetailsRepeaterr   r    TYPE_ANYgetattrpysymsSTRINGstriptokensNotImplementedErrorr   )r!   r   new_noder'   reducedr   details_nodealternatives_nodehas_repeaterrepeater_nodehas_variable_name	name_leafr   r   r   r   r:   g   s   














r:   c                    s   t | ts| S t| dkr| d S g }g }g dg }d | D ]2}tt|dd rQtt| fddr;|| qtt|fddrL|| q|| q|rW|} n	|r\|} n|r`|} t| td	S )
zPicks the most characteristic from a list of linear patterns
    Current order used is:
    names > common_names > common_chars
    r   r,   )inforifnotNonez[]().,:c                 S   s   t | tu S N)r   r   xr   r   r   <lambda>   s    z/get_characteristic_subpattern.<locals>.<lambda>c                       t | to|  v S rW   r>   r   rX   )common_charsr   r   rZ          c                    r[   rW   r\   rX   )common_namesr   r   rZ     r^   )key)r>   listr   r3   rec_testr   max)subpatternssubpatterns_with_namessubpatterns_with_common_namessubpatterns_with_common_chars
subpatternr   )r]   r_   r   r      s8   



r   c                 c   s:    | D ]}t |ttfrt||E dH  q||V  qdS )zPTests test_func on all items of sequence and items of included
    sub-iterablesN)r>   ra   r   rb   )sequence	test_funcrY   r   r   r   rb     s   rb   rW   )r+    r   pgen2r   r   pygramr   r   r7   rE   opmaprH   r   rC   r   r   objectr
   r:   r   rb   r   r   r   r   <module>   s     
W %