File: //opt/alt/python27/lib64/python2.7/lib2to3/btm_matcher.pyo
�
�Ю]c           @   s�   d  Z  d Z d d l Z d d l Z d d l m Z d d l m Z d d l m	 Z	 d e
 f d	 �  �  YZ d
 e
 f d �  �  YZ i  a
 d �  Z d S(
   s�  A bottom-up tree matching algorithm implementation meant to speed
up 2to3's matching process. After the tree patterns are reduced to
their rarest linear path, a linear Aho-Corasick automaton is
created. The linear automaton traverses the linear paths from the
leaves to the root of the AST and returns a set of nodes for further
matching. This reduces significantly the number of candidate nodes.s+   George Boutsioukis <gboutsioukis@gmail.com>i����N(   t   defaultdicti   (   t   pytree(   t   reduce_treet   BMNodec           B   s#   e  Z d  Z e j �  Z d �  Z RS(   s?   Class for a node of the Aho-Corasick automaton used in matchingc         C   s1   i  |  _  g  |  _ t t j � |  _ d |  _ d  S(   Nt    (   t   transition_tablet   fixerst   nextR   t   countt   idt   content(   t   self(    (    s8   /opt/alt/python27/lib64/python2.7/lib2to3/btm_matcher.pyt   __init__   s    		(   t   __name__t
   __module__t   __doc__t	   itertoolsR   R   (    (    (    s8   /opt/alt/python27/lib64/python2.7/lib2to3/btm_matcher.pyR      s   t
   BottomMatcherc           B   s;   e  Z d  Z d �  Z d �  Z d �  Z d �  Z d �  Z RS(   sg   The main matcher class. After instantiating the patterns should
    be added using the add_fixer methodc         C   sF   t  �  |  _ t �  |  _ |  j g |  _ g  |  _ t j d � |  _ d  S(   Nt   RefactoringTool(	   t   sett   matchR   t   roott   nodesR   t   loggingt	   getLoggert   logger(   R   (    (    s8   /opt/alt/python27/lib64/python2.7/lib2to3/btm_matcher.pyR      s
    	c         C   sh   |  j  j | � t | j � } | j �  } |  j | d |  j �} x | D] } | j  j | � qJ Wd S(   s�   Reduces a fixer's pattern tree to a linear path and adds it
        to the matcher(a common Aho-Corasick automaton). The fixer is
        appended on the matching states and called when they are
        reachedt   startN(   R   t   appendR   t   pattern_treet   get_linear_subpatternt   addR   (   R   t   fixert   treet   lineart   match_nodest
   match_node(    (    s8   /opt/alt/python27/lib64/python2.7/lib2to3/btm_matcher.pyt	   add_fixer%   s    
c         C   s�   | s
 | g St  | d t � r� g  } xU | d D]I } |  j | d | �} x+ | D]# } | j |  j | d | � � qS Wq1 W| S| d | j k r� t �  } | | j | d <n | j | d } | d r� |  j | d d | �} n	 | g } | Sd S(   s5   Recursively adds a linear pattern to the AC automatoni    R   i   N(   t
   isinstancet   tupleR   t   extendR   R   (   R   t   patternR   R"