
    ?db                         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 ddl	m
Z  G d	 d
e      Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z eddh      Z eh d      Z eh d      Zd Zy)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.
    )pytree_utils)split_penalty)format_token)	py3compat)style)subtypes)symsc                       e Zd ZdZddZd Zd Zd Zed        Z	ed        Z
dd	Zd
 Zd Zed        Zed        Zed        Zed        Zed        Zed        Zy)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                     || _         |xs g | _        d| _        | j                  rIt        | j                  dd       D ]-  \  }}| j                  |   |_        || j                  |   _        / yy)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toks        ;/usr/lib/python3/dist-packages/yapf/yapflib/logical_line.py__init__zLogicalLine.__init__)   sn     DJ<RDLDL||!$,,qr"23 -*%!\\%0),U&-     c                    d| j                   _        t        | j                   j                        | j                   _        | j                   }| j                   j                  }| j
                  dd D ]  }|j                  dk(  rt        ||| j                        rd|_        |j                  st        |j                        nd}|j                  }t        |t              r|j                  sJ |       d}||z   |z   |_        |xj                  t        ||      z  c_        t        ||      |_        |j                  xs t!        ||      |_        |j                  }|} y)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_CanBreakBeforecan_break_before)r   
prev_tokenprev_lengthtokentok_lenr   s         r   CalculateFormattingInformationz*LogicalLine.CalculateFormattingInformation?   s7   
 )*DJJ%!$**"2"23DJJJ**))Kab! 

&
&!
+

E4<<
@'($(-EKK Qg$;;	*D	1&& "#&03IIe ]:u== 0U Ce

!
!
G_Z%G  &&kj;r   c                    | j                   r| j                  r| gS g }t        | j                        }| j                  D ]I  }|j
                  dk(  r'|j                  |       t        | j                        }9|j                  |       K |j                  r|j                  |       |D ]$  }d|j                  _
        d|j                  _        & |S )zSplit the line at semicolons.;N)has_semicolonr   r   r   r   r   appendAppendTokenr   r   r   lastr   )r   llineslliner   s       r   SplitzLogicalLine.Splith   s    VmF

#E|| 	c	eDJJ'# ||mmE ##'ekk "ejj# Mr   c                     | j                   r"| j                  |_        || j                  _        | j                   j	                  |       y)z>Append a new FormatToken to the tokens contained in this line.N)r   r5   r   r   r3   )r   r-   s     r   r4   zLogicalLine.AppendToken   s3    ||!YYe"diiLLr   c                      | j                   d   S )z'Returns the first non-whitespace token.r   r   r   s    r   r   zLogicalLine.first   s     <<?r   c                      | j                   d   S )z&Returns the last non-whitespace token.r;   r<   s    r   r5   zLogicalLine.last   s     <<r   c                 t    d|z  | j                   z  }dj                  d | j                  D              }||z   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              3   4   K   | ]  }|j                     y wNr   .0r   s     r   	<genexpr>z%LogicalLine.AsCode.<locals>.<genexpr>   s     <#))<s   )r   joinr   )r   indent_per_depthindent
tokens_strs       r   AsCodezLogicalLine.AsCode   s;     ##djj0F<t||<<JJr   c                 "    | j                         S rB   )rK   r<   s    r   __str__zLogicalLine.__str__   s    ;;=r   c                 ~    dj                  d | j                  D              }dj                  | j                  |      S )N,c              3   h   K   | ]*  }d j                  |j                  |j                         , yw)z
{0}({1!r})N)formatnamer   rD   s     r   rF   z'LogicalLine.__repr__.<locals>.<genexpr>   s,      J58CHHcii0Js   02z$LogicalLine(depth={0}, tokens=[{1}]))rG   r   rQ   r   )r   tokens_reprs     r   __repr__zLogicalLine.__repr__   s@    (( J<@LLJ JK188

K! !r   c                     | 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<   s    r   r   zLogicalLine.tokens   s     <<r   c                 .    | 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<   s    r   rW   zLogicalLine.lineno   s     ::r   c                 Z    | j                   j                  | j                   j                  fS )zgThe start of the logical line.

    Returns:
      A tuple of the starting line number and column.
    )r   rW   columnr<   s    r   startzLogicalLine.start   s#     JJtzz0011r   c                     | j                   j                  | j                   j                  t        | j                   j                        z   fS )zcThe end of the logical line.

    Returns:
      A tuple of the ending line number and column.
    )r5   rW   rY   r   r   r<   s    r   endzLogicalLine.end   s5     IIdii..TYY__1EEFFr   c                 .    | j                   j                  S rB   )r   r%   r<   s    r   r%   zLogicalLine.is_comment   s    ::   r   c                 :    t        d | j                  D              S )Nc              3   :   K   | ]  }|j                   d k(    yw)r1   NrC   rD   s     r   rF   z,LogicalLine.has_semicolon.<locals>.<genexpr>   s     8CsyyC8s   )anyr   r<   s    r   r2   zLogicalLine.has_semicolon   s    84<<888r   rB   )   )__name__
__module____qualname____doc__r   r/   r8   r4   propertyr   r5   rK   rM   rT   r   rW   rZ   r\   r%   r2    r   r   r   r       s    -,'R6    &!     2 2 G G ! ! 9 9r   r   c                 n    | j                   xs( | j                  xs | j                  xs | j                  S rB   )
is_keywordis_name	is_number	is_stringr   s    r   _IsIdNumberStringTokenrn      s'    		H3;;	H#--	H3==Hr   c                 :    t         j                  | j                   v S rB   )r   UNARY_OPERATORrm   s    r   _IsUnaryOperatorrq      s    		 	 CLL	00r   c                     | j                   }|j                  j                  }|0t        j                  |      }|dv ry|dk7  ry|j                  }|/yy)z=Whether a binary operation has precedence within its context.N)
arith_exprtermTatomF)nodeparentr   NodeName)r   rv   ancestorpredecessor_types       r   _HasPrecedencer{      sc    	$ [[( $,,X611 6!  H 	r   c                 J    | j                   r| j                  syt        |       S )z>Whether to remove spaces around an operator due to precedence.F)is_arithmetic_opis_simple_exprr{   rm   s    r   _PriorityIndicatingNoSpacer   	  s!    			S%7%7		r   c                 R    | j                   xs | j                  xr |j                  S rB   )rk   rj   is_subscript_colon)token1token2s     r   _IsSubscriptColonAndValuePairr     s"    



,fnn	K&2K2KKr   c                    | j                   }|j                   }| j                  r-t        |      r"| j                  rt        | j                        ry| j                  s|j                  r| j	                         ryy| j
                  s|j
                  ry|j                  t        j                  v ryt        |       rt        |      ry|dk(  r|dk(  ryt        j                  d      r,| j	                         r|dk(  ry|j                         r|dk(  ryt        j                  d      rt        | |      st        ||       ry|dv ry|dk(  r|dv rt        j                  d	      S |dk(  ry|d
k(  r|dk(  ry|dk(  r|dk(  ry|dk(  r!|dv rt        j                  | j                  vry|dk(  r|dv ry|j                  s|j                   r| j                  s| j                   ryt        j"                  | j                  v st        j"                  |j                  v ryt        j$                  | j                  v st        j$                  |j                  v ry| j&                  ru|dk(  rt        j(                  |j                  v ry|dvr|j*                  sy|j                         rt        j                  d      S t        j,                  |j                  v ry| j*                  r|dk7  rt/        |      ry| j                  rt/        |      ryt/        |       rt/        |      ry| j*                  s|j*                  rk|dk(  s|dk(  rt        j                  d      S t        j                  d      }||v s||v ryt        j                  d      rt1        |       st1        |      ryyyt/        |       r#|dk7  r|j                   s|j2                  s|dk(  ryt        j                  | j                  v r1t        j$                  |j                  vrt        j                  d      S t        j                  |j                  v r1t        j$                  | j                  vrt        j                  d      S t        j4                  | j                  v st        j4                  |j                  v ryt        j6                  | j                  v st        j8                  | j                  v ry|dk(  rt        j:                  | j                  v ry| j                  r	|dk(  r|dvS |dk(  r|j                  r|dvS |dk(  s|dk(  ry|dk(  r|dk(  s|dk(  r|dk(  s
|dk(  r|dk(  ry|s| j	                         s|j                         rt        j<                  dd      r%|dk(  rt?        | d       s|dk(  rt?        |d       ryt        j<                  d!d      r%|dk(  rt?        | d       s|dk(  rt?        |d       ryt        j<                  d"d      r%|dk(  rt?        | d       s|dk(  rt?        |d       ry| j	                         r%|j	                         rt        j                  d      S | j                         r%|j                         rt        j                  d      S | j                         r|d#v ry| j	                         r t        |      rt        j                  d      S | j                   r|d#v ry|j                         rt        j                  d      S |d$k(  r|dk(  ry| j	                         r t/        |      rt        j                  d      S | j	                         rMt        j6                  |j                  v st        j8                  |j                  v rt        j                  d      S |d%k(  ry|dk(  r|d&k(  rt        j                  d      S y)'zDReturn True if a space is required between the left and right token.TFrO   :SPACE_INSIDE_BRACKETSSPACES_AROUND_SUBSCRIPT_COLONz:,z]}).SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKETfrom.import=>   ,,,r   >   ...r   z[)]}.**SPACES_AROUND_POWER_OPERATOR*NO_SPACES_AROUND_SELECTED_BINARY_OPERATORS ARITHMETIC_PRECEDENCE_INDICATIONnot(%SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN@>   Noneprint)[]{}SPACES_AROUND_DICT_DELIMITERS)
is_openingSPACES_AROUND_LIST_DELIMITERSSPACES_AROUND_TUPLE_DELIMITERSz([r   r1   await) r   r"   rn   r   
OpensScopeis_continuationrR   r   NONSEMANTIC_TOKENSr   GetClosesScoper   r   DEFAULT_OR_NAMED_ASSIGNri   rj   SUBSCRIPT_COLON
TYPED_NAMErl    DEFAULT_OR_NAMED_ASSIGN_ARG_LISTis_binary_opSUBSCRIPT_BRACKETrq   r   rk   VARARGS_LISTVARARGS_STARKWARGS_STAR_STAR	DECORATORGetOrDefault_IsDictListTupleDelimiterTok)leftrightis_line_disabledlvalrval
block_lists         r   r!   r!     s   	$	$
nn/6
4T5H5HI	^^u	U22
ZZ<222D!&<U&C	S[TS[
YY&'TS[ts{ii/0$T51$UD1	T\	S[TU]99EFF	S[	V^	S[TX%
ckdl*&&dmm;	S[T\)5==$,,$--/%..0T]]*U^^+	^^11U^^C 75#5#5  YY.//!!U^^3	44<,<U,C	__)%0d 0 7	%,,t|tt|YY566GHJzTZ/yy34	#D	)-G-Nt}}43; &&$--7/99<==&&%..8.99<==t}},u~~-t}},4==0	S[X''4==8	__(((	S[U%%(((	S[DCKs{ts{s{ts{	t0E4E4E4G:EB	5dtL		%e	>:EB	5dtL		%e	>;UC	5dtL		%e	>	__5++- 99,--	E--/ 99,--	DDL 	__1%8 99,--	\\ddl
 99,--	W_	__+E2 99,--
ooX22ennD%66%..H 99,--	S[	S[TW_ 99,--	r   c                     | j                   s.| j                  r#| j                  r| j                  j                   ry|j                  r| j                  rt	        |      ry|j
                  S )zAReturn True if a line break is required before the current token.T)r%   r   r"   rl   IsSurroundedByBracketsr(   )r+   	cur_tokens     r   r'   r'     sX    z88)33)88CCj22Y' 		$	$$r   c                 F   | j                   }|j                   }t        j                  r|dk(  r|dk(  ry|dv r|dv ry|j                  t        j                  k\  ry|dk(  ry|dk(  ry|dk(  ry| j
                  r|d	k(  ry| j
                  r|d
k(  ry|j                  r| j                  |j                  k(  ryt        j                  | j                  v ryt        j                  d      s9t        j                  |j                  v st        j                  | j                  v ryy)z?Return True if a line break may occur before the current token.yieldr   F>   asyncr   >   defforwithr   r   rO   r   r   +ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNST)r   r   PY3r   UNBREAKABLErj   r%   rW   r   rp   r   r   r   r+   r   pvalcvals       r   r)   r)     s   			$	$]]w46>!!d.D&D 9 99	S[	S[	S[DCKDCKj//93C3CC
 3 33	@	A((I,>,>>((J,?,??	r   c                 l   d}d}d}| j                   }|r|j                  dk(  r|dz  }n)|j                  dk(  r|dz  }n|j                  dk(  r|dz  }|j                  dk(  r|dk(  r|S |dz  }n7|j                  dk(  r|dk(  r|S |dz  }n|j                  dk(  r|dk(  r|S |dz  }|j                   }|ry	)
z3Return True if the token is surrounded by brackets.r   r   r   r   r   r   r   r   N)r   r   )r   paren_countbrace_countsq_bracket_countr   s        r   r   r   !  s    ++%%.s"Qk				$Qk				$!s"		Qk				$		Qk				$	Q	!#22N+ 	, 
r   c                    | sJ | j                   y|r| }| j                   }n| j                   }| }|j                  |k(  ry|j                  j                  sJ |j                  j                  j                  sJ |j                  j                  j                  j                  t
        j                  t
        j                  t
        j                  fv S )NF)	matching_bracketr   rv   rw   typepython_symbolsdictsetmaker	listmakertestlist_gexp)r   r   open_tok	close_toks       r   r   r   @  s    	*!H$$I##HI I%				!	!!	!				!	!	(	((	(				!	!	(	(	-	-!!""2 
 r   andor>   &^|>   //*%+-/r   c                 @   | j                   }|j                   }|dk(  rt        j                  S |j                  dkD  r|j                  S t	        j
                  d      r&|t        v rt	        j
                  d      S |t        v r'y|t        v ry|t        v rt	        j
                  d      S t	        j
                  d      r&|t        v rt	        j
                  d      S |t        v r'y|t        v ry|t        v rt	        j
                  d      S t        j                  |j                  v st        j                  |j                  v ryt        j                  | j                  v rt	        j
                  d      S |dk(  ry|d	k(  s|d	k(  rt        j                  S t        j                  | j                  v st        j                  | j                  v rt        j                  S | j                         r|d
k7  rt	        j
                  d      S |dk(  rt        j                  S |dk(  rt        j                  S t        j                   | j                  v st        j                   |j                  v rt        j                  S |dk(  rt        j                  S |j#                         ryy)zBReturn the penalty for breaking the line before the current token.r   r   SPLIT_BEFORE_LOGICAL_OPERATORSPLIT_PENALTY_LOGICAL_OPERATORSPLIT_BEFORE_BITWISE_OPERATORSPLIT_PENALTY_BITWISE_OPERATOR"SPLIT_PENALTY_AFTER_UNARY_OPERATORrO   r   r   #SPLIT_PENALTY_AFTER_OPENING_BRACKETr   r   z==d   )r   r   r   node_split_penaltyr   r   _LOGICAL_OPERATORS_BITWISE_OPERATORSr   COMP_FORCOMP_IFrp   STRONGLY_CONNECTEDr   r   r   r   r   r   s       r   r&   r&   `  s<   			$	$	U]$$$!!A%'''
YY./!!YY788!! !!!!YY788
YY./!!YY788!! !!!!YY7889---),,,
 3 33999::	S[	T\TT\+++z222:#6#66$$$99:;;	S[$$$	S[$$$&&**=*==&&)*<*<<$$$	T\+++	
r   N)re   yapf.pytreer   r   yapf.yapflibr   r   r   r   lib2to3.fixer_utilr	   r   objectr   rn   rq   r{   r   r   r!   r'   r)   r   r   	frozensetr   r   _ARITHMETIC_OPERATORSr&   rg   r   r   <module>r      s    % % % "  ! 5D9& D9NI14LPf% &R>6 t}- / !"FG Gr   