package Ġorg . moe . tools . class validator . substr ate Ċ Ċ import Ġcom . google . gson . JsonArray Ċ import Ġcom . google . gson . JsonObject Ċ import Ġcom . google . gson . internal . Streams Ċ import Ġcom . google . gson . stream . Json Writer Ċ import Ġorg . object web . asm . Type Ċ import Ġjava . io . File Ċ Ċ class ĠReflection Config Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMap Ġof Ġinternal Ġclass Ġname Ġto Ġthe Ġ[ Class Conf ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġclasses : ĠMutable Map < String , ĠClass Conf > Ġ= Ġsorted Map Of () ĊĊĠĠĠ Ġprivate Ġfun Ġensure Class ( ĊĠĠĠĠĠĠĠ ĠclassName : ĠString , ĊĠĠĠĠĠĠĠ Ġall Declared Construct ors : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġall Public Construct ors : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġall Declared Methods : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġall Public Methods : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġall Declared Classes : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġall Public Classes : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġ): ĠClass Conf Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġclasses . get Or Put ( className ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass Conf ( name Ġ= Ġget Binary ClassName ( className )) ĊĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . all Declared Construct ors Ġ= Ġthis . all Declared Construct ors Ġ|| Ġall Declared Construct ors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . all Public Construct ors Ġ= Ġthis . all Public Construct ors Ġ|| Ġall Public Construct ors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . all Declared Methods Ġ= Ġthis . all Declared Methods Ġ|| Ġall Declared Methods ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . all Public Methods Ġ= Ġthis . all Public Methods Ġ|| Ġall Public Methods ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . all Declared Classes Ġ= Ġthis . all Declared Classes Ġ|| Ġall Declared Classes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . all Public Classes Ġ= Ġthis . all Public Classes Ġ|| Ġall Public Classes ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Class ( ĊĠĠĠĠĠĠĠ ĠclassName : ĠString , ĊĠĠĠĠĠĠĠ Ġall Declared Construct ors : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġall Public Construct ors : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġall Declared Methods : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġall Public Methods : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġall Declared Classes : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġall Public Classes : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Class ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠclassName Ġ= ĠclassName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Declared Construct ors Ġ= Ġall Declared Construct ors , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Public Construct ors Ġ= Ġall Public Construct ors , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Declared Methods Ġ= Ġall Declared Methods , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Public Methods Ġ= Ġall Public Methods , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Declared Classes Ġ= Ġall Declared Classes , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Public Classes Ġ= Ġall Public Classes , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Class ( className : ĠString , Ġexport All : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Class ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠclassName Ġ= ĠclassName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Declared Construct ors Ġ= Ġexport All , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Public Construct ors Ġ= Ġexport All , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Declared Methods Ġ= Ġexport All , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Public Methods Ġ= Ġexport All , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Declared Classes Ġ= Ġexport All , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Public Classes Ġ= Ġexport All ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Method ( decl aring Class : ĠString , ĠmethodName : ĠString , Ġmethod Descriptor : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġensure Class ( decl aring Class ) ĊĊĠĠĠĠĠĠĠ Ġc . methods . add ( Method Conf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠmethodName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Types Ġ= ĠType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Argument Types ( method Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . className Ġ}, ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Field ( decl aring Class : ĠString , ĠfieldName : ĠString , Ġallow Write : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġensure Class ( decl aring Class ) ĊĊĠĠĠĠĠĠĠ Ġc . fields . add ( Field Conf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠfieldName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallow Write Ġ= Ġallow Write , ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave ( filePath : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarr Ġ= ĠJson Array () ĊĊĠĠĠĠĠĠĠ Ġclasses . values . forEach Ġ{ Ġclazz Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġco Ġ= ĠJsonObject () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco . addProperty (" name ", Ġclazz . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clazz . all Declared Construct ors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco . addProperty (" all Declared Construct ors ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clazz . all Public Construct ors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco . addProperty (" all Public Construct ors ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clazz . all Declared Methods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco . addProperty (" all Declared Methods ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clazz . all Public Methods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco . addProperty (" all Public Methods ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clazz . all Declared Classes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco . addProperty (" all Declared Classes ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clazz . all Public Classes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco . addProperty (" all Public Classes ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clazz . fields . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf arr Ġ= ĠJson Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . fields . forEach Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfo Ġ= ĠJsonObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfo . addProperty (" name ", Ġfield . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field . allow Write ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfo . addProperty (" allow Write ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf arr . add ( fo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco . add (" fields ", Ġf arr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clazz . methods . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm arr Ġ= ĠJson Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . methods . forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmo Ġ= ĠJsonObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmo . addProperty (" name ", Ġmethod . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp arr Ġ= ĠJson Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . parameter Types . forEach ( par r :: add ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmo . add (" parameter Types ", Ġp arr ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm arr . add ( mo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco . add (" methods ", Ġm arr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġarr . add ( co ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠfilePath . print Writer (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Writer Ġ= ĠJson Writer ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Writer . set Indent (" ĠĠĠ Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStreams . write ( arr , Ġjson Writer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ property Ġname Ġthe Ġbinary Ġname Ġof Ġthis Ġclass ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġdata Ġclass ĠClass Conf ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġvar Ġall Declared Construct ors : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġall Public Construct ors : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġall Declared Methods : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġall Public Methods : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġall Declared Classes : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġall Public Classes : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġfields : ĠMutable Set < Field Conf > Ġ= Ġlinked Set Of (), ĊĠĠĠĠĠĠĠ Ġval Ġmethods : ĠMutable Set < Method Conf > Ġ= Ġlinked Set Of (), ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠField Conf ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġallow Write : ĠBoolean , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ property Ġparameter Types Ġlist Ġof Ġbinary Ġname Ġof Ġparameter Ġtypes ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġdata Ġclass ĠMethod Conf ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġparameter Types : ĠList < String >, ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Binary ClassName ( internal Name : ĠString ): ĠString Ġ= ĠType . get ObjectType ( internal Name ). className ĊĠĠĠ Ġ} Ċ } Ċ