
    ?d_                     @   d Z ddl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 d
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$d Z% G d  d!e	jL                        Z'd" Z(d# Z)d$ Z*d% Z+d& Z,d' Z-d( Z. e/h d)      Z0d* Z1d+ Z2d, Z3y)-z5Computation of split penalties before/between tokens.    N)pytree)token)pytree_utils)pytree_visitor)	py3compat)style)subtypesi@B i:  i  i  i  i  d   i  iL  i  i  ix  i  i  i  il  i  i4  i  i  ip  c                 6    t               j                  |        y)zCompute split penalties on tokens in the given parse tree.

  Arguments:
    tree: the top-level pytree node to annotate with penalties.
  N)_SplitPenaltyAssignerVisit)trees    ;/usr/lib/python3/dist-packages/yapf/pytree/split_penalty.pyComputeSplitPenaltiesr   7   s     %    c                       e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd 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"d! Z# e!h d"      Z$d# Z%d$ Z&d% Z'd& Z( xZ)S )'r   z~Assigns split penalties to tokens, based on parse tree structure.

  Split penalties are attached as annotations to tokens.
  c                 F    t        |d      st        t        |   |       y y )N	is_pseudo)hasattrsuperr   r   )selfnode	__class__s     r   r   z_SplitPenaltyAssigner.VisitF   s"    4%!4.t4 &r   c                     | j                  |       d }|j                  D ]N  }|rHt        |t        j                        r.|j
                  dk(  rt        |t        j                  d             |}P y )N,SPLIT_PENALTY_IMPORT_NAMES)	DefaultNodeVisitchildren
isinstancer   Leafvalue_SetSplitPenaltyr   Getr   r   
prev_childchilds       r   Visit_import_as_namesz+_SplitPenaltyAssigner.Visit_import_as_namesJ   s_    $J 
J<


c
!		*F GHj	r   c                     t        |j                  d          t        |j                        dkD  rt        |j                  d          t        |j                  d          | j                  |       y )N         )_SetUnbreakabler   lenr   r   r   s     r   Visit_classdefz$_SplitPenaltyAssigner.Visit_classdefT   sV     DMM!$%
4==AdmmA&'DMM"%&$r   c                 .   d}t        j                  |j                  |         dk(  r+|dz  }t        j                  |j                  |         dk(  r+t        |j                  |          d}|t	        |j                        k  rt        |j                  |   t        j                        r;|j                  |   j                  dk(  rn<|j                  |   j                  dk(  r|}|dz  }|t	        |j                        k  rt        |j                  |          | j                  |       |dkD  rct        t        j                  |j                  |dz
           d       t        |j                  |          t        |j                  |dz             y y )Nr)   simple_stmt:z->r   )r   NodeNamer   r-   r.   r   r   r    r!   r   r"   LastLeafNode_SetStronglyConnected)r   r   	colon_idx	arrow_idxs       r   Visit_funcdefz#_SplitPenaltyAssigner.Visit_funcdef`   sU   
 I


i 8
9]
J1ni 

i 8
9]
JDMM),-I
c$--(
(	DMM),fkk	:==#))S0
==#))T1)1ni c$--(
( DMM),-$1}

#
#DMM)a-$@
A1FdmmI./DMM)a-89	 r   c                    t        j                  d      }|sS|j                  D ]D  }|j                  t        j
                  k(  s!t        j                  d|j                        sBd} n |rt        |t               y t        |t               y )NALLOW_MULTILINE_LAMBDASz"pylint:.*disable=.*\bg-long-lambdaT)r   r#   r   typegrammar_tokenCOMMENTresearchr!   _SetExpressionPenaltySTRONGLY_CONNECTEDVERY_STRONGLY_CONNECTED)r   r   allow_multiline_lambdasr&   s       r   Visit_lambdefz#_SplitPenaltyAssigner.Visit_lambdefy   ss     $ii(AB"== %::...YY<ekkJ&*#	 D"45D"9:r   c                     | j                  |       t        |j                  d          t        j                  d      s/t        j                  d      st        |j                  d          y y y )Nr   INDENT_CLOSING_BRACKETSDEDENT_CLOSING_BRACKETSr3   )r   r-   r   r   r#   r7   r/   s     r   Visit_parametersz&_SplitPenaltyAssigner.Visit_parameters   sX    $ DMM!$%II/0II/0DMM"-. 1 1r   c                    |j                   d   j                  t        j                  k(  r| j	                  |       y | j                  |       t        j                  dt        |j                               D ]G  }|j                   |   }t        |t        j                        s-|j                  dk(  s=t        |       I |j                   D ]+  }t        j                  |      dk(  st!        |t"               - y )Nr   r)   r   atom)r   r=   r>   STARVisit_star_exprr   r   ranger.   r   r   r    r!   r-   r   r5   _IncreasePenalty	CONNECTEDr   r   indexr&   s       r   Visit_arglistz#_SplitPenaltyAssigner.Visit_arglist   s    }}Q 2 22 4 $C$67 mmE"e	E6;;	'EKK3,>
  +			u	%	/	*+r   c                    | j                  |       t        j                  dt        |j                        dz
        D ]  }|j                  |   }t        |t        j                        s-|j                  dk(  s=t        t        j                  |j                  |         t               t        t        j                  |j                  |dz            t                y )Nr)   =r   r   rO   r.   r   r   r   r    r!   r"   r   FirstLeafNodeNAMED_ASSIGNrR   s       r   Visit_argumentz$_SplitPenaltyAssigner.Visit_argument       $C$6$:; PmmE"e	E6;;	'EKK3,>&&t}}U';<l	L&&t}}UQY'?@,	PPr   c                    | j                  |       t        j                  dt        |j                        dz
        D ]  }|j                  |   }t        |t        j                        s-|j                  dk(  s=t        t        j                  |j                  |         t               t        t        j                  |j                  |dz            t                y )Nr)   r4   rW   rR   s       r   Visit_tnamez!_SplitPenaltyAssigner.Visit_tname   r[   r   c                    |j                   D ]  }| j                  |        t        |j                   d   d      rdnd}t        j                  |t        |j                               D ]  }t        |j                   |           y )Nr   r   r+   r)   )r   r   r   r   rO   r.   r-   )r   r   r&   startis        r   Visit_dotted_namez'_SplitPenaltyAssigner.Visit_dotted_name   sn     
jjq);7AQE__UC$67 (dmmA&'(r   c                     |j                   D ]<  }| j                  |       |j                  t        j                  k(  s2t        |       > y N)r   r   r=   r>   COLONr7   )r   r   r&   s      r   Visit_dictsetmakerz(_SplitPenaltyAssigner.Visit_dictsetmaker   s?      %
jj	}**	* 	e$%r   c                    |j                   d   j                  dk(  rat        j                  d      }t	        |j                   d   |rt
        nt               t	        |j                   d   |rt        nt
               nt        |j                         dk(  rt	        |j                   d   t
               nt        |j                         dk(  r{t        j                  |j                   d         }|dv rt        |j                   d          t        |j                   d   j                         dkD  r`t        j                  |j                   d   j                   d         dk(  r.t	        t        j                  |j                   d         d       nt	        t        j                  |j                   d         t               ni|j                   d   j                  t        j                  k(  rt        |j                   d   j                         dkD  rk|j!                  d	      s|j!                  d
      rHt        |j                   d   j                   d          t        |j                   d   j                   d          |j!                  d	      xr t        j                  d      xs( |j!                  d
      xr t        j                  d      }|r:t	        t        j"                  |j                   d   j                   d         d       n9t	        t        j                  |j                   d   j                   d         d       t%        |j                   d   t        j&                  j(                  t
               n|dvrt        j*                  t        j                  |      t        j&                  j,                        }|r@t.        j0                  |v r.t3        |t4               t3        |j                   d   t6               n&t        |j                   d   |j                   d          |dk(  rt        |j                   d          | j9                  |       y )Nr   .SPLIT_BEFORE_DOTr)   r+      >   argument
comparisoncomp_for_test_exprSPLIT_BEFORE_LOGICAL_OPERATORSPLIT_BEFORE_BITWISE_OPERATORr3   >   rL   termpowerarglistor_testand_testrj   rk   rs   )r   r!   r   r#   r"   rD   DOTTED_NAMEr.   r   r5   r7   rX   ONE_ELEMENT_ARGUMENTr=   r>   LSQBendswithr6   _RecAnnotate
AnnotationSPLIT_PENALTYGetNodeAnnotationSUBTYPEr	   SUBSCRIPT_BRACKETrP   	SUBSCRIPTrQ   r   )r   r   beforenamesplit_beforestypess         r   Visit_trailerz#_SplitPenaltyAssigner.Visit_trailer   sV   }}Q$yy+,ft}}Q'28.kKt}}Q'&,{2IK	T]]	q	 t}}Q')@A	T]]	q	 ""4==#34d	+	+dmmA./a ))*Q.!!$--"2";";A">?:M
<55dmmA6FG
K
((q)9:"$ MM!!!]%7%77a ))*Q.]]7#t}}W'=dmmA.77:;dmmA.77:; w/ D#BCEw/ D#BC 	 
''a(8(A(A!(DEqJ ((q)9)B)B1)EFK 	T]]2&(?(?(M(M,	.  
 //&&t,l.E.E.M.MOh00F:
4
+ 4==+Y
7
a 0$--2B
C		dmmB/0$r   c                 p   | j                  |       t        |j                        dkD  r?t        j                  |j                  d         dk(  rt        j
                  |j                  d         }|j                  dk7  r%t        |j                  d   j                  d          d}|t        |j                        dz
  k  r|dz   }|j                  |   }t        j                  |      dk7  rny|j                  |   }|j                  d   j                  dk7  rt        |j                  d          t        |j                  d          |}|t        |j                        dz
  k  r|j                  dd  D ]  }t        j                  |      dk7  r y |j                  d   j                  dv s:t        |j                        dkD  rPt        j                  |j                  d   t        j                  j                        }|r=t        j                  |v r+t        t        j
                  |j                  d                t        j                  |      }	|	j                  j                         j!                  d	      r|	j"                  }	t%        j&                  d
      r.t%        j&                  d      rEt        j                  |	j"                        }
|
j                  dk7  su|	j                  dk(  rt        |	       t)        |	t*               t        |j                  d           y )Nr)   trailerrg   r   r3   )z([r+   #rH   rI   r   ])r   r.   r   r   r5   rX   r!   r-   r7   r}   r{   r~   r	   r   r6   strip
startswithprev_siblingr   r#   r"   rD   )r   r   firstprev_trailer_idxcur_trailer_idxcur_trailerprev_trailerr   r   last_child_nodelasts              r   Visit_powerz!_SplitPenaltyAssigner.Visit_power  s   $ 	DMMQdmmA./9< ((q)9:e		a(11!45 s4==1A55*Q.mmO4  -:
 }}%56  $**c1
   5 5b 9
:k22156* s4==1A55* ==$ 6			w	'9	4			!		"	"d	*w 1$11q!<#:#:#B#BD&22f<!**7+;+;A+>?A )55g>/""((*55c:-::O))56))56,,_-I-IJDzzS  &&#-0 2IJ
   0 0 4
556r   c                 
   | j                  |       t        t        j                  |      d       d }|j                  D ]B  }|r<|j
                  t        j                  k(  rt        t        j                  |      d       |}D y )Nr   )r   r"   r   rX   r   r=   r>   COMMAr$   s       r   Visit_subscriptlistz)_SplitPenaltyAssigner.Visit_subscriptlistY  sk    $\//5q9J 	
=+>+>>33E:A>jr   c                 J    t        |j                    | j                  |       y rc   )r7   r   r   r/   s     r   Visit_subscriptz%_SplitPenaltyAssigner.Visit_subscriptc  s    4==)$r   c                     t        t        j                  |      d       t        |j                  dd    | j                  |       y )Nr   r)   )r"   r   rX   r7   r   r   r/   s     r   Visit_comp_forz$_SplitPenaltyAssigner.Visit_comp_forh  s8    \//5q94==,-$r   c                 &    | j                  |       y rc   )r   r/   s     r   Visit_old_comp_forz(_SplitPenaltyAssigner.Visit_old_comp_forn  s    r   c                     t        |j                  d   t        j                  d             t	        |j                  dd    | j                  |       y )Nr   SPLIT_PENALTY_BEFORE_IF_EXPRr)   )r"   r   r   r#   r7   r   r/   s     r   Visit_comp_ifz#_SplitPenaltyAssigner.Visit_comp_ifr  sD    T]]1%YY=>@4==,-$r   c                 &    | j                  |       y rc   )r   r/   s     r   Visit_old_comp_ifz'_SplitPenaltyAssigner.Visit_old_comp_ify  s    tr   c                 F    t        |t               | j                  |       y rc   )rP   OR_TESTr   r/   s     r   
Visit_testz _SplitPenaltyAssigner.Visit_test}  s    T7#$r   c                    | j                  |       t        |t               d}|dz   t        |j                        k  rt        j                  d      r1t        t        j                  |j                  |         t               n3t        t        j                  |j                  |dz            t               |dz  }|dz   t        |j                        k  ry y Nr)   ro   r+   )
r   rP   r   r.   r   r   r#   _DecrementSplitPenaltyr   rX   r   r   rS   s      r   Visit_or_testz#_SplitPenaltyAssigner.Visit_or_test  s    $T7#E
!)c$--(
(	2	3&&t}}U';<g	G 	&&t}}UQY'?@'	Kqje !)c$--(
(r   c                    | j                  |       t        |t               d}|dz   t        |j                        k  rt        j                  d      r1t        t        j                  |j                  |         t               n3t        t        j                  |j                  |dz            t               |dz  }|dz   t        |j                        k  ry y r   )
r   rP   AND_TESTr.   r   r   r#   r   r   rX   r   s      r   Visit_and_testz$_SplitPenaltyAssigner.Visit_and_test  s    $T8$E
!)c$--(
(	2	3&&t}}U';<h	H 	&&t}}UQY'?@(	Lqje !)c$--(
(r   c                 F    | j                  |       t        |t               y rc   )r   rP   NOT_TESTr/   s     r   Visit_not_testz$_SplitPenaltyAssigner.Visit_not_test  s    $T8$r   c                 (   | j                  |       t        |j                        dk(  rYt        |      rNt	        |j                  d   t
               t        t        j                  |j                  d         t               y t	        |t               y )Nri   r)   r+   )r   r.   r   _StronglyConnectedCompOprP   rD   r"   r   rX   rC   
COMPARISONr/   s     r   Visit_comparisonz&_SplitPenaltyAssigner.Visit_comparison  sl    $
4==Q#;D#At}}Q')@A

$
$T]]1%5
68JL tZ(r   c                 F    | j                  |       t        |t               y rc   )r   rP   	STAR_EXPRr/   s     r   rN   z%_SplitPenaltyAssigner.Visit_star_expr  s    $T9%r   c                 ^    | j                  |       t        |t               t        |d       y )N|)r   rP   EXPR_SetBitwiseOperandPenaltyr/   s     r   
Visit_exprz _SplitPenaltyAssigner.Visit_expr  s$    $T4 dC(r   c                 ^    | j                  |       t        |t               t        |d       y )N^)r   rP   XOR_EXPRr   r/   s     r   Visit_xor_exprz$_SplitPenaltyAssigner.Visit_xor_expr  $    $T8$dC(r   c                 ^    | j                  |       t        |t               t        |d       y )N&)r   rP   AND_EXPRr   r/   s     r   Visit_and_exprz$_SplitPenaltyAssigner.Visit_and_expr  r   r   c                 F    | j                  |       t        |t               y rc   )r   rP   
SHIFT_EXPRr/   s     r   Visit_shift_exprz&_SplitPenaltyAssigner.Visit_shift_expr  s    $T:&r   PLUSMINUSc                 r    | j                  |       t        |t               t        || j                         y rc   )r   rP   
ARITH_EXPR_SetExpressionOperandPenalty
_ARITH_OPSr/   s     r   Visit_arith_exprz&_SplitPenaltyAssigner.Visit_arith_expr  s(    $T:& t7r   >   ATrM   SLASHPERCENTDOUBLESLASHc                 r    | j                  |       t        |t               t        || j                         y rc   )r   rP   TERMr   	_TERM_OPSr/   s     r   
Visit_termz _SplitPenaltyAssigner.Visit_term  s(    $T4  t~~6r   c                 F    | j                  |       t        |t               y rc   )r   rP   FACTORr/   s     r   Visit_factorz"_SplitPenaltyAssigner.Visit_factor  s    $T6"r   c                    | j                  |       |j                  d   j                  dk(  rt        |j                  d   d      s|j                  d   j                  dk(  rt	        j
                  |j                        dk(  rt        |j                  d   t               y t        |j                        dkD  r0t        t	        j                  |j                  d         t               t        |j                  d   t               y y |j                  d   j                  d	v r2t        |j                        dk(  rt        |j                  d          y y y )
Nr   (r   r3   r   if_stmtr+   r)   z[{)r   r   r!   r   r   r5   parentr"   rC   r.   rX   r   ATOMr-   r/   s     r   
Visit_atomz _SplitPenaltyAssigner.Visit_atom  s    	$a#%DMM!$k2	r		 	 C	'  -:
4==,.@
A!#\77a8HI4P
4==,d
3 
( 
q			4	'C,>!,CdmmB'( -D	'r   c                    | j                  |       d}|j                  D ]`  }t        |t        j                        r|j
                  dk(  rt        |       d}:|r#t        t        j                  |      t               d}b y )NFr   T)r   r   r   r   r    r!   r-   r"   r   rX   TOGETHER)r   r   prev_was_commar&   s       r   Visit_testlist_gexpz)_SplitPenaltyAssigner.Visit_testlist_gexp  sk    $N 	E6;;	'EKK3,>
<55e<h
Gr   )*__name__
__module____qualname____doc__r   r'   r0   r:   rF   rJ   rT   rZ   r]   ra   re   r   r   r   r   r   r   r   r   r   r   r   r   r   rN   r   r   r   r   	frozensetr   r   r   r   r   r   r   __classcell__)r   s   @r   r   r   @   s    
5
 :2; /+&
P
P(	%@ DD6L 
   
%
)&
)))'
 &'*+*8 IJ)7#
)$
r   r   c                 V    t        | t        j                  j                  t               y)z9Set an UNBREAKABLE penalty annotation for the given node.N)rz   r   r{   r|   UNBREAKABLE)r   s    r   r-   r-     s    t\,,::KHr   c                  d    | D ]+  }t        |t        j                  j                  t               - y)z@Set a STRONGLY_CONNECTED penalty annotation for the given nodes.N)rz   r   r{   r|   rC   )nodesr   s     r   r7   r7     s,     %d|..<<#%%r   c                 L    fd | t        j                  |              y)z+Set a penalty annotation on children nodes.c                    | |u ry t        | t        j                        rR| j                  dv ry t	        j
                  | t        j                  j                  d      }|k  rt        |        y y | j                  D ]  } ||        y )N>   ifforr   r   default
r   r   r    r!   r   r}   r{   r|   r"   r   )r   first_child_leafpenalty_annotationr&   RecExpressionpenaltys       r   r   z,_SetExpressionPenalty.<locals>.RecExpression  s    $$	)	)'99
''55qB	g	%w' 
& == /%e-./r   Nr   rX   )r   r   r   s    `@r   rB   rB   	  s    / l0067r   c                    t        j                  dt        | j                        dz
        D ]  }| j                  |   }t	        |t
        j                        s-|j                  |k(  s=t        j                  d      r t        |t        j                  d             rt        t        j                  | j                  |dz            t        j                  d              y )Nr)   rp   SPLIT_PENALTY_BITWISE_OPERATOR)r   rO   r.   r   r   r   r    r!   r   r#   r"   r   rX   )r   oprS   r&   s       r   r   r     s    q#dmm"4q"89 9eMM% E%%%++*;	2	3		*J KL&&t}}UQY'?@II67	99r   c                    t        j                  dt        | j                        dz
        D ]  }| j                  |   }t	        j
                  |      |v s*t        j                  d      r t        |t        j                  d             _t        t	        j                  | j                  |dz            t        j                  d              y )Nr)    SPLIT_BEFORE_ARITHMETIC_OPERATOR!SPLIT_PENALTY_ARITHMETIC_OPERATOR)
r   rO   r.   r   r   r5   r   r#   r"   rX   )r   opsrS   r&   s       r   r   r   *  s    q#dmm"4q"89 <eMM% EU#s*	5	6		*M NO&&t}}UQY'?@II9:	<<r   c                 L    fd | t        j                  |              y)z0Increase a penalty annotation on children nodes.c                    | |u ry t        | t        j                        rO| j                  dv ry t	        j
                  | t        j                  j                  d      }t        | |z          y | j                  D ]  } ||        y )N>   r   r   r   r   r   )r   r   r   r&   r   amts       r   r   z'_IncreasePenalty.<locals>.RecExpression9  s|    $$	|	#..
''55qBgtWs]+== /%e-./r   Nr   )r   r  r   s    `@r   rP   rP   6  s    / l0067r   c                     | j                   D ]  }t        |||        t        | t        j                        r6t        j                  | |d      }||k  rt        j                  | ||       yyy)aT  Recursively set the given annotation on all leafs of the subtree.

  Takes care to only increase the penalty. If the node already has a higher
  or equal penalty associated with it, this is a no-op.

  Args:
    tree: subtree to annotate
    annotate_name: name of the annotation to set
    annotate_value: value of the annotation to set
  r   r   N)r   rz   r   r   r    r   r}   SetNodeAnnotation)r   annotate_nameannotate_valuer&   cur_annotates        r   rz   rz   J  sl     }} 7e~67fkk"11mQ(Ln$$$T=.I % #r   >	   !=<=<>==>=inis<>c                    t        | j                  d   j                        dk(  rt        j                  | j                  d         dk(  rt        j                  | j                  d         j
                  dk(  r0t        j                  | j                  d         j
                  dk(  ryt        j                  | j                  d         j
                  dk(  r0t        j                  | j                  d         j
                  dk(  ryt        | j                  d   t        j                        r | j                  d   j
                  t        v ryy)	Nr)   r+   comp_opnotr  Tr  F)r.   r   r   r5   rX   r!   r6   r   r   r    	_COMP_OPS)r   s    r   r   r   a  s    	"++a.
!
!"a'BKKN+y8""2;;q>288EA!!"++a.1774?""2;;q>288D@!!"++a.1775@Q-kk!ni'	r   c                     t        j                  | t         j                  j                  |      }||k  r||z
  nd}t	        | |       y )Nr   r   )r   r}   r{   r|   r"   )r   r  r   s      r   r   r   p  sA    **
L##113@' 7]GcM'4!r   c                 b    t        j                  | t         j                  j                  |       y rc   )r   r  r{   r|   )r   r   s     r   r"   r"   w  s#      |'>'>'L'L!(*r   )4r   r@   lib2to3r   lib2to3.pgen2r   r>   yapf.pytreer   r   yapf.yapflibr   r   r	   r   rY   rv   rD   rC   rQ   r   r   r   r   r   r   r   r   r   r   r   r   r   POWERr   rw   r   r   PyTreeVisitorr   r-   r7   rB   r   r   rP   rz   r   r  r   r   r"    r   r   <module>r      s    < 	  0 $ & "  !   	

	

	 	&zN88 zzI
%8*	9	<8(J( JK	"*r   