ó
MšV]c           @   s˜   d  d l  m Z d  d l m Z d e f d „  ƒ  YZ d e e ƒ f d „  ƒ  YZ d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ	 d e f d „  ƒ  YZ
 d S(   iÿÿÿÿ(   t   contextmanager(   t   use_metaclasst   _NormalizerMetac           B   s   e  Z d  „  Z RS(   c         C   s.   t  j |  | | | ƒ } i  | _ i  | _ | S(   N(   t   typet   __new__t   rule_value_classest   rule_type_classes(   t   clst   namet   basest   dctt   new_cls(    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR      s    		(   t   __name__t
   __module__R   (    (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR      s   t
   Normalizerc           B   s’   e  Z d  „  Z d „  Z d „  Z d „  Z e d „  ƒ Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z e d
 „  ƒ Z e d d d d d „ ƒ Z RS(   c         C   sC   | |  _  | |  _ g  |  _ |  j d ƒ |  _ |  j d ƒ |  _ d  S(   NR   R   (   t   grammart   _configt   issuest   _instantiate_rulest   _rule_type_instancest   _rule_value_instances(   t   selfR   t   config(    (    s/   lib/python2.7/site-packages/parso/normalizer.pyt   __init__   s
    			c   	      C   sŽ   i  } x t  |  ƒ j ƒ  D]m } t | | i  ƒ } xR | j ƒ  D]D \ } } g  | D] } | |  ƒ ^ qQ } | j | g  ƒ j | ƒ q> Wq W| S(   N(   R   t   mrot   getattrt   itemst
   setdefaultt   extend(	   R   t   attrR
   t   baset	   rules_mapt   type_t   rule_classest   rule_clst   new(    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR      s    !c         C   s*   |  j  | ƒ |  j | ƒ } |  j ƒ  | S(   N(   t
   initializet   visitt   finalize(   R   t   nodet   value(    (    s/   lib/python2.7/site-packages/parso/normalizer.pyt   walk    s    
c            sb   y | j  } Wn t k
 r* ˆ  j | ƒ SXˆ  j | ƒ " d j ‡  f d †  | Dƒ ƒ SWd  QXd  S(   Nt    c         3   s   |  ] } ˆ  j  | ƒ Vq d  S(   N(   R%   (   t   .0t   child(   R   (    s/   lib/python2.7/site-packages/parso/normalizer.pys	   <genexpr>-   s    (   t   childrent   AttributeErrort
   visit_leaft
   visit_nodet   join(   R   R'   R-   (    (   R   s/   lib/python2.7/site-packages/parso/normalizer.pyR%   &   s    c         c   s   |  j  | ƒ d  Vd  S(   N(   t   _check_type_rules(   R   R'   (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR0   /   s    c         C   s4   x- |  j  j | j g  ƒ D] } | j | ƒ q Wd  S(   N(   R   t   getR   t	   feed_node(   R   R'   t   rule(    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR2   4   s    c         C   sK   |  j  | ƒ x- |  j j | j g  ƒ D] } | j | ƒ q& W| j | j S(   N(   R2   R   R3   R(   R4   t   prefix(   R   t   leafR5   (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR/   8   s    c         C   s   d  S(   N(    (   R   R'   (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR$   @   s    c         C   s   d  S(   N(    (   R   (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR&   C   s    c         C   s8   t  | | | ƒ } | |  j k r4 |  j j | ƒ n  t S(   N(   t   IssueR   t   appendt   True(   R   R'   t   codet   messaget   issue(    (    s/   lib/python2.7/site-packages/parso/normalizer.pyt	   add_issueF   s    c         K   s   |  j  |   S(   sÜ   
        Use it as a class decorator::

            normalizer = Normalizer('grammar', 'config')
            @normalizer.register_rule(value='foo')
            class MyRule(Rule):
                error_code = 42
        (   t   _register_rule(   R   t   kwargs(    (    s/   lib/python2.7/site-packages/parso/normalizer.pyt   register_ruleL   s    
c            s†   t  ˆ ƒ ‰ t  ˆ ƒ ‰ | d  k	 r4 ˆ j | ƒ n  | d  k	 rP ˆ j | ƒ n  ˆ rm ˆ rm t d ƒ ‚ n  ‡  ‡ ‡ f d †  } | S(   Ns%   You must register at least something.c            s^   x* ˆ D]" } ˆ  j  j | g  ƒ j |  ƒ q Wx* ˆ D]" } ˆ  j j | g  ƒ j |  ƒ q4 W|  S(   N(   R   R   R9   R   (   R"   t   vt   t(   R   t   typest   values(    s/   lib/python2.7/site-packages/parso/normalizer.pyt	   decoratord   s
      (   t   listt   NoneR9   t
   ValueError(   R   R(   RE   R   RD   RF   (    (   R   RD   RE   s/   lib/python2.7/site-packages/parso/normalizer.pyR?   X   s    N(    (    (   R   R   R   R   R)   R%   R    R0   R2   R/   R$   R&   R>   t   classmethodRA   RH   R?   (    (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR      s   											t   NormalizerConfigc           B   s   e  Z e Z d  „  Z RS(   c         C   s#   |  j  d  k r d  S|  j  | |  ƒ S(   N(   t   normalizer_classRH   (   R   R   (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyt   create_normalizerq   s    (   R   R   R   RL   RM   (    (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyRK   n   s   R8   c           B   s5   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s+   | |  _  | |  _ | |  _ | j |  _ d  S(   N(   t   _nodeR;   R<   t	   start_pos(   R   R'   R;   R<   (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR   y   s
    			c         C   s"   |  j  | j  k o! |  j | j k S(   N(   RO   R;   (   R   t   other(    (    s/   lib/python2.7/site-packages/parso/normalizer.pyt   __eq__‰   s    c         C   s   |  j  | ƒ S(   N(   RQ   (   R   RP   (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyt   __ne__Œ   s    c         C   s   t  |  j |  j f ƒ S(   N(   t   hashR;   RO   (   R   (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyt   __hash__   s    c         C   s   d |  j  j |  j f S(   Ns   <%s: %s>(   t	   __class__R   R;   (   R   (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyt   __repr__’   s    (   R   R   R   RQ   RR   RT   RV   (    (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR8   x   s
   				t   Rulec           B   sP   e  Z d Z d Z d  „  Z d „  Z d „  Z d „  Z d d d „ Z	 d „  Z
 RS(   c         C   s   | |  _  d  S(   N(   t   _normalizer(   R   t
   normalizer(    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR   š   s    c         C   s   t  ƒ  ‚ d  S(   N(   t   NotImplementedError(   R   R'   (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyt   is_issue   s    c         C   s   | S(   N(    (   R   R'   (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyt   get_node    s    c         C   s7   | d  k r3 |  j } | d  k r3 t d ƒ ‚ q3 n  | S(   Ns$   The message on the class is not set.(   RH   R<   RI   (   R   R<   (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyt   _get_message£   s
    	c         C   s\   | d  k r3 |  j } | d  k r3 t d ƒ ‚ q3 n  |  j | ƒ } |  j j | | | ƒ d  S(   Ns'   The error code on the class is not set.(   RH   R;   RI   R]   RX   R>   (   R   R'   R;   R<   (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR>   ª   s    	c         C   s2   |  j  | ƒ r. |  j | ƒ } |  j | ƒ n  d  S(   N(   R[   R\   R>   (   R   R'   t
   issue_node(    (    s/   lib/python2.7/site-packages/parso/normalizer.pyR4   ´   s    N(   R   R   RH   R;   R<   R   R[   R\   R]   R>   R4   (    (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyRW   –   s   				
N(   t
   contextlibR    t   parso._compatibilityR   R   R   R   t   objectRK   R8   RW   (    (    (    s/   lib/python2.7/site-packages/parso/normalizer.pyt   <module>   s   `
