a
    
dqb                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 G dd	 d	eZd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZeddhZeh d Zeh d!Zd"d# Zd$S )%aQ  LogicalLine primitive for formatting.

A logical line is the containing data structure produced by the parser. It
collects all nodes (stored in FormatToken objects) that could appear on a single
line if there were no line length restrictions. It's then used by the parser to
perform the wrapping required to comply with the style guide.
    )syms)pytree_utils)split_penalty)format_token)style)subtypesc                   @   s   e Zd ZdZd"ddZdd Zdd Zd	d
 Zedd Z	edd Z
d#ddZdd Zdd Zedd Zedd Zedd Zedd Zedd Zed d! ZdS )$LogicalLinea  Represents a single logical line in the output.

  Attributes:
    depth: indentation depth of this line. This is just a numeric value used to
      distinguish lines that are more deeply nested than others. It is not the
      actual amount of spaces, which is style-dependent.
  Nc                 C   sT   || _ |pg | _d| _| jrPt| jdd D ] \}}| j| |_|| j| _q.dS )a>  Constructor.

    Creates a new logical line with the given depth an initial list of tokens.
    Constructs the doubly-linked lists for format tokens using their built-in
    next_token and previous_token attributes.

    Arguments:
      depth: indentation depth of this line
      tokens: initial list of tokens
    F   N)depth_tokensdisable	enumerateprevious_token
next_token)selfr
   tokensindextok r   b/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/yapf/yapflib/logical_line.py__init__(   s    
zLogicalLine.__init__c                 C   s   d| j _t| j j| j _| j }| j j}| jdd D ]}|jdkrVt||| jrVd|_|jsft|jnd}|j}t	|t
r|jsJ |d}|| | |_| jt||7  _t|||_|jpt|||_|j}|}q4dS )z<Calculate the split penalty and total length for the tokens.r	   Nr   )firstspaces_required_beforelenvaluetotal_lengthr   _SpaceRequiredBetweenr   	is_pseudo
isinstancelist
is_commentr   _SplitPenalty_MustBreakBeforemust_break_before_CanBreakBeforeZcan_break_before)r   
prev_tokenZprev_lengthtokenZtok_lenr   r   r   r   CalculateFormattingInformation>   s*    

z*LogicalLine.CalculateFormattingInformationc                 C   s   | j r| jr| gS g }t| j}| jD ].}|jdkrJ|| t| j}q&|| q&|jrf|| |D ]}d|j	_
d|j_qj|S )zSplit the line at semicolons.;N)has_semicolonr   r   r
   r   r   appendAppendTokenr   r   r   lastr   )r   ZllinesZlliner   r   r   r   Splitg   s    





zLogicalLine.Splitc                 C   s&   | j r| j|_|| j_| j | dS )z>Append a new FormatToken to the tokens contained in this line.N)r   r,   r   r   r*   )r   r&   r   r   r   r+      s    zLogicalLine.AppendTokenc                 C   s
   | j d S )z'Returns the first non-whitespace token.r   r   r   r   r   r   r      s    zLogicalLine.firstc                 C   s
   | j d S )z&Returns the last non-whitespace token.r.   r/   r   r   r   r,      s    zLogicalLine.last   c                 C   s,   d| | j  }ddd | jD }|| S )a  Return a "code" representation of this line.

    The code representation shows how the line would be printed out as code.

    TODO(eliben): for now this is rudimentary for debugging - once we add
    formatting capabilities, this method will have other uses (not all tokens
    have spaces around them, for example).

    Arguments:
      indent_per_depth: how much spaces to indent per depth level.

    Returns:
      A string representing the line as code.
     c                 s   s   | ]}|j V  qd S Nr   .0r   r   r   r   	<genexpr>       z%LogicalLine.AsCode.<locals>.<genexpr>)r
   joinr   )r   Zindent_per_depthindentZ
tokens_strr   r   r   AsCode   s    zLogicalLine.AsCodec                 C   s   |   S r3   )r;   r/   r   r   r   __str__   s    zLogicalLine.__str__c                 C   s$   d dd | jD }d| j|S )N,c                 s   s   | ]}d  |j|jV  qdS )z
{0}({1!r})N)formatnamer   r5   r   r   r   r7      s   z'LogicalLine.__repr__.<locals>.<genexpr>z$LogicalLine(depth={0}, tokens=[{1}]))r9   r   r>   r
   )r   Ztokens_reprr   r   r   __repr__   s    
zLogicalLine.__repr__c                 C   s   | j S )zAccess the tokens contained within this line.

    The caller must not modify the tokens list returned by this method.

    Returns:
      List of tokens in this line.
    r.   r/   r   r   r   r      s    	zLogicalLine.tokensc                 C   s   | j jS )z~Return the line number of this logical line.

    Returns:
      The line number of the first token in this logical line.
    )r   linenor/   r   r   r   rA      s    zLogicalLine.linenoc                 C   s   | j j| j jfS )zgThe start of the logical line.

    Returns:
      A tuple of the starting line number and column.
    )r   rA   columnr/   r   r   r   start   s    zLogicalLine.startc                 C   s   | j j| j jt| j j fS )zcThe end of the logical line.

    Returns:
      A tuple of the ending line number and column.
    )r,   rA   rB   r   r   r/   r   r   r   end   s    zLogicalLine.endc                 C   s   | j jS r3   )r   r    r/   r   r   r   r       s    zLogicalLine.is_commentc                 C   s   t dd | jD S )Nc                 s   s   | ]}|j d kV  qdS )r(   Nr4   r5   r   r   r   r7      r8   z,LogicalLine.has_semicolon.<locals>.<genexpr>)anyr   r/   r   r   r   r)      s    zLogicalLine.has_semicolon)N)r1   )__name__
__module____qualname____doc__r   r'   r-   r+   propertyr   r,   r;   r<   r@   r   rA   rC   rD   r    r)   r   r   r   r   r      s0   
)









r   c                 C   s   | j p| jp| jp| jS r3   )
is_keywordis_name	is_number	is_stringr   r   r   r   _IsIdNumberStringToken   s    rP   c                 C   s   t j| j v S r3   )r   UNARY_OPERATORrO   r   r   r   _IsUnaryOperator   s    rR   c                 C   sD   | j }|jj}|dur@t|}|dv r,dS |dkr8dS |j}qdS )z=Whether a binary operation has precedence within its context.N)Z
arith_exprZtermTZatomF)nodeparentr   ZNodeName)r   rS   ZancestorZpredecessor_typer   r   r   _HasPrecedence   s    
rU   c                 C   s   | j r| jsdS t| S )z>Whether to remove spaces around an operator due to precedence.F)Zis_arithmetic_opZis_simple_exprrU   rO   r   r   r   _PriorityIndicatingNoSpace  s    rV   c                 C   s   | j s| jo|jS r3   )rM   rL   Zis_subscript_colon)Ztoken1Ztoken2r   r   r   _IsSubscriptColonAndValuePair  s    rW   c                 C   s  | j }|j }| jr.t|r.| jr.t| jr.dS | js:|jrJ|  rFdS dS | jsV|jrZdS |jtjv rjdS t| r~t|r~dS |dkr|dkrdS t	
dr|  r|dkrdS | r|dkrdS t	
drt| |st|| rdS |dv rdS |dkr|dv rt	
d	S |dkrdS |d
kr6|dkr6dS |dkrN|dkrNdS |dkrt|dv rttj| jvrtdS |dkr|dv rdS |js|jr| js| jrdS tj| jv stj|jv rdS tj| jv stj|jv rdS | jrP|dkrtj|jv rdS |dvr*|js*dS | r>t	
dS tj|jv rPdS | jrp|dkrpt|rpdS | jrt|rdS t| rt|rdS | js|jr|dks|dkrt	
dS t	
d}||v s||v rdS t	
drt| st|rdS dS ndS t| rN|dkrN|jsJ|jsJ|dkrNdS tj| jv rttj|jvrtt	
dS tj|jv rtj| jvrt	
dS tj| jv stj|jv rdS tj| jv stj| jv rdS |dkrtj| jv rdS | jr|dkr|dvS |dkr*|jr*|dvS |dks>|dkrBdS |dkrV|dks~|dkrj|dks~|dkr|dkrdS |sb|  s| rbt	ddr|dkrt| dd s|dkrt|dd rdS t	d!dr |dkrt| dd s|dkr t|dd r dS t	d"drb|dkrFt| dd s^|dkrbt|dd rbdS |  r| rt	
dS |  r| rt	
dS |  r|d#v rdS |  rt|rt	
dS | jr|d#v rdS | rt	
dS |d$kr|dkrdS |  r4t|r4t	
dS |  rdtj|jv sZtj|jv rdt	
dS |d%krrdS |dkr|d&krt	
dS dS )'zDReturn True if a space is required between the left and right token.TFr=   :ZSPACE_INSIDE_BRACKETSZSPACES_AROUND_SUBSCRIPT_COLONz:,z]})Z.SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKETfrom.import=>   z,,,rZ   >   z...rZ   z[)]}.**ZSPACES_AROUND_POWER_OPERATORZ*NO_SPACES_AROUND_SELECTED_BINARY_OPERATORSZ ARITHMETIC_PRECEDENCE_INDICATIONnot(Z%SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN@>   printNone)[]{}ZSPACES_AROUND_DICT_DELIMITERS)
is_openingZSPACES_AROUND_LIST_DELIMITERSZSPACES_AROUND_TUPLE_DELIMITERSz([ra   r(   await) r   r   rP   r   
OpensScopeZis_continuationr?   r   ZNONSEMANTIC_TOKENSr   GetClosesScoperW   r   DEFAULT_OR_NAMED_ASSIGNrK   rL   ZSUBSCRIPT_COLONZ
TYPED_NAMErN   Z DEFAULT_OR_NAMED_ASSIGN_ARG_LISTZis_binary_opZSUBSCRIPT_BRACKETrR   rV   rM   ZVARARGS_LISTVARARGS_STARKWARGS_STAR_STARZ	DECORATORZGetOrDefault_IsDictListTupleDelimiterTok)leftrightZis_line_disabledZlvalrvalZ
block_listr   r   r   r     sn   


















(















r   c                 C   s<   | j s| jr| jr| jj rdS |jr6| jr6t|r6dS |jS )zAReturn True if a line break is required before the current token.T)r    r   r   rN   IsSurroundedByBracketsr#   )r%   	cur_tokenr   r   r   r"     s    r"   c                 C   s   | j }|j }|dkr |dkr dS |dv r4|dv r4dS |jtjkrDdS |dkrPdS |dkr\dS |dkrhdS | jrz|d	krzdS | jr|d
krdS |jr| j|jkrdS tj| jv rdS t	dstj
|jv stj
| jv rdS dS )z?Return True if a line break may occur before the current token.yieldrY   F>   ri   async>   forwithdefr`   rX   r=   r_   rd   Z+ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNST)r   r   UNBREAKABLErL   r    rA   r   rQ   r   rk   rm   r%   ru   Zpvalcvalr   r   r   r$     s8    

r$   c                 C   s   d}d}d}| j }|r|jdkr*|d8 }n&|jdkr>|d8 }n|jdkrP|d8 }|jdkrp|dkrf|S |d7 }n>|jdkr|dkr|S |d7 }n|jdkr|dkr|S |d7 }|j }qd	S )
z3Return True if the token is surrounded by brackets.r   rc   r	   rg   re   r_   rf   rd   N)r   r   )r   Zparen_countZbrace_countZsq_bracket_countr   r   r   r   rt     s2    









rt   c                 C   st   | sJ | j d u rdS |r&| }| j }n
| j }| }|j|kr>dS |jjsJJ |jjjsXJ |jjjjtjtjtjfv S )NF)	Zmatching_bracketr   rS   rT   typepython_symbolsZdictsetmakerZ	listmakerZtestlist_gexp)r   rh   Zopen_tokZ	close_tokr   r   r   rp   >  s"    


rp   andor>   &|^>   -*z//%/r`   +c                 C   s  | j }|j }|dkrtjS |jdkr*|jS tdrT|tv rFtdS |tv rrdS n|tv r`dS |tv rrtdS tdr|tv rtdS |tv rdS n|tv rdS |tv rtdS tj	|jv stj
|jv rdS tj| jv rtdS |dkrdS |d	ks|d	krtjS tj| jv s.tj| jv r4tjS |  rR|d
krRtdS |dkrbtjS |dkrrtjS tj| jv stj|jv rtjS |dkrtjS | rdS dS )zBReturn the penalty for breaking the line before the current token.r^   r   ZSPLIT_BEFORE_LOGICAL_OPERATORZSPLIT_PENALTY_LOGICAL_OPERATORZSPLIT_BEFORE_BITWISE_OPERATORZSPLIT_PENALTY_BITWISE_OPERATORZ"SPLIT_PENALTY_AFTER_UNARY_OPERATORr=   r]   r_   Z#SPLIT_PENALTY_AFTER_OPENING_BRACKETrX   r\   z==d   )r   r   r{   Znode_split_penaltyr   rk   _LOGICAL_OPERATORS_BITWISE_OPERATORSr   ZCOMP_FORZCOMP_IFrQ   ZSTRONGLY_CONNECTEDrn   ro   rj   rm   rl   r|   r   r   r   r!   ^  sj    















r!   N)rI   Z%yapf_third_party._ylib2to3.fixer_utilr   r   Zyapf.pytreer   r   Zyapf.yapflibr   r   r   objectr   rP   rR   rU   rV   rW   r   r"   r$   rt   rp   	frozensetr   r   Z_ARITHMETIC_OPERATORSr!   r   r   r   r   <module>   s.    H T(