package Ġpl . m are k lang iew ic z . deps Ċ Ċ import Ġok io . FileSystem Ċ import Ġok io . IOException Ċ import Ġok io . Path Ċ import Ġok io . Path . Companion . to Path Ċ import Ġok io . buffer Ċ import Ġorg . gradle . api . Project Ċ import Ġkotlin . io . println Ċ import Ġkotlin . io . use Ċ import Ġkotlin . text . Regex Option . MULT IL INE Ċ Ċ @ Throws ( IOException :: class ) Ċ fun ĠFileSystem . findAll Files ( path : ĠPath , Ġmax Depth : ĠInt Ġ= ĠInt . MAX _ VALUE ): ĠSequence < Path > Ġ{ ĊĠĠĠ Ġrequire ( max Depth Ġ>= Ġ 0 ) ĊĠĠĠ Ġval Ġmd Ġ= Ġmetadata ( path ) ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġmd . is Regular File Ġ-> Ġsequence Of ( path ) ĊĠĠĠĠĠĠĠ Ġmax Depth Ġ< Ġ 1 Ġ|| Ġ! md . isDirectory Ġ-> Ġempty Sequence () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlist ( path ). as Sequence (). flatMap Ġ{ ĠfindAll Files ( it , Ġmax Depth Ġ- Ġ 1 ) Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun ĠFileSystem . findAll Kt Files ( root : ĠPath , Ġmax Depth : ĠInt Ġ= ĠInt . MAX _ VALUE ) Ġ= ĊĠĠĠ ĠfindAll Files ( root , Ġmax Depth ). filter Ġ{ Ġit . name . endsWith (". kt ") Ġ} Ċ Ċ fun ĠFileSystem . comment Out Multi platform Fun In Each Kt File ( root : ĠPath ) Ġ= ĊĠĠĠ ĠfindAll Kt Files ( root ). forEach Ġ{ Ġcomment Out Multi platform Fun In File ( it ) Ġ} Ċ Ċ fun ĠFileSystem . undo Comment Out Multi platform Fun In Each Kt File ( root : ĠPath ) Ġ= ĊĠĠĠ ĠfindAll Kt Files ( root ). forEach Ġ{ Ġundo Comment Out Multi platform Fun In File ( it ) Ġ} ĊĊ Ċ /** Ċ Ġ* Ġ@ param Ġinput Root Dir Ġpath Ġof Ġinput Ġroot Ġdir Ċ Ġ* Ġ@ param Ġoutput Root Dir Ġpath Ġof Ġoutput Ġroot Ġdir Ġ- Ġcan Ġbe Ġthe Ġsame Ġas Ġinput Root Dir ; Ċ Ġ* Ġnothing Ġis Ġwritten Ġto Ġfile Ġsystem Ġif Ġit 's Ġnull ; Ċ Ġ* Ġ@ param Ġprocess Ġfile Ġcontent Ġtransformation ; Ġif Ġit Ġreturns Ġnull Ġ- Ġoutput Ġfile Ġis Ġnot Ġeven Ġtouched Ċ Ġ*/ Ċ fun ĠFileSystem . process Each Kt File ( ĊĠĠĠ Ġinput Root Dir : ĠPath , ĊĠĠĠ Ġoutput Root Dir : ĠPath ? Ġ= Ġnull , ĊĠĠĠ Ġprocess : Ġ( input : ĠPath , Ġoutput : ĠPath ?, Ġcontent : ĠString ) Ġ-> ĠString ? Ċ ) Ġ{ ĊĠĠĠ Ġrequire ( input Root Dir . is Absolute ) ĊĠĠĠ Ġrequire ( output Root Dir ?. is Absolute Ġ?: Ġtrue ) ĊĠĠĠ ĠfindAll Kt Files ( input Root Dir ). forEach Ġ{ Ġinput Path Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġoutput Path Ġ= Ġif Ġ( output Root Dir Ġ== Ġnull ) Ġnull Ġelse Ġoutput Root Dir Ġ/ Ġinput Path . as Relative To ( input Root Dir ) ĊĠĠĠĠĠĠĠ Ġprocess File ( input Path , Ġoutput Path ) Ġ{ Ġcontent Ġ-> Ġprocess ( input Path , Ġoutput Path , Ġcontent ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠPath . as Relative To ( dir : ĠPath ): ĠPath Ġ{ ĊĠĠĠ Ġrequire ( this . is Absolute ) ĊĠĠĠ Ġrequire ( dir . is Absolute ) ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ġ== Ġdir Ġ-> Ġ". ". to Path () ĊĠĠĠĠĠĠĠ Ġparent Ġ== Ġdir Ġ-> Ġthis . name . to Path () ĊĠĠĠĠĠĠĠ Ġparent Ġ== Ġnull Ġ-> Ġerror (" Can Ġnot Ġfind Ġ$ dir Ġin Ġ$ this ") ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġparent !!. as Relative To ( dir ) Ġ/ Ġname ĊĠĠĠ Ġ} Ċ } Ċ Ċ val ĠProject . root Ok io Path Ġget (): ĠPath Ġ= Ġroot Dir . toString (). to Path () Ċ Ċ /** Ċ Ġ* Ġ@ param Ġinput Path Ġpath Ġof Ġinput Ġfile Ċ Ġ* Ġ@ param Ġoutput Path Ġpath Ġof Ġoutput Ġfile Ġ- Ġcan Ġbe Ġthe Ġsame Ġas Ġinput Path ; Ċ Ġ* Ġnothing Ġis Ġwritten Ġto Ġfile Ġsystem Ġif Ġit 's Ġnull ; Ċ Ġ* Ġ@ param Ġprocess Ġfile Ġcontent Ġtransformation ; Ġif Ġit Ġreturns Ġnull Ġ- Ġoutput Path Ġis Ġnot Ġeven Ġtouched Ċ Ġ*/ Ċ fun ĠFileSystem . process File ( input Path : ĠPath , Ġoutput Path : ĠPath ? Ġ= Ġnull , Ġprocess : Ġ( String ) Ġ-> ĠString ?) Ġ{ ĊĊĠĠĠ Ġval Ġinput Ġ= Ġsource ( input Path ). buffer (). use Ġ{ Ġit . read Utf 8 () Ġ} ĊĊĠĠĠ Ġval Ġoutput Ġ= Ġprocess ( input ) ĊĊĠĠĠ Ġif Ġ( output Path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( output Ġ!= Ġnull ) Ġprintln (" Warning : Ġignoring Ġnon - null Ġoutput Ġbecause Ġoutput Path Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( output Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Ign oring Ġoutput Path Ġbecause Ġoutput Ġto Ġwrite Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcreate Directories ( output Path . parent !! ) ĊĠĠĠ Ġsink ( output Path ). buffer (). use Ġ{ Ġit . write Utf 8 ( output ) Ġ} Ċ } Ċ Ċ fun ĠFileSystem . comment Out Multi platform Fun In File ( file : ĠPath ) Ġ{ ĊĠĠĠ Ġprintln ("\ n comment ing : Ġ$ file ") Ġ// ĠFIXME : remove / u log ĊĊĠĠĠ Ġprocess File ( file , Ġfile ) Ġ{ Ġinput Ġ-> ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput 1 Ġ= Ġ ure Not Comment ed Out Area ( ure Expect Fun ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compile ( MULT IL INE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( input ) Ġ{ Ġ" /* \ n ${ it . value }\ n */ " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput 2 Ġ= Ġir (" actual Ġfun "). compile (). replace ( output 1 ) Ġ{ Ġ" /* actual */ Ġfun " Ġ} ĊĊĠĠĠĠĠĠĠ Ġir (" actual Ġsuspend Ġfun "). compile (). replace ( output 2 ) Ġ{ Ġ" /* actual */ Ġsuspend Ġfun " Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠFIXME : Ġmerge Ġthis Ġtwo Ġreplaces Ġto Ġone Ġusing Ġbetter ĠU RE ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠFileSystem . undo Comment Out Multi platform Fun In File ( file : ĠPath ) Ġ{ ĊĠĠĠ Ġprintln ("\ n undo Ġcomments : Ġ$ file ") Ġ// ĠFIXME : remove / u log ĊĊĠĠĠ Ġprocess File ( file , Ġfile ) Ġ{ Ġinput Ġ-> ĊĊĠĠĠĠĠĠĠ Ġval Ġmy Fun Ġ= Ġ ure (" my Fun ") Ġ{ Ġ 1 Ġof Ġ ure Expect Fun Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput 1 Ġ= Ġ ure Comment ed Out Area ( my Fun ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compile ( MULT IL INE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( input ) Ġ{ Ġit . groups [" my Fun "] !!. value Ġ} ĊĊĠĠĠĠĠĠĠ Ġir ("/ \\ * actual \\ */ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compile () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( output 1 ) Ġ{ Ġ" actual " Ġ} ĊĠĠĠ Ġ} Ċ } Ċ