B
    +d                 @   s|   d dl mZ d dlmZmZ G dd deZG dd dedZG dd	 d	ZG d
d dZ	G dd dZ
G dd deZdS )    )contextmanager)DictListc               @   s   e Zd Zdd ZdS )_NormalizerMetac             C   s    t | |||}i |_i |_|S )N)type__new__rule_value_classesrule_type_classes)clsnamebasesdctZnew_cls r   ]/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/parso/normalizer.pyr      s    z_NormalizerMeta.__new__N)__name__
__module____qualname__r   r   r   r   r   r      s   r   c               @   s   e Zd ZU i Zeeee f ed< i Z	eeee f ed< dd Z
dd Zdd Zd	d
 Zedd Zdd Zdd Zdd Zdd Zdd ZedddddddZdS )
Normalizer_rule_type_instances_rule_value_instancesc             C   s.   || _ || _g | _| d| _| d| _d S )Nr	   r   )grammar_configissues_instantiate_rulesr   r   )selfr   configr   r   r   __init__   s
    zNormalizer.__init__c                sd   i }xZt   D ]J}t||i }x8| D ],\}} fdd|D }||g | q,W qW |S )Nc                s   g | ]}| qS r   r   ).0rule_cls)r   r   r   
<listcomp>   s    z1Normalizer._instantiate_rules.<locals>.<listcomp>)r   mrogetattritems
setdefaultextend)r   attrr   baseZ	rules_maptype_Zrule_classesnewr   )r   r   r      s    zNormalizer._instantiate_rulesc             C   s    |  | | |}|   |S )N)
initializevisitfinalize)r   nodevaluer   r   r   walk"   s    

zNormalizer.walkc          	      sT   y
|j }W n tk
r$    |S X  | d fdd|D S Q R X d S )N c             3   s   | ]}  |V  qd S )N)r*   )r   child)r   r   r   	<genexpr>/   s    z#Normalizer.visit.<locals>.<genexpr>)childrenAttributeError
visit_leaf
visit_nodejoin)r   r,   r2   r   )r   r   r*   (   s    
zNormalizer.visitc             c   s   |  | d V  d S )N)_check_type_rules)r   r,   r   r   r   r5   1   s    
zNormalizer.visit_nodec             C   s(   x"| j |jg D ]}|| qW d S )N)r   getr   	feed_node)r   r,   ruler   r   r   r7   6   s    zNormalizer._check_type_rulesc             C   s:   |  | x"| j|jg D ]}|| qW |j|j S )N)r7   r   r8   r-   r9   prefix)r   leafr:   r   r   r   r4   :   s    
zNormalizer.visit_leafc             C   s   d S )Nr   )r   r,   r   r   r   r)   B   s    zNormalizer.initializec             C   s   d S )Nr   )r   r   r   r   r+   E   s    zNormalizer.finalizec             C   s&   t |||}|| jkr"| j| dS )NT)Issuer   append)r   r,   codemessageissuer   r   r   	add_issueH   s    
zNormalizer.add_issueNr   )r-   valuesr   typesc               sX   t t |dk	r"| |dk	r4| sDsDtd fdd}|S )z
        Use it as a class decorator::

            normalizer = Normalizer('grammar', 'config')
            @normalizer.register_rule(value='foo')
            class MyRule(Rule):
                error_code = 42
        Nz%You must register at least something.c                sH   x D ]} j |g |  qW x D ]} j|g |  q(W | S )N)r   r#   r>   r	   )r   vt)r
   rD   rC   r   r   	decoratorb   s
    

z+Normalizer.register_rule.<locals>.decorator)listr>   
ValueError)r
   r-   rC   r   rD   rG   r   )r
   rD   rC   r   register_ruleN   s    


zNormalizer.register_rule)r   r   r   r   r   strr   r   __annotations__r   r   r   r.   r*   r   r5   r7   r4   r)   r+   rB   classmethodrJ   r   r   r   r   r      s   
		r   )	metaclassc               @   s   e Zd ZeZdd ZdS )NormalizerConfigc             C   s   | j d krd S |  || S )N)normalizer_class)r   r   r   r   r   create_normalizero   s    
z"NormalizerConfig.create_normalizerN)r   r   r   r   rP   rQ   r   r   r   r   rO   l   s   rO   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r=   c             C   s    || _ || _|j| _|j| _d S )N)r?   r@   	start_posend_pos)r   r,   r?   r@   r   r   r   r   w   s    zIssue.__init__c             C   s   | j |j ko| j|jkS )N)rR   r?   )r   otherr   r   r   __eq__   s    zIssue.__eq__c             C   s   |  | S )N)rU   )r   rT   r   r   r   __ne__   s    zIssue.__ne__c             C   s   t | j| jfS )N)hashr?   rR   )r   r   r   r   __hash__   s    zIssue.__hash__c             C   s   d| j j| jf S )Nz<%s: %s>)	__class__r   r?   )r   r   r   r   __repr__   s    zIssue.__repr__N)r   r   r   r   rU   rV   rX   rZ   r   r   r   r   r=   v   s
   r=   c               @   sP   e Zd ZU eed< eed< dd Zdd Zdd Zd	d
 Z	dddZ
dd ZdS )Ruler?   r@   c             C   s
   || _ d S )N)_normalizer)r   Z
normalizerr   r   r   r      s    zRule.__init__c             C   s
   t  d S )N)NotImplementedError)r   r,   r   r   r   is_issue   s    zRule.is_issuec             C   s   |S )Nr   )r   r,   r   r   r   get_node   s    zRule.get_nodec             C   s"   |d kr| j }|d krtd|S )Nz$The message on the class is not set.)r@   rI   )r   r@   r,   r   r   r   _get_message   s
    zRule._get_messageNc             C   s>   |d kr| j }|d krtd| ||}| j||| d S )Nz'The error code on the class is not set.)r?   rI   r`   r\   rB   )r   r,   r?   r@   r   r   r   rB      s    zRule.add_issuec             C   s"   |  |r| |}| | d S )N)r^   r_   rB   )r   r,   Z
issue_noder   r   r   r9      s    

zRule.feed_node)NN)r   r   r   intrL   rK   r   r^   r_   r`   rB   r9   r   r   r   r   r[      s   


r[   c                   s0   e Zd Zdd Z fddZ fddZ  ZS )RefactoringNormalizerc             C   s
   || _ d S )N)_node_to_str_map)r   Znode_to_str_mapr   r   r   r      s    zRefactoringNormalizer.__init__c                s,   y
| j | S  tk
r&   t |S X d S )N)rc   KeyErrorsuperr*   )r   r,   )rY   r   r   r*      s    
zRefactoringNormalizer.visitc                s,   y
| j | S  tk
r&   t |S X d S )N)rc   rd   re   r4   )r   r<   )rY   r   r   r4      s    
z RefactoringNormalizer.visit_leaf)r   r   r   r   r*   r4   __classcell__r   r   )rY   r   rb      s   rb   N)
contextlibr   typingr   r   r   r   r   rO   r=   r[   rb   r   r   r   r   <module>   s   _
$