ZL i)dZddlZddlZddlmZmZddlmZddlm Z m Z ddl m Z m Z ddlmZmZmZddlmZmZmZmZmZdd lmZmZmZmZdd lmZmZm Z m!Z!m"Z"m#Z#m$Z$dd l%m&Z&m'Z'm(Z(dd l)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;mZ>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNdd lOmPZPddlQmRZRmSZSmTZTmUZUmVZVddlWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^ddl_m`Z`ddlambZbmcZcedZeeebecfZfGddeXZgGdde1eZhdedee&de'deeifdZj dPdede'dee&deefdZkdede'delfdZmGdde Zndedee&de'deefd Zo dQdede'dee&d!eeedeef d"Zp dPded!eeedefd#Zq dQd$edede'dee&d!eeedeef d%Zrd&ed$ede'delfd'Zsd(ed)ed*eddfd+Ztd,euebd-ed.ebdelfd/Zvd,euebd-ed.ebd0endef d1Zwd2e]de]fd3Zxdedeedfd4Zyd5ebdee&delfd6Zzd7eld8eddedefd9Z{eehZ|exdedee&de'deefd:Z}exdedee&de'deefd;Z~dZd?ecd@efdAedddfdBZd ,D%G# H$%%d+++sA+D.BD>D?Dc#K|jEd{d}|jD]}|jtjk(rd}#|s&|jt j k(r]|jdjtjk(r3t|||j|jdrt||dnt||dd}|jD]}|j|Ed{y77 w)zVisit function definition.NFTrrr) rqrrzrRRARROWrCrrrr`rarDr)rfrris_return_annotationrs r] visit_funcdefzLineGenerator.visit_funcdefs99; %]] -EzzU\\)'+$%::*u~~a/@/E/E/S:#!YY!%5: ,D%G'eUC',$ -"]] )Ezz%( ( ( )+ , )s(D D7D B/D >D?D D c#Kt|t|j|j|j Ed{|j D]}|j |Ed{y7/7 w)z'Visit either a match or case statement.rN)rsetr`rarqrrrfrrrs r]visit_match_casezLineGenerator.visit_match_cases`" su499t}} 99;]] )Ezz%( ( ( )  (s#?A5A1'A5)A3*A53A5c#Kt|r'|j|jdEd{y|j|Ed{y77w)zVisit a suite.N)r;rrr~rs r] visit_suitezLineGenerator.visit_suite)sF  zz$--"23 3 3))$/ / / 4 /s!-AAA A AAc#Kd}|jD]<}||tjk(rt|rt ||d|j }>|j r|j j tvr|t|r%t|r|j|Ed{y|jdEd{|j|Ed{|jdEd{y|j r6t|j r!d|_ |j|Ed{y|jEd{|j|Ed{y77777?7(7w)z,Visit a statement without nested statements.NFrrjrru)rrRSEMIr,rDrzrr%r7r:r~rqr;r|)rfrr prev_typers r]visit_simple_stmtzLineGenerator.visit_simple_stmt0s3#' ]] #E!Y%**%<-PUBV#D%? I # ;;4;;++y8*40\$5G--d33399R=((--d33399R=(({{}T[[9  --d333yy{ " "))$/ / /4(3( 4 " /sB E6"E(#E6<E*=E6E,E6.E./AE60E01E6 E2 E6"E4#E6*E6,E6.E60E62E64E6c#^K|jEd{t|j}|D]M}|j|Ed{|jt j k(s|jtk(sMnt|}|j|Ed{y77_7 w)z-Visit `async def`, `async for`, `async with`.N) rqiterrrrzrRASYNCr$next)rfrrrr internal_stmts r]visit_async_stmtzLineGenerator.visit_async_stmtHs99; & Ezz%( ( (zzU[[(EJJ:L,L  X ::m,,,  ) -s9B-B'2B- B) 4B-?"B-!B+"B-)B-+B-c#K|jD]3}|jEd{|j|Ed{5y7 7 w)zVisit decorators.N)rrqrrs r]visit_decoratorszLineGenerator.visit_decoratorsXsA]] )Eyy{ " "zz%( ( ( ) " (s#A AA AA A c#TKt|jddD]\}}|j|dz}t|ts)|jj }|j tjk(sa|j tjk(s|jdj tjk(s|jdrd|vst||t||j|j |j#|Ed{y7w)Nrrjr)0x0b0ojr`ra)rrrvrSrlowerrzrRNUMBERrCtrailerDOT startswithrDremove_await_parensr`rar~)rfrridxleaf next_leafrs r] visit_powerzLineGenerator.visit_power^s"4=="#56 0IC cAg.IdD)JJ$$&E U\\)NNdll2&&q)..%));(();<u$#D$/# 0& Dtyy4==I%%d+++s1A9D(<D(*D(D(D(AD( D&!D(rc#@K|jEd{y7w)zBRemove a semicolon and put the other statement on a separate line.N)rqrfrs r] visit_SEMIzLineGenerator.visit_SEMIvs99;s c#vK|j|Ed{|jEd{y77w)zAEnd of file. Process outstanding comments and end with a newline.N)r~rqrs r]visit_ENDMARKERzLineGenerator.visit_ENDMARKERzs2%%d+++99; ,s959799c#K|jjjs|jEd{|j}|j }t |dk\r=|dj}|tv}|dj}|tv}|xr|}nd}|r4|jj||jEd{y|j|Ed{y77!7 w)NrrrF) rmrwrxrqr splitlinesrnlstriprrryr~) rfrrlines first_linefirst_is_fmt_off last_linelast_is_fmt_onis_fmt_off_blocks r]visit_STANDALONE_COMMENTz&LineGenerator.visit_STANDALONE_COMMENTs  00BBDyy{ " "   " u:?q*J)W4 b ((*I&&0N/BN $      $ $T *yy{ " "))$/ / /9 #2 # 0s48C>C8BC>C:C>2C<3C>:C><C>c #K|j\}}|jtjk(rt |jdk(r|jdjt j k(rutt jd}tt jd}|jxsd}|j|ttj|||g|j|Ed{y7w)z_Force parentheses between a unary op and a binary power: -2 ** 8 -> -(2 ** 8) rj()rN)rrzrCpowerrnrR DOUBLESTARrSrrremoverrTrr~)rfrr _operatoroperandrrindexs r] visit_factorzLineGenerator.visit_factors "]] 7 LLDJJ &G$$%*  #((E,<,<< C(D C(DNN$)E   eT$))dGT5J%K L%%d+++sC8D:D;Dc# Kt|jdk(sJt|jd||j|jrt ||jdd|j |Ed{y7w)a) Add potential parentheses around types in function parameter lists to be made into real parentheses in case the type hint is too long to fit on a line Examples: def foo(a: int, b: float = 7): ... -> def foo(a: (int), b: (float) = 7): ... rrrr`raFrN)rnrrr`rarDr~rs r] visit_tnamezLineGenerator.visit_tnamesl4==!Q&&& . MM! T DMM  dmmA&6 F%%d+++sA:B<B=Bc#^Kt|t|rtjd|js|j j r!t|j}t|}n |j}t|}|t|d}|d}|d|k7rdnd}||| }| }d|jjz}t|r t||}n|j}d}|rU|d|k(rd|z}|d|k(r|dz }|dd k(r7t|t|j!d z } | d zr |dz }d }n|sd}||z} |dk(r|j#} |rt| dnd} t| dkDr| |z|j j$kDrdt||z|j j$kr?|s=|jd|z d k(r|| z|z| z|_n8|| z|zd z|z| z|_n!|| z|z| z|_n|| z|z| z|_|j j rQ|j&t(j*k(r4t|j|_t|j|_|j-|Ed{y7w) Nz\\\s*\nrrjrz F r\rT )rJr/researchrr`string_normalizationrHrIrGrnrmrlr3rFstriprstripr line_lengthrzrRSTRINGr~) rfr docstringr| quote_char quote_lendocstring_started_emptyrhhas_trailing_backslashbackslash_countquoterlast_line_lengths r] visit_STRINGzLineGenerator.visit_STRINGs*40  bii DJJ&Gyy--3DJJ? 4I>  JJ &y1F!#f+-0I"1J 'q\Z7QI!)YJ7I*3m #t00666F"4(3IvF %OO- %* "Q<:- #iIR=J.$IR=D(&))ns9;K;KD;Q7R&RO&*"S( 15., *EA~ ",,.5>3uRy>A JN(94tyy7L7LLF i/4993H3HH2zz"y.1T9%+e^i%?%%G %+e^i%?$%F%ORW%W !'%)!;e!CDJ#e^i7%? 99 ) )dii5<<.G0z.LineGenerator.visit_fstring..53- zzT;;; CJ - 46r)rranyrr~r rfrr string_leafs r] visit_fstringzLineGenerator.visit_fstring1x/5  [! ;$$ $- - * ))+6 6 6 $$[111 71$ABA=B7A?8B?Bc#Kt|}|j|d|jvr6td|jDr|j |Ed{y|j |Ed{y77w)Nrc3pK|].}|jtjk(rdt|v0ywrrrs r]rz.LineGenerator.visit_tstring..Dr r!r"r$s r] visit_tstringzLineGenerator.visit_tstring@r'r(c#Ktj|jvr$t|dh|j|j|j |Ed{y7w)Ninr)rwrap_comprehension_inr`rrar~rs r]visit_comp_forzLineGenerator.visit_comp_forpsI  ( (DII 5 &D6 DMM %%d+++sAAAAc#BK|j|Ed{y7wrd)r/rs r]visit_old_comp_forz LineGenerator.visit_old_comp_forws&&t,,,s ct|j|_|j}t }t |dhddh|_t |hdddh|_t |dd hdh|_t |d d hd d h|_ t |hd ||_ t |d hd h|_ t |dhdh|_ t |dh||_ t ||t|_t |dhdh|_t ||dh|_t ||dh|_|j&|_|j*|_|j.|_|j.|_t ||dh|_y)z,You are in a twisty little maze of passages.rtassert,)rr>ifelifelser5r6whiler7forr->tryr7exceptfinallyr;withclassrbimportdelN)rr`rmrrrvisit_assert_stmt visit_if_stmtvisit_while_stmtvisit_for_stmtvisit_try_stmtvisit_except_clausevisit_with_stmtvisit_classdefr visit_expr_stmtvisit_return_stmtvisit_import_fromvisit_del_stmtrvisit_async_funcdefrvisit_decoratedrvisit_match_stmtvisit_case_block visit_guard)rfvØs r]rezLineGenerator.__post_init__zsu dii0 OOu!(hZSV!X$ .f~ !(Wf4Ewi X%a5&/5RV-X% )4)T)htn)00$00d0x~00-T-htn- )T)htn) ,,$,0tDXd^ 0T0htn0@,,(4.,",,$,&V,V,(4.V,p,,(4.,,t,,$ 2$ 28D> 2 2$ 28D> 2`,4,HTN,-t--Br\r_rqrar`rbc ` ttt|||S#t$rYywxYwrd)rrrQrK)rqrar`s r]!_hugging_power_ops_line_to_stringrXs2 d<h#EFGG s ! --c #K|jr|yt|}t|||xs|}|j}|j}t ||}t ||}t||} t||} |js||jsp|jsdt|||s|jrF|jr|js*|j!st"j$|vr||g} ng} n|j&rt)||st*g} ndt,dt.dt0t2dt4dt6t.f d} t9d d d | i} t"j$|vr&|jr||| t:t<| | g} n%||| | | g} n|jrt:t<| g} n| g} | j?t@| D]} tC||||| }|Ed{y|y7 #tD$rY3wxYww) zTransform a `line`, potentially splitting it into many lines. They should fit in the allotted `line_length` but might not be able to. `features` are syntactical features that may be used in the output. N)r`line_strrfrqrar`rbc 3Kt||jD]6}tt||||}t |d|s,|Ed{yt|||Ed{y77w)zWraps calls to `right_hand_split`. The calls increasingly `omit` right-hand trailers (bracket pairs with content), meaning the trailers get glued together to split on another bracket pair instead. omitrrtN)ra)generate_trailers_to_omitrlistright_hand_splitr)rfrqrar`r]rs r]_rhsztransform_line.._rhssv2$8H8HI -dD(NO (at<$$$ (dXF F F% Gs*AA-A- A) A-#A+$A-+A-rhsr[__call__rZ)# is_commentrrXrrrLrMrOrN$contains_uncollapsable_type_commentsshould_split_rhsmagic_trailing_commar!contains_unsplittable_type_ignoreinside_bracketscontains_standalone_comments0contains_implicit_multiline_string_with_commentsrstring_processingis_defshould_split_funcdef_with_rhsleft_hand_splitobjectrrrrrrzdelimiter_splitstandalone_comment_splitryrQrun_transformerrK)rqr`rarZline_str_hugging_power_opsllsn string_mergestring_paren_strip string_splitstring_paren_wrap transformersrarb transformresults r]transform_liners8  d#H *$$?K8   B " "BB'L,R4!"b)L*2r2  5 5 7%%)) D;U V557%%$*K*K*MEEG  $ $ ,(*<=LL :4F'(  G G $ G0:70C GKO G d^ G:2d5"z4013  $ $ ,## & #,%  !& %   ## /1I3O #u  %!   $T9dHxXF        s6GH G<(H -G:. H < HH HH cg}d}|jD]T}|jtjk(rd}|r|j ||jtj k(sSd}Vt |j|j}t|}|D]!}|j |dt||v#|jduS)zIf a funcdef has a magic trailing comma in the return type, then we should first split the line with rhs to respect the comma. FTrk preformatted track_bracketN) rorzrRrryrrr`rlridrh)rqr`return_type_leavesin_return_typerr~leaves_to_tracks r]roro!s&(N " 99 #"N   % %d + 99 $!N "tyy 3F9:LMO"  T(o5     & &d 22r\c6eZdZeZeZeZy)_BracketSplitComponentN)rWrXrYrheadbodytailr[r\r]rr@s 6D 6D 6Dr\r _featuresc#*KtjtjfD]g}g}g}g}|}d}d} t|jD]7\} } | dk(r#| j tjk(r| dz } nJ| dkDrE| j tjk(r| dz } n"| j tj k(r| dz} ||urd| j tvrR| j|urDt|tr4|tjk(r| dkDst| t||r|n|}|j| ||us| j |k(stj|vs|tjk(r| dkDr4| }|}:|sd|shnrs tdt!||t"j$} t!||t"j&} t!|||t"j(}t+| | || | |fD] }|s| yw)a/Split line into many lines, starting with the first matching bracket pair. Note: this usually looks weird, only use this for function definitions. Prefer RHS otherwise. This is why this function is not symmetrical with :func:`right_hand_split` which also handles optional parentheses. NrrrjNo brackets found component)rRrrrrorzrr"opening_bracketrvrSr(ryrfix_type_expansion_splitrVbracket_split_build_linerrrr bracket_split_succeeded_or_raise)rqrr` leaf_type tail_leaves body_leaves head_leavescurrent_leavesmatching_bracketrlrrrrrr~s r]rprpFsjj%**-' "$ "$ "$ $+/$T[[1 1KE4zdii5::5 99 *QJEYY%**,QJE+-II!11((,<</6#ejj0UQYt$/00;  ! !$ ',99 )44D@%3 '+$%0N= 1>  O'P ;-.. #T+7M7R7R D $T+7M7R7R D $T+7M7R7R D%T46t$ Ls+D}tA|| |tC|| |||S) a#Split the line into head, body, tail starting with the last bracket pair. Note: this function should not have side effects. It's relied upon by _maybe_split_omitting_optional_parens to get an opinion whether to prefer splitting on the right side of an assignment statement. NrrrrjrrTc3DK|]}tt|ywrd)rnrrrs r]rz*_first_right_hand_split..s :D N:s rrtF)"reversedroryrzr"rrrVreverser*hug_parens_with_braces_and_square_bracketsr`rr_rRSTARrrnpopinsertrrrrhCOMMArsumrrextendrrrr)rqr]rrrrrclosing_bracketrrinner_body_leaveshugged_opening_leaveshugged_closing_leaves is_unpackingunpacking_offset inner_body should_hugrrrs r]rrsx!K K K N&*O&*O% - [ (&0;d# [ (yy,,D1E"&"6"6"&!, - K-..D::diiG N N * *k"o = -,.,."1~**uzz5;K;K.LL %1q ! "a*:&: :!"%**.>>!"%55 !123 %,,->-B-B1-EF#$ ! ( ():)>)>q)A B ! ( (,=,A,A,C D ! "a*:&: :!"%**.>>!"%55 !123 !%61!%b)055 J ..%b)..%++=! "ii33c: 58M M:7 (WTYYK%P"'J!%J/ ""#893kA ! #T?6L6Q6Q D |' :P:U:U  $T?6L6Q6Q D%T46 T4 HHr\rbc#Ktj|vr|jjtj k(r|jj s|jjtjk(r|jj so|jsct||jrMt|jh|} t||}t|||rt|||||Ed{y t;|jt;|j|j4|j&|j8fD] }|s| y7`#t $r}|j"rnt%|j&st)|j&|st*j,rq|jj.r[|jj.j.r;|jj.j.jt0j2k(s t!d||j4j7s|j8j7r t!d|Yd}~rd}~wwxYww)Nr\rrtzG-gsDA@T4( BH3&&'3&&'88SXXsxx0 LK  ))!*,SXXDA;;++22++2299++2299>>$BSBSS"R 33588668!  / sJCI8 -E7E8E.`sL499 +L')rc3@K|]}|jtvywrd)rzr!rs r]rz1_prefer_split_rhs_oop_over_rhs..gsFtyyH$FsNrrjrrtFc3VK|]!}|jtjk(#ywrd)rzrREQUALrs r]rz1_prefer_split_rhs_oop_over_rhs..sIT U[[(Ir)rrirrrrrrrzrCrrw delimitersr#rornrRrrrrrhcountrr")rrbr`rrhs_head_equal_countrhs_oop_head_equal_count has_closing_bracket_after_assigns r]rrHs\  668 << 9 9 ; << 9 9 ; //    & &    & & - -    & & - - 2 2d6G6G G HH $ $ / /L 8K8KLLL  A %#((//"*=*B*Bekk*Q F"1EF F  wt1A1AA1EF  xx$$036((//B$DIIBHHU6=ll6I6IJd JPP  a$8;S$S',$,,- 99 #  99( (/3 ,   )  IW\\5H5HI I >$W\\= CJs 7LL#rrrctt|j}|s%|dk(r td|dkrtd|dyy)aRaise :exc:`CannotSplit` if the last left- or right-hand split failed. Do nothing otherwise. A left- or right-hand split is based on a pair of brackets. Content before (and including) the opening bracket is left on one line, content inside the brackets is put on a separate line, and finally content starting with and following the closing bracket is put on a separate line. Those are called `head`, `body`, and `tail`, respectively. If the split produced the same line (all content in `head`) or ended up with an empty `body` and the `tail` is just the closing bracket, then it's considered failed. rz)Splitting brackets produced the same linerz,Splitting brackets on an empty body to save z characters is not worth itN)rnrrrV)rrrtail_lens r]rrs_3t9??$%H  q=IJ J \>xjI    r\rooriginalrcv|sy|jry|jsy|jdk7rytd|Dryt d|Dd}|yt |dk(ry|j rH|j jr2|j jjtjk(ryy)NFTrc3rK|]/}|jtjk(xr t| 1ywrd)rzrRrr8rs r]rz)_ensure_trailing_comma..s3 IM U[[ D)>t)D%DD s57c3:K|]}|js|ywrdrrs r]rz)_ensure_trailing_comma..sDd TDsrb) rrnrr#rr*r next_siblingrzrRVBAR)rorrleaf_with_parents r]_ensure_trailing_commars  ??#  QW DfDdK+,8   # # 0 0  # # 0 0 5 5 C r\rct|j|j}|tjurd|_|xjdz c_t |||rtt|dz ddD]i}||jtk(r||jtjk7r/ttjd}|j|dz|nt}|tj ur t#|}|D]J}|j%|dt'||v|j)|D]} |j%| dL|tjurt+||rd|_|S)aiReturn a new line with given `leaves` and respective comments from `original`. If it's the head component, brackets will be tracked so trailing commas are respected. If it's the body component, the result line is one-indented inside brackets and as such has its first leaf's prefix normalized and a trailing comma added when expected. rkTrjrr4rr)rr`rlrrrjrrangernrzr$rRrrSrrrrryrcomments_aftershould_split_linerg) rorrrr~r new_commarr comment_afters r]rrsc x}}HNN ;F*///!%  !&(O D3v;?B3 !9>>%77!9>>U[[0 $U[[# 6IMM!a%3 $'5O*///=fE< T(o5  &44T: .split_wrappers:%T8T: J*,J  a '  s),)r rrrrr)rrs` r]dont_increase_indentationrsM  :(19= $ r\ctt|jdz ddD]&}|j|jtk7s$|cSy)Nrjrr)rrnrorzr$)rqleaf_idxs r]_get_last_non_comment_leafrsJ#dkk*Q.26 ;;x % %); ;O r\rct|tjhrtj|vSt|tj tj hrtj|vSy)N)withinT)r@rC typedargslistrTRAILING_COMMA_IN_DEFarglistargumentTRAILING_COMMA_IN_CALL)rras r]_can_add_trailing_commarsQt1123,,88t||T]];<--99 r\safedelimiter_priorityc|r~|tk(ru|jdjtjk7rK|jdjt k7r+t tjd}|j||S)Nrr4)r rorzrRrr$rSry)rrrqrs r]_safe_add_trailing_commar"s_ . 0 KKO EKK / KKO $6 6c*  I Kr\c#vKtjdk(r tddjd}j} |j t |h}|tk(r|j|dk(r tdtjjj tj}d }d td t tffd d td t tffd }t#} t%jD]c\} } | Ed{| dkDxr4|j&j)t j| dz } | |k7s|t*vr|| Ed{t-|| j.}|r| j.|k(r t1| |}|j2t4k(r| | k(r t7|||j&j)t | } | |k(s| dztjkr(|t*vr |j| dzEd{tjjj frt7||yy#t $r tddwxYw77.7kw)zSplit according to delimiters of the highest priority. If the appropriate Features are given, the split will add trailing commas also in function signatures and calls that contain `*` and `**`. rz Line emptyNrexcludezNo delimiters foundrjz7Splitting a single attribute from its owner looks wrongr`rlrjTrrbc3K j|dy#t$rDtjjj j |YywxYww)EAppend `leaf` to current line or to new line if appending impossible.TrrN append_safe ValueErrorrr`rlrjryrrmrqs r]append_to_linez'delimiter_split..append_to_linePsb &  $ $T $ = & YYdjj$BVBVL    %  &&A)A)A A&#A)%A&&A)c3^Kj|D]}|Ed{y7wrd)r)rrrrqs r]append_commentsz(delimiter_split..append_comments]s2!006 5M%m4 4 4 5 4s -+-)rnrorVrwmax_delimiter_priorityrrrdelimiter_count_with_priorityrr`rlrjsysmaxsizerSrrrrgetMIGRATE_COMMENT_DELIMITERSmin bracket_depthrrzr$r)rqrar` last_leafbtr lowest_depthtrailing_comma_saferlast_non_comment_leafrrprevious_priority leaf_priorityrrms` @@r]rrrr1s 4;;1,'T1 BI  B;669 6O l*  , ,-? @A ESTT YYdjj$:N:NL;;L &T &htn &5d5x~57t<#DKK0 $!$'''$qL R]]->-> t{{8a<( ).  !3 3!%??&t, , ,<););< 4#5#5#E"9$"I  >>/ /H@U4U3#%7L ))"T(3 . .1 s4;;//&.HH*4;;x!|+DEEE YYdjj$BVBVL= D/ !3\  G ;/0d:;D ( -"FsXAJ9J"C J9.J1/AJ9J4BJ9 >J9 J7 A J9J..J94J97J9c#vKjs tdtjjj dt dttffd }jD]8}||Ed{j|D]}||Ed{:ryy747w)z4Split standalone comments from the rest of the line.z*Line does not have any standalone commentsrrrbc3K j|dy#t$rDtjjj j |YywxYww)rTr)rlrjNrrs r]rz0standalone_comment_split..append_to_linesb &  $ $T $ = &  T=Q=QL    %  &rN) rkrVrr`rlrjrSrror)rqrar`rrrrms` @r]rsrss  , , .FGG YYdjj$:N:NL &T &htn & 5!$'''!006 5M%m4 4 4 55  ( 5s$Ad...&tUE: JJ%**,II!3!33 5$'&&2&&++u{{:KK6)(/#D%?jjEKK/ t, KK< ' 6; qZ r\rrrcht|r6t|jdsJd|_d|jd_y|jt j k7rT|j|tt jd|jtt jdyy)Nrru) r2r9rrrzrRrrrSrrr)rrrs r]rr"sUV__R0111 $&! uzz !E4 B#78DR01 "r\c|jdjtjk(rt |jdkDr|jdjt j k(rm|jdjdjtjk(r4t|jd|||drt||jddtt|jdjd}tt|jdjd}|jdjd}t|tr{|jt jk7sF|jdjtjk(std|jDrt!|t!|yyyyyyy) NrrjTrFrrc3zK|]3}t|txr|jtjk(5ywrd)rvrSrzrRrrs r]rz&remove_await_parens..Ls6ud+N e>N>N0NNs9;)rrzrRAWAITrnrCrrrrDr rSrvrTrr#r()rrr`rarrbracket_contentss r]rr0s }}Q +DMM0BQ0F MM!  ! !TYY . a ))!,11UZZ?2 a !-1 $D$--*:EJ#4q)9)B)B1)EFO"4q)9)B)B2)FGO#}}Q/88; *D1 %%3#,,Q/44 C!1!:!: // 2+@ /1G+r\ctj|vsBt|jdks*|jdjt j k(ryd}tdt|jD]0}|j|jtjk(s.|}n|ttjd}ttjd}|jd|}|D]}|jtt j |tt j||g} |j!d| yy)zWhen enabled and safe, wrap the multiple context managers in invisible parens. It is only safe when `features` contain Feature.PARENTHESIZED_CONTEXT_MANAGERS. rrjNru)rPARENTHESIZED_CONTEXT_MANAGERSrnrrzrCrrrRrrSrrrrT testlist_gexpr) rrr`ra colon_indexrrrcontext_managersr new_childs r]rrUs ..h> t}}  " ==  DII -!%K 1c$--( ) ==  EKK /K EJJ#EJJ#==;7% E LLN  IId4#5#57GH$O  !Y')r\c~|jtjk(rYt||||drt ||dt |j dtrt|j d|||y y |jtjk(r2|j D]"}t |tst||||$y |jtjk(r[td|jDs:t|j d|||drt ||j ddy y y y ) z6Recursively hide optional parens in `with` statements.TrFrrjrc3VK|]!}|jtjk(#ywrd)rzrR COLONEQUALrs r]rz%remove_with_parens..s$3*. U%%%3rrN) rzrCrrrDrvrrTrr+ asexpr_testr#ro)rrrr`rars r]rrs( yyDII . )-   e < dmmA& - t}}Q/D8 T . d(( (]] NE%&"5$THM N d&& &s326++-30 / MM! )-   dmmA&6 F 0 &r\rc |jtjtjfvs|t |spt |sdt |r|jtjk(s;t |r7|jtjk(rt|tjst|r|jtjk7s|st|tk\rt j"|vrt$j&|vrt |r|j(|j(jtj*k(r[|j,.t/|j,r|j,j0dk(s!t3|st5|s t7|ryt9|r|jtj:tjtj<tj>tj*tj@tjtjBtjDtjFtjHtjFf vry|jJd}|jJd}tM|rFtO|r:|jJd}tQ|jRjU|sd|_d|_tW|||||tY|r|j[|jJd|jJdjRjUrE|jJdjR|jJdjRz|jJd_)|jJdjRjUr+|jJdjR|jRz|_)yy ) a If it's safe, make the parens in the atom `node` invisible, recursively. Additionally, remove repeated, adjacent invisible parens from the atom `node` as they are redundant. Returns whether the node should itself be wrapped in invisible parentheses. asFrrrjrtrurT).rzrCrexprr0r6r<r2rr+rRrrB expr_stmtrr r!remove_parens_around_except_typesrUNPARENTHESIZED_EXCEPT_TYPESrr rr4rr>r=r1rAr assert_stmt return_stmtfuncdefr+tnamerdel_stmtrr2r9r?r|rrr.r)rrrr`rarrrmiddles r]rrs $))TYY// $    TNv{{d.>.>> TN t~~-%dEKK8 TNv{{dnn< -.t4F 99TA88HDTNKK+KK$$(:(::%%1%d&7&78))//47 &d + #D )  D! ;; NN NN          LL NN    JJ MM MM MM   MM! E == DU d 3q! .fmm.A.A.C$OEKDJ+ )E   ) 0 NN6??1- .q!((..0OOA&--0B0I0II")r"))//1$oob1884;;F  r\c|jr|jdvsyt}d} |jd}|jt j k(rd}|jt||jj|}|tk(xrR|jjxr|xs6|jjt j"t j$hvS#ttf$rYywxYw)zFShould `line` be immediately split with `delimiter_split()` after RHS?z[{(FrTr)rrrrorzrRraddrrwr IndexErrorrr r`rhrCrr)rqrrtrailing_commar max_prioritys r]rr!s  " "'<'<'E eGNKKO >>U[[ (!N KK9 &++BB7BS  > )   ' ' :N H  ! ! & &499d6F6F*G G  #sA$C**C<;C<rc#Kt}|js|d|jz}d}d}t}|jdD]\}}} || z }||kDry| t |j t |j zkD} |jtk(s| ry|r||urd}b|jtvsu|dkDr|j|dz nd} | rL| jtjk(r/|j#t|j||jsy|jt!||jtvs |dkDr|j|dz nd} | r.| jt"vr|jt!|T|r?|jt!||j%||j'|| rL| jtjk(r/|j#t|j||jsy|j s|j}|}yw)aGenerate sets of closing bracket IDs that should be omitted in a RHS. Brackets can be omitted if the entire trailer up to and including a preceding closing bracket fits in one line. Yielded sets are cumulative (contain results of previous yields, too). First set is empty, unless the line should explode, in which case bracket pairs until the one that needs to explode are omitted. NT) is_reversedrrj)rrhrlenumerate_with_lengthrnrr|rzr$r"rorRrrr5r@rr#updateclear) rqrr]lengthrrinner_bracketsrr leaf_lengthhas_inline_commentprevs r]r^r^<sD  $ $ ^F&*O&*O"%%N$($>$>4$>$P6' t[+ K  (3tzz?S=M+MM 99* *.@  &"&..16t{{519- U[[0,,83,,dDKK ""2d8, YY* *-2QY4;;uqy)DD %55""2d8,O,- N+$$& II,((4/0D0DdDKKXzz"&"6"6"&m6'sB>IBIC$I=Irurdr}rZc<|s t|}g}|||D]G}t|jd|k(r td|j t ||It |}tj|vs|jjdk7s|jjrtd|jjDsb|jsR|djs?|dj!s,t#|dstd|j$Dr|S|j'}t)|||j$|tjhz} t+||| | } t-fd | Dr| }|S) Nrz-Line transformer returned an unchanged resultrrbc34K|]}|jywrd)r)rbrackets r]rz"run_transformer..sKw}}Ksrrtc38K|]}|jduywrdrrs r]rz"run_transformer..s;tt{{d";srdc38K|]}t|yw)rtN)r)rlnr`s r]rz"run_transformer..s H2  . . Hs)rrrrKrrrrrrrWrw invisibler#rrfrirroclonerrtall) rqr}r`rarZr~transformed_line features_set line_copy features_fopsecond_opinions ` r]rtrtss !$'F%dHd;V  & &t , 8!"QR R n%5D8TU V x=L**l:    ' '5 0##-- KD,@,@,J,JK K  * * , !9 9 9 ; !9 6 6 8 q  5 ;t{{; ;  I)T4;;/7#E#E"FFL$9dL8N H HH Mr\)r[)r[r[)F)rZrrcollections.abcrr dataclassesrenumrr functoolsrr typingr r r black.bracketsr rrrrblack.commentsrrrr black.linesrrrrrrr black.moderrr black.nodesr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCrDblack.numericsrE black.stringsrFrGrHrIrJ black.transrKrLrMrNrOrPrQblib2to3.pgen2rRblib2to3.pytreerSrTrTLeafIDrUrVr_rrXrboolrorrpr`rrrrr_rrrrrrrrrrsrrrrrrrrr^rtr[r\r]rns 0$((ML.-&&&&&&&&&&N5!&  4:M/M rBGDMrBj ! c] =?y yy&0&9y d^yx33D3T3>T @ @%g.@6:@ d^@L%'!   ! V   d^ , "dI dI V dIdIV%'! A A A A! A V  A d^ AHH H&H.2H HV4t4D4! J!"&!9=! !H. J... & .  .b++"Thsm$*W2E$ 4 S  QU .~>V V$W-V59V d^VVr $W-59 d^Dq q !#hq 15q AKGATq  q h 24 2 23 24 2"0d"0$"0*W:M"0RV"0J'( '('(&0&9'( '(T-G -G-G$(-G4>w4G-G -Gj*/ o o o o! o #' o  odD4D6I'DI'sI'xF ?TI'd + ++ +! +  + $Z+r\