import Ġcom . bn orm . template . Template Component Registrar Ċ import Ġcom . tsch uch ort . compile testing . Kotlin Compilation Ċ import Ġcom . tsch uch ort . compile testing . SourceFile Ċ import Ġorg . apache . commons . cli .* Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Files Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġoptions Ġ= ĠOptions () ĊĊĠĠĠ Ġval Ġsrc Opt Ġ= ĠOption . builder (). option (" s "). long Opt (" source ") ĊĠĠĠĠĠĠĠ Ġ. has Arg ( true ). arg Name (" PATH "). numberOf Args ( Option . UN LIMIT ED _ VALUES ) ĊĠĠĠĠĠĠĠ Ġ. required ( true ). desc (" Sources Ġ(. zip /. jar Ġfile Ġor Ġdirectory ). "). build () ĊĠĠĠ Ġoptions . add Option ( src Opt ) ĊĊĠĠĠ Ġval Ġir Opt Ġ= ĠOption . builder (). option (" c "). long Opt (" add - classpath ") ĊĠĠĠĠĠĠĠ Ġ. has Arg ( true ). arg Name (" PATH "). numberOf Args ( Option . UN LIMIT ED _ VALUES ) ĊĠĠĠĠĠĠĠ Ġ. desc (" IR Ġ. jar Ġfile , Ġused Ġto Ġprovide Ġcode Ġdependencies . "). build () ĊĠĠĠ Ġoptions . add Option ( ir Opt ) ĊĊĠĠĠ Ġval Ġinherit Classpath Opt Ġ= ĠOption ( null , Ġ" inherit - classpath ", Ġfalse , Ġ" Inherit Ġthe Ġclasspath Ġof Ġthe Ġcurrent Ġprogram . ĠThis Ġis Ġprovided Ġfor Ġtest Ġpurposes .") ĊĠĠĠ Ġoptions . add Option ( inherit Classpath Opt ) ĊĊĠĠĠ Ġval Ġout Opt Ġ= ĠOption . builder (). option (" o "). long Opt (" out ") ĊĠĠĠĠĠĠĠ Ġ. has Arg ( true ). arg Name (" PATH ") ĊĠĠĠĠĠĠĠ Ġ. desc (" The Ġoutput Ġdirectory . "). build () ĊĠĠĠ Ġoptions . add Option ( out Opt ) ĊĊĠĠĠ Ġval Ġir Comp lement Opt Ġ= ĠOption . builder (). long Opt (" add - classpath - complement ") ĊĠĠĠĠĠĠĠ Ġ. has Arg ( true ). arg Name (" JAR "). numberOf Args ( 1 ) ĊĠĠĠĠĠĠĠ Ġ. desc (" Add Ġto Ġthe Ġclasspath Ġthe Ġcomplement Ġof Ġthe Ġgiven ĠJ AR Ġfile . ĠThis Ġis Ġan Ġexperimental Ġflag . "). build () ĊĠĠĠ Ġoptions . add Option ( ir Comp lement Opt ) ĊĊĠĠĠ Ġval Ġhelp Opt Ġ= ĠOption (" h ", Ġ" help ", Ġfalse , Ġ" Print Ġhelp .") ĊĠĠĠ Ġoptions . add Option ( help Opt ) ĊĊĠĠĠ Ġif Ġ( args . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġprint Usage ( options ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġparser : ĠCommandLine Parser Ġ= ĠDefault Parser () ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcli Ġ= Ġparser . parse ( options , Ġargs ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cli . has Option ( help Opt . opt )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Usage ( options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġcli . getOption Value ( out Opt . opt ) ĊĠĠĠĠĠĠĠ Ġval Ġsource Dir Ġ= Ġcli . getOption Value ( src Opt ) ĊĠĠĠĠĠĠĠ Ġval Ġir J ars Ġ= Ġcli . getOption Values ( ir Opt ) Ġ?: ĠarrayOf () ĊĠĠĠĠĠĠĠ Ġif Ġ(! File ( source Dir ). isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Source Ġparameter Ġmust Ġbe Ġa Ġdirectory : Ġ$ source Dir ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġout Dir Ġ= ĠFile ( output Dir ) ĊĠĠĠĠĠĠĠ Ġprintln (" Using Ġoutput Ġdirectory : Ġ${ out Dir . canonical Path }") ĊĠĠĠĠĠĠĠ Ġif Ġ(! out Dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ output Dir Ġdoes Ġnot Ġexist , Ġcreating ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Dir . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcomplement Ġ= Ġcomplement Code ( cli , Ġir Comp lement Opt ) ĊĠĠĠĠĠĠĠ Ġval Ġcomponent Registrar Ġ= ĠTemplate Component Registrar ( output Dir ) ĊĠĠĠĠĠĠĠ Ġval Ġkt Files Ġ= ĠFile ( source Dir ). walk Top Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . toString (). endsWith (". kt ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠSource File . from Path ( File ( it . toString ())) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġkotlin c Ġ= ĠKotlin Compilation (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġkt Files . toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse IR Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompiler Plugins Ġ= ĠlistOf ( component Registrar ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinherit Class Path Ġ= Ġcli . has Option ( inherit Classpath Opt . long Opt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass paths Ġ= Ġir J ars . map Ġ{ ĠFile ( it ) Ġ}. toList () Ġ+ Ġcomplement ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġkotlin c . compile () ĊĠĠĠ Ġ} Ġcatch Ġ( exc Ġ: ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexc . printStackTrace () ĊĠĠĠĠĠĠĠ Ġprint Usage ( options ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġprint Usage ( options : ĠOptions ) Ġ{ ĊĠĠĠ Ġval Ġformatter Ġ= ĠHelp Formatter () ĊĠĠĠ Ġformatter . width Ġ= Ġ 1 0 0 ĊĠĠĠ Ġformatter . print Help (" kotlin - compiler - plugin Ġ[ OPTION ] ...", Ġoptions ) Ċ } Ċ Ċ private Ġfun Ġcomplement Code ( cli Ġ: ĠCommandLine , Ġir Comp lement Opt Ġ: ĠOption ) Ġ: ĠList < File > Ġ{ ĊĠĠĠ Ġif Ġ( cli . has Option ( ir Comp lement Opt . long Opt )) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Comp uting Ġcode Ġcomplement ...") ĊĠĠĠĠĠĠĠ Ġval Ġtmp Jar Comp lement Dir Ġ= ĠFiles . create Temp Directory (" kotlin c - plugin - j phantom "). to File () ĊĠĠĠĠĠĠĠ Ġ// Ġtmp Jar Comp lement Dir . delete On Exit () ĊĠĠĠĠĠĠĠ Ġval Ġcomplement Jar Ġ= ĠFile ( tmp Jar Comp lement Dir , Ġ" complement . jar ") ĊĠĠĠĠĠĠĠ Ġval Ġcomplement Jar Path Ġ= Ġcomplement Jar . canonical Path ĊĠĠĠĠĠĠĠ Ġval Ġph antom s Dir Ġ= ĠFile ( tmp Jar Comp lement Dir , Ġ" phantom s ") ĊĠĠĠĠĠĠĠ Ġph antom s Dir . mkdir s () ĊĠĠĠĠĠĠĠ Ġval Ġir Jar Ġ= Ġcli . getOption Value ( ir Comp lement Opt . long Opt ) ĊĠĠĠĠĠĠĠ Ġorg . cl y ze . j phantom . Driver . main ( array Of ( ir Jar , Ġ"- o ", Ġcomplement Jar Path , Ġ"- d ", Ġph antom s Dir . canonical Path , Ġ"- v ", Ġ" 0 ")) ĊĠĠĠĠĠĠĠ Ġif Ġ( complement Jar . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Using Ġcomplement ĠJ AR : Ġ$ complement Jar Path ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( complement Jar ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ERROR : Ġcould Ġnot Ġcreate Ġcomplement ĠJ AR Ġvia Ġj phantom .") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠlistOf () Ċ }