a
    g	g1                     @   s  U d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
 ejdkrZd dlmZ nd dlmZ d dlmZmZmZmZmZmZmZ d dlmZ d d	lmZmZ e
eef Zh d
Zeed< ddhZeed< h eeZeed< h dZ eed< dZ!eG dd dZ"eee dddZ#edde$e%ee" dddZ&e$e$dddZ'edd d!d"Z(ee%d d#d$Z)ee"ee d%d&d'Z*ee"ee d%d(d)Z+ee%d*d+d,Z,ee%d*d-d.Z-ee e%d/d0d1Z.dS )2    N)	dataclass)	lru_cache)IteratorListOptionalUnion)      )Final)CLOSING_BRACKETSSTANDALONE_COMMENT
WHITESPACEcontainer_offirst_leaf_ofpreceding_leafsyms)token)LeafNode>   z
# fmt: offz# yapf: disablez	# fmt:offFMT_OFFz# fmt: skipz
# fmt:skipFMT_SKIPFMT_PASS>   z	# fmt: onz# fmt:onz# yapf: enableFMT_ONz !:#'c                   @   s2   e Zd ZU dZeed< eed< eed< eed< dS )ProtoCommenta  Describes a piece of syntax that is a comment.

    It's not a :class:`blib2to3.pytree.Leaf` so that:

    * it can be cached (`Leaf` objects should not be reused more than once as
      they store their lineno, column, prefix, and parent information);
    * `newlines` and `consumed` fields are kept separate from the `value`. This
      simplifies handling of special marker comments like ``# fmt: off/on``.
    typevaluenewlinesconsumedN)__name__
__module____qualname____doc__int__annotations__str r%   r%   Q/var/www/html/llm_bihealth/app/venv/lib/python3.9/site-packages/black/comments.pyr   #   s
   

r   )leafreturnc                 c   s:   t | j| jtjkdD ]}t|j|jd|j dV  qdS )a  Clean the prefix of the `leaf` and generate comments from it, if any.

    Comments in lib2to3 are shoved into the whitespace prefix.  This happens
    in `pgen2/driver.py:Driver.parse_tokens()`.  This was a brilliant implementation
    move because it does away with modifying the grammar to include all the
    possible places in which comments can be placed.

    The sad consequence for us though is that comments don't "belong" anywhere.
    This is why this function generates simple parentless Leaf objects for
    comments.  We simply don't know what the correct parent should be.

    No matter though, we can live without this.  We really only need to
    differentiate between inline and standalone comments.  The latter don't
    share the line with any code.

    Inline comments are emitted as regular token.COMMENT leaves.  Standalone
    are emitted with a fake STANDALONE_COMMENT token identifier.
    is_endmarker
)prefixN)list_commentsr,   r   r   	ENDMARKERr   r   r   )r'   Zpcr%   r%   r&   generate_comments5   s    r/   i   )maxsize)r,   r*   r(   c          
   	   C   s   g }| rd| vr|S d}d}d}t td| D ]\}}|t|d 7 }| }|s\|d7 }|dsz|dr0|d7 }q0||kr|stj}nt	}t
|}	|t||	||d d}q0|S )zNReturn a list of :class:`ProtoComment` objects parsed from the given `prefix`.#r   z?
   \)r   r   r   r   )	enumerateresplitlenlstrip
startswithendswithr   COMMENTr   make_commentappendr   )
r,   r*   resultr   nlinesZignored_linesindexlineZcomment_typecommentr%   r%   r&   r-   L   s4    

r-   )contentr(   c                 C   sz   |   } | sdS | d dkr(| dd } d}| rZ| d |krZ|  dsZd| dd  } | rr| d tvrrd|  } d|  S )a  Return a consistently formatted comment from the given `content` string.

    All comments (except for "##", "#!", "#:", '#'") should have a single
    space between the hash sign and the content.

    If `content` didn't start with a hash sign, one is provided.
    r1   r   r2   N    ztype: )rstripr8   r9   COMMENT_EXCEPTIONS)rC   ZNON_BREAKING_SPACEr%   r%   r&   r<   q   s     
r<   )noder(   c                 C   s   d}|rt | }qdS )zJConvert content between `# fmt: off`/`# fmt: on` into standalone comments.TN)convert_one_fmt_off_pair)rH   Z	try_againr%   r%   r&   normalize_fmt_off   s    rJ   c                 C   s  |   D ]}d}t|jddD ]}|jtvr8|j}q |jtv r|jtkrt|}|r|jt	v rn|jt
vrnq |jtv r|jt
v rq tt||}|sq |d }|j}|j}|jt	v r||jd |_|jtv rd|_|}	n|d| d|j  }	ddd |D }
|jt	v r |jd |
 }
|jtv r:|
d	|j 7 }
|
drR|
dd
 }
d}|D ]}| }|du rZ|}qZ|dusJ d|dusJ d||tt|
|	t|d   dS qdS )zConvert content of a single `# fmt: off`/`# fmt: on` into a standalone comment.

    Returns True if a pair was converted.
    r   Fr)   N r+   c                 s   s   | ]}t |V  qd S )N)r$   ).0nr%   r%   r&   	<genexpr>       z+convert_one_fmt_off_pair.<locals>.<genexpr>z  z(INTERNAL ERROR: fmt: on/off handling (1)z(INTERNAL ERROR: fmt: on/off handling (2))r,   Zfmt_pass_converted_first_leafT)Zleavesr-   r,   r   r   r   r   r   r   r   r   r   listgenerate_ignored_nodesparentr   joinr:   removeZinsert_childr   r   )rH   r'   Zprevious_consumedrB   prevignored_nodesfirstrS   r,   Zstandalone_comment_prefixZhidden_valueZ	first_idxZignoredr@   r%   r%   r&   rI      sf    



	
rI   )r'   rB   r(   c                 c   s  |j tv rt| |E dH  dS t| }|dur|jtjkrt|rFdS t|rt	|j
D ]z\}}t|trt|r|jtv r|V   dS |jtjkr|t|j
d k rt|j
|d  r dS t|r dS |V  qXq&|jtjkr|jdu rdS |V  |j}q&dS )zStarting from the container of `leaf`, generate all leaves until `# fmt: on`.

    If comment is skip, returns leaf only.
    Stops at the end of the block.
    Nr2   )r   r   %_generate_ignored_nodes_from_fmt_skipr   r   r   r.   	is_fmt_onchildren_contains_fmt_onr4   children
isinstancer   r   INDENTr7   DEDENTZnext_sibling)r'   rB   	containerr@   childr%   r%   r&   rR      s6    



rR   c           	      c   s$  | j }| j}t| jdd}|r.|j|d jkr2dS |durzd| _|g}d|jvrn|j durn|j }|d| qF|E dH  n|dur |jtjkr | jt	j
kr d| _g }|j }|dur|jtjkr|d| |j }q|j}|dur|j dur|j jt	jkr|d|j  t|E dH  dS )zLGenerate all leaves that should be ignored by the `# fmt: skip` from `leaf`.Fr)   r   NrK   r+   )prev_siblingrS   r-   r,   r   insertr   r   Zsuiter   NEWLINEASYNCiter)	r'   rB   rb   rS   commentsZsiblingsrW   Zparent_siblingZgrandparentr%   r%   r&   rY     sB    

rY   )r`   r(   c                 C   s:   d}t | jddD ]"}|jtv r&d}q|jtv rd}q|S )zDetermine whether formatting is switched on within a container.
    Determined by whether the last `# fmt:` comment is `on` or `off`.
    Fr)   T)r-   r,   r   r   r   )r`   Zfmt_onrB   r%   r%   r&   rZ   -  s    

rZ   c                 C   s.   | j D ]"}t|}|durt|r dS qdS )z2Determine if children have formatting switched on.NTF)r\   r   rZ   )r`   ra   r'   r%   r%   r&   r[   :  s
    
r[   )comment_listr(   c                 C   s    | D ]}|j dr dS qdS )z
    Returns:
        True iff one of the comments in @comment_list is a pragma used by one
        of the more common static analysis tools for python (e.g. mypy, flake8,
        pylint).
    )z# type:z# noqaz	# pylint:TF)r   r9   )rh   rB   r%   r%   r&   contains_pragma_commentD  s    ri   )/r5   sysZdataclassesr   	functoolsr   typingr   r   r   r   version_infor
   Ztyping_extensionsZblack.nodesr   r   r   r   r   r   r   Zblib2to3.pgen2r   Zblib2to3.pytreer   r   LNr   r#   r   r   r   rG   r   r/   r$   boolr-   r<   rJ   rI   rR   rY   rZ   r[   ri   r%   r%   r%   r&   <module>   s>   

$	$D.*
