/* Ċ Ġ* ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ġor Ġmore Ċ Ġ* Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ġdistributed Ġwith Ċ Ġ* Ġthis Ġwork Ġfor Ġadditional Ġinformation Ġregarding Ġcopyright Ġownership . Ċ Ġ* ĠThe ĠASF Ġlicenses Ġthis Ġfile Ġto ĠYou Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ċ Ġ* Ġ( the Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ċ Ġ* Ġthe ĠLicense . Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġorg . apache . calc ite . build tools . bu il dex t . dsl Ċ Ċ import Ġjava . util . function . Function Ċ Ċ private Ġconst Ġval ĠS INGLE _ LINE _ COMMENT Ġ= Ġ"// .* +" Ċ private Ġconst Ġval ĠM ULT IL INE _ COMMENT Ġ= Ġ"/ [* ]( ?> \\\\ [* ] |[ * ][ ^ / ] |[ ^ * ])* + [* ] /" Ċ private Ġconst Ġval ĠSTRING _ LITERAL Ġ= Ġ"\" ( ?> \\\\ .| [^ \" ])* +\ "" Ċ private Ġconst Ġval ĠCHAR _ LITERAL Ġ= Ġ"' ( ?> \\\\ .| [^ ']) '" Ċ Ċ private Ġconst Ġval ĠKEY WORDS Ġ= Ġ"\\ b ( ?> for | if | return | switch | try | while )\\ b " Ċ private Ġconst Ġval ĠKEY WORD _ BLOCK Ġ= Ġ"$ KEYWORD S Ġ* \\ (" Ċ private Ġconst Ġval ĠWH ITES PACE Ġ= Ġ"( ?: (? ! $ KEYWORD S |[ (), \" '/ ]). ) ++ " Ċ Ċ // ĠBelow ĠRegex Ġmatches Ġone Ġtoken Ġat Ġa Ġtime Ċ // ĠThat Ġis Ġit Ġbreaks Ġif Ġ(! can Cast From (/* comment */ call Binding , Ġthrow On Failure Ġinto Ġthe Ġfollowing Ġsequence Ċ // Ġ" if Ġ( ", Ġ"! can Cast From ", Ġ" (", Ġ" /* comment */ ", Ġ" call Binding ", Ġ",", Ġ" Ġthrow On Failure " Ċ // ĠThis Ġenables Ġto Ġskip Ġstrings , Ġcomments , Ġand Ġcapture Ġthe Ġposition Ġof Ġcommas Ġand Ġparent hesis Ċ Ċ private Ġval Ġtokenizer Ġ= ĊĠĠĠ ĠRegex ("( ?> $ SINGLE _ LINE _ COMMENT |$ MULT IL INE _ COMMENT |$ STRING _ LITERAL |$ CHAR _ LITERAL |$ KEYWORD _ BLOCK |$ WH ITES PACE |. )") Ċ private Ġval Ġlooks Like Javadoc Ġ= ĠRegex ("^ Ġ+ \\ * Ġ") Ċ Ċ // ĠNote : Ġif Ġyou Ġchange Ġthe Ġlogic , Ġplease Ġremember Ġto Ġupdate Ġthe Ġvalue Ġin Ċ // Ġbuild . gradle . k ts Ġ/ Ġbump This Number If AC ustom Step Changes Ċ // ĠOtherwise ĠAut ost yle Ġwould Ġassume Ġthe Ġfiles Ġare Ġup Ġto Ġdate Ċ object ĠParent hesis Balancer Ġ: ĠFunction < String , ĠString > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġapply ( v : ĠString ): ĠString Ġ= Ġv . lines (). map Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ(' (' Ġ! in Ġline Ġ|| Ġlooks Like Javadoc . contains Match In ( line )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġline ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġbalance Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġseen Open Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġcomma Split Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġlast Open Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( m Ġin Ġtokenizer . findAll ( line )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġm . range ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range . last Ġ- Ġrange . first Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġparent hesis Ġalways Ġtake Ġone Ġchar , Ġso Ġignore Ġlong Ġmatches ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġline [ range . first ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'(' ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseen Open Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( balance Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Open Ġ= Ġrange . first Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! seen Open ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ',' Ġ&& Ġbalance Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomma Split Ġ= Ġrange . first Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ') ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Ġ-= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( balance Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindent Ġ= Ġline . indexOf First Ġ{ Ġit Ġ!= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġif Ġ( comma Split Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġf 1 ( 1 , f 2 ( 2 ,... Ġ Ġpattern ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ^ -- Ġlast Open , Ġcomma Split = 0 Ġ( no Ġsplit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġis Ġsplit Ġright Ġafter Ġ(' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . substring ( 0 , Ġlast Open ) Ġ+ Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 4 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . substring ( last Open ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġf 1 ( 1 ), Ġf 2 ( 2 ,... Ġ Ġpattern ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠ Ġ^ ĠĠ Ġ^ -- Ġlast Open ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġ'-- Ġcomma Split ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġis Ġsplit Ġtwice : Ġright Ġafter Ġthe Ġcomma , Ġand Ġafter Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . substring ( 0 , Ġcomma Split ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . substring ( comma Split , Ġlast Open ). trim Start (' Ġ') Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 4 ) Ġ+ Ġline . substring ( last Open ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprintln (" --- \ n $ line \ n -> \ n $ res ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. join ToString ("\ n ") Ċ } Ċ