o
    jĎi                     @   s   d dl mZ d dlmZ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ListAnyc                   @   s&   e Zd ZU eed< eed< dd ZdS )_NormalizerMetarule_value_classesrule_type_classesc                 C   s    t | |||}i |_i |_|S N)type__new__r   r   )clsnamebasesdctnew_cls r   L/home/jeff/fluffinator/venv/lib/python3.10/site-packages/parso/normalizer.pyr   	   s   z_NormalizerMeta.__new__N)__name__
__module____qualname__r   __annotations__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                    s\   i }t   D ]#}t||i }| D ]\}} fdd|D }||g | qq|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   base	rules_maptype_rule_classesnewr   r#   r   r      s   zNormalizer._instantiate_rulesc                 C   s    |  | | |}|   |S r	   )
initializevisitfinalize)r   nodevaluer   r   r   walk%   s   

zNormalizer.walkc                    sn   z|j }W n ty    | Y S w  | d fdd|D W  d    S 1 s0w   Y  d S )N c                 3   s    | ]}  |V  qd S r	   )r1   )r!   childr#   r   r   	<genexpr>2   s    z#Normalizer.visit.<locals>.<genexpr>)childrenAttributeError
visit_leaf
visit_nodejoin)r   r3   r9   r   r#   r   r1   +   s   
$zNormalizer.visitc                 c   s    |  | d V  d S r	   )_check_type_rulesr   r3   r   r   r   r<   4   s   

zNormalizer.visit_nodec                 C   s$   | j |jg D ]}|| qd S r	   )r   getr
   	feed_node)r   r3   ruler   r   r   r>   9   s   zNormalizer._check_type_rulesc                 C   s6   |  | | j|jg D ]}|| q|j|j S r	   )r>   r   r@   r4   rA   prefix)r   leafrB   r   r   r   r;   =   s   
zNormalizer.visit_leafc                 C      d S r	   r   r?   r   r   r   r0   E      zNormalizer.initializec                 C   rE   r	   r   r#   r   r   r   r2   H   rF   zNormalizer.finalizec                 C   s&   t |||}|| jvr| j| dS )NT)Issuer   append)r   r3   codemessageissuer   r   r   	add_issueK   s   
zNormalizer.add_issueNr   )r4   valuesr
   typesc                   sX   t t |dur| |dur| s"s"t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                    s@   D ]} j |g |  qD ]} j|g |  q| S r	   )r   r(   rH   r   )r"   vtr   rN   rM   r   r   	decoratore   s
   z+Normalizer.register_rule.<locals>.decorator)listrH   
ValueError)r   r4   rM   r
   rN   rR   r   rQ   r   register_ruleQ   s   


zNormalizer.register_rule)r   r   r   r   r   strr   r
   r   r   r    r   r5   r1   r   r<   r>   r;   r0   r2   rL   classmethodrU   r   r   r   r   r      s    
 		
r   )	metaclassc                   @   s   e Zd ZeZdd ZdS )NormalizerConfigc                 C   s   |  || S r	   )normalizer_class)r   r   r   r   r   create_normalizerr      z"NormalizerConfig.create_normalizerN)r   r   r   r   rZ   r[   r   r   r   r   rY   o   s    rY   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )rG   c                 C   s&   || _ 	 || _	 |j| _	 |j| _d S r	   )rI   rJ   	start_posend_posr   r3   rI   rJ   r   r   r   r    w   s   zIssue.__init__c                 C   s   | j |j ko| j|jkS r	   )r]   rI   r   otherr   r   r   __eq__   s   zIssue.__eq__c                 C   s   |  | S r	   )rb   r`   r   r   r   __ne__   r\   zIssue.__ne__c                 C   s   t | j| jfS r	   )hashrI   r]   r#   r   r   r   __hash__   s   zIssue.__hash__c                 C   s   d| j j| jf S )Nz<%s: %s>)	__class__r   rI   r#   r   r   r   __repr__   s   zIssue.__repr__N)r   r   r   r    rb   rc   re   rg   r   r   r   r   rG   v   s    rG   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 )RulerI   rJ   c                 C   
   || _ d S r	   )_normalizer)r   
normalizerr   r   r   r          
zRule.__init__c                 C   s   t  r	   )NotImplementedErrorr?   r   r   r   is_issue   s   zRule.is_issuec                 C   s   |S r	   r   r?   r   r   r   get_node   rF   zRule.get_nodec                 C   s"   |d u r| j }|d u rtd|S )Nz$The message on the class is not set.)rJ   rT   )r   rJ   r3   r   r   r   _get_message   s
   zRule._get_messageNc                 C   s>   |d u r| j }|d u rtd| ||}| j||| d S )Nz'The error code on the class is not set.)rI   rT   rp   rj   rL   r_   r   r   r   rL      s   zRule.add_issuec                 C   s&   |  |r| |}| | d S d S r	   )rn   ro   rL   )r   r3   
issue_noder   r   r   rA      s   

zRule.feed_node)NN)r   r   r   intr   rV   r    rn   ro   rp   rL   rA   r   r   r   r   rh      s   
 

rh   c                       s0   e Zd Zdd Z fddZ fddZ  ZS )RefactoringNormalizerc                 C   ri   r	   )_node_to_str_map)r   node_to_str_mapr   r   r   r       rl   zRefactoringNormalizer.__init__c                    ,   z| j | W S  ty   t | Y S w r	   )rt   KeyErrorsuperr1   r?   rf   r   r   r1      
   zRefactoringNormalizer.visitc                    rv   r	   )rt   rw   rx   r;   )r   rD   ry   r   r   r;      rz   z RefactoringNormalizer.visit_leaf)r   r   r   r    r1   r;   __classcell__r   r   ry   r   rs      s    rs   N)
contextlibr   typingr   r   r   r
   r   r   rY   rG   rh   rs   r   r   r   r   <module>   s    _$