package Ġcom . github . w um o . javac pp Ċ Ċ import Ġorg . byte deco . javac pp . Loader Ċ import Ġorg . byte deco . javac pp . tools .* Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ data Ġclass ĠPre sets ( ĊĠ Ġval Ġinclude : ĠList < String >, ĊĠ Ġval Ġpreload : ĠList < String >, ĊĠ Ġval Ġlink : ĠList < String >, ĊĠ Ġval Ġtarget : ĠString , ĊĠ Ġval Ġmapper : Ġ( Info Map )-> Unit Ċ ) Ċ Ċ class ĠM Parser ( logger : ĠLogger Ġ= ĠLogger . create ( M Parser :: class . java ), Ġproperties : ĠProperties ): ĊĠ ĠParser ( logger , Ġproperties ) Ġ{ ĊĠĠĊĠ Ġfun Ġparse ( output Directory : ĠFile ?, Ġpreset : ĠPre sets ): ĠArray < File > Ġ{ ĊĠĠĠ Ġval Ġall Properties Ġ= ĠM Class Properties Loader . load ( properties , Ġpreset ) ĊĠĠĠ Ġval Ġcls Properties Ġ= ĠM Class Properties Loader . load ( properties , Ġpreset ) ĊĠĠĠĠĊĠĠĠ Ġval Ġc Includes : ĠMutable List < String > Ġ= ĠArrayList () ĊĠĠĠ Ġc Includes . addAll ( cls Properties [" platform . c include "]) ĊĠĠĠ Ġc Includes . addAll ( all Properties [" platform . c include "]) ĊĠĠĠĠĊĠĠĠ Ġval Ġcls Includes : ĠMutable List < String > Ġ= ĠArrayList () ĊĠĠĠ Ġcls Includes . addAll ( cls Properties [" platform . include "]) ĊĠĠĠ Ġcls Includes . addAll ( cls Properties [" platform . c include "]) ĊĠĠĠĠĊĠĠĠ Ġval Ġall Includes : ĠMutable List < String > Ġ= ĠArrayList () ĊĠĠĠ Ġall Includes . addAll ( all Properties [" platform . include "]) ĊĠĠĠ Ġall Includes . addAll ( all Properties [" platform . c include "]) ĊĠĠĠ Ġval Ġcls Targets Ġ= Ġcls Properties [" target "] ĊĠĠĠ Ġval Ġcls Globals Ġ= Ġcls Properties [" global "] ĊĠĠĠ Ġ// ĠThere Ġcan Ġonly Ġbe Ġone Ġtarget , Ġpick Ġthe Ġlast Ġone Ġset ĊĠĠĠ Ġval Ġtarget Ġ= Ġcls Targets [ cls Targets . size Ġ- Ġ 1 ] ĊĠĠĠ Ġval Ġglobal Ġ= Ġcls Globals [ cls Globals . size Ġ- Ġ 1 ] ĊĠĠĠĠĊĠĠĠ Ġinfo Map Ġ= ĠInfo Map () ĊĠĠĠ Ġleaf Info Map Ġ= ĠInfo Map () ĊĠĠĠ Ġpreset . mapper ( leaf Info Map ) ĊĠĠĠ Ġinfo Map . put All ( leaf Info Map ) ĊĠĠĠĠĊĠĠĠ Ġval Ġversion Ġ= ĠParser :: class . java . get Package (). implementation Version Ġ?: Ġ" unknown " ĊĠĠĠ Ġval Ġn Ġ= Ġglobal . lastIndexOf ('.') ĊĠĠĠ Ġvar Ġtext Ġ= Ġ"" ĊĠĠĠ Ġval Ġheader Ġ= Ġ"// ĠTarget ed Ġby ĠJava CPP Ġversion Ġ$ version : ĠDO ĠNOT ĠEDIT ĠTHIS ĠFILE \ n \ n " ĊĠĠĠ Ġval Ġglobal Header Ġ= Ġheader Ġ+ Ġif ( n Ġ>= Ġ 0 ) Ġ""" ĊĠĠ Ġpackage Ġ${ global . substring ( 0 , Ġn )}; ĊĠĠĠ ĊĠĠĠĊĠĠ Ġ""" . trim Indent () Ġelse Ġ"" ĊĠĠĠĠĊĠĠĠ Ġtext Ġ+= Ġ""" ĊĠĠĠĠĠ Ġimport Ġjava . nio .*; ĊĠĠĠĠĠ Ġimport Ġorg . byte deco . javac pp .*; ĊĠĠĠĠĠ Ġimport Ġorg . byte deco . javac pp . annotation .*; ĊĠĠĠĠĠĠ ĊĠĠĠĠĠĠĊĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĊĠĠĠ Ġval Ġglobal Text Ġ= ĊĠĠĠĠĠ Ġ""" $ global Header ${ text } Ċ @ Properties ( ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ@ Platform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Ġ= Ġ{ ${ preset . include . join ToString Ġ{ Ġ"\" $ it \"" Ġ}} }, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreload Ġ= Ġ{ ${ preset . preload . join ToString Ġ{ Ġ"\" $ it \"" Ġ}} }, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlink Ġ= Ġ{ ${ preset . link . join ToString Ġ{ Ġ"\" $ it \"" Ġ}}} ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġtarget Ġ= Ġ"${ preset . target }" Ċ ) Ċ public Ġclass Ġ${ global . substring ( n Ġ+ Ġ 1 )} Ġ Ġ{ ĊĠĠĠ Ġstatic Ġ{ ĠLoader . load (); Ġ} Ċ """ ĊĠĠĠĠĊĠĠĠ Ġval Ġtarget Path Ġ= Ġtarget . replace ('.', ĠFile . separator Char ) ĊĠĠĠ Ġval Ġglobal Path Ġ= Ġglobal . replace ('.', ĠFile . separator Char ) ĊĠĠĠ Ġval Ġtarget File Ġ= ĠFile ( output Directory , Ġtarget Path ) ĊĠĠĠ Ġval Ġglobal File Ġ= ĠFile ( output Directory , Ġ"$ global Path . java ") ĊĠĠĠ Ġlogger . info (" Target ing Ġ$ global File ") ĊĠĠĠ Ġval Ġcontext Ġ= ĠContext () ĊĠĠĠ Ġcontext . info Map Ġ= Ġinfo Map ĊĠĠĠ Ġcontext . object ify Ġ= Ġfalse ĊĠĠĠ Ġval Ġpaths Ġ= Ġall Properties [" platform . include path "] ĊĠĠĠ Ġfor ( s Ġin Ġall Properties [" platform . incl uder es ource "]) ĊĠĠĠĠĠ Ġfor ( f Ġin ĠLoader . cache Resources ( s )) ĊĠĠĠĠĠĠĠ Ġpaths . add ( f . canonical Path ) ĊĠĠĠĠĊĠĠĠ Ġif ( cls Includes . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġlogger . info (" Nothing Ġtargeted Ġfor Ġ$ global File ") ĊĠĠĠĠĠ Ġreturn Ġempty Array () ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġval Ġinclude Paths Ġ= Ġpaths . to Typed Array () ĊĠĠĠ Ġvar Ġdecl List Ġ= ĠDeclaration List () ĊĠĠĠ Ġdecl List Ġ= ĠDeclaration List ( decl List ) ĊĠĠĠ Ġif ( cls Includes . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġcontainers ( context , Ġdecl List ) ĊĠĠĠĠĠ Ġfor ( include Ġin Ġall Includes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis C File Ġ= Ġc Includes . contains ( include ) ĊĠĠĠĠĠĠĠ Ġparse ( context , Ġdecl List , Ġinclude Paths , Ġinclude , Ġis C File ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġval Ġglobal Dir Ġ= Ġglobal File . parent File ĊĠĠĠ Ġif ( target Ġ!= Ġglobal ) Ġ{ ĊĠĠĠĠĠ Ġtarget File . mkdir s () ĊĠĠĠ Ġ} ĊĠĠĠ Ġglobal Dir ?. mkdir s () ĊĠĠĠ Ġval Ġoutput Files Ġ= ĠlistOf ( global File ) ĊĠĠĠ Ġ( encoding ?. let Ġ{ ĠEncoding FileWriter ( global File , Ġit , Ġline Separator ) Ġ} ĊĠĠĠĠĠ Ġ?: ĠEncoding FileWriter ( global File , Ġline Separator )). use Ġ{ Ġout -> ĊĠĠĠĠĠ Ġout . append ( global Text ) ĊĠĠĠĠĠ Ġvar Ġprev d : ĠDeclaration ? Ġ= Ġnull ĊĠĠĠĠĠ Ġfor ( d Ġin Ġdecl List ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( prev d Ġ!= Ġnull ) Ġout . append ( prev d . text ) ĊĠĠĠĠĠĠĠ Ġprev d Ġ= Ġd ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif ( prev d Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . append ( prev d . text ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġout . append ("\ n }\ n "). close () ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġreturn Ġoutput Files . to Typed Array () ĊĠ Ġ} Ċ }