/* Ċ Ġ* ĠĠĠĠĠ ĠK ores - Byte code Writer Ġ- ĠTrans lates ĠK ores ĠStructure Ġto ĠJVM ĠByte code Ġ< https :// github . com / Jon athan xD / Code API - Byte code Writer > Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠ ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠThe Real Bug gy / Jon athan xD Ġ( https :// github . com / Jon athan xD /) Ġ< jon athan . script er @ program mer . net > Ċ Ġ* ĠĠĠĠĠ ĠCopyright Ġ( c ) Ġcontributors Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* ĠĠĠĠĠ Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* ĠĠĠĠĠ Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* ĠĠĠĠĠ Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* ĠĠĠĠĠ Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* ĠĠĠĠĠ Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* ĠĠĠĠĠ Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠĠĠĠĠ ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠĠĠĠĠ ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠĠĠĠĠ ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠĠĠĠĠ ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠĠĠĠĠ ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠĠĠĠĠ ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . k ores framework . k ores . byte code . processor . processors Ċ Ċ import Ġcom . k ores framework . k ores . Instructions Ċ import Ġcom . k ores framework . k ores . Types Ċ import Ġcom . k ores framework . k ores . base .* Ċ import Ġcom . k ores framework . k ores . byte code . processor . METHOD _ VIS ITOR Ċ import Ġcom . k ores framework . k ores . factory .* Ċ import Ġcom . k ores framework . k ores . literal . L iterals Ċ import Ġcom . k ores framework . k ores . processor . Processor Ċ import Ġcom . k ores framework . k ores . processor . Processor Manager Ċ import Ġcom . github . jon athan xd . i utils . data . Typed Data Ċ import Ġcom . github . jon athan xd . i utils . kt . require Ċ Ċ object ĠTry With Resources Processor Ġ: ĠProcessor < Try With Resources > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( ĊĠĠĠĠĠĠĠ Ġpart : ĠTry With Resources , ĊĠĠĠĠĠĠĠ Ġdata : ĠTyped Data , ĊĠĠĠĠĠĠĠ Ġprocessor Manager : ĠProcessor Manager < *> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmv Helper Ġ= ĠMETHOD _ VIS ITOR . require ( data ) ĊĠĠĠĠĠĠĠ Ġval Ġvari Ġ= Ġpart . variable ĊĊĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġtry - catch Ġinitialize Ġfield ĊĠĠĠĠĠĠĠ Ġprocessor Manager . process ( Variable Declaration :: class . java , Ġvari , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġval Ġthrowable FieldName Ġ= Ġmv Helper . get Unique Variable Name ("\ $ throwable _ ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġexception Ġfield ĊĠĠĠĠĠĠĠ Ġval Ġthrowable Variable Ġ= Ġvariable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġthrowable FieldName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠTypes . THROW ABLE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠL iterals . NULL ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprocessor Manager . process ( Variable Declaration :: class . java , Ġthrowable Variable , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġtry Ġblock ĊĠĠĠĠĠĠĠ Ġval Ġcatch _ Ġ= Ġmv Helper . get Unique Variable Name ("\ $ catch _ ") ĊĠĠĠĠĠĠĠ Ġval Ġcatch Statement Ġ= Ġcatch Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Types . THROW ABLE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariable ( Types . THROW ABLE , Ġcatch _), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInstructions . from Var Args ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Variable Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTypes . THROW ABLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable FieldName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Variable ( Types . THROW ABLE , Ġcatch _) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Exception ( access Variable ( Types . THROW ABLE , Ġcatch _)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcatch 2 _ name Ġ= Ġmv Helper . get Unique Variable Name ("\ $ catch _ 2 _ ") ĊĊĠĠĠĠĠĠĠ Ġ// Auto Closeable # close (); ĊĠĠĠĠĠĠĠ Ġval Ġclose Invocation Ġ= Ġinvoke Interface ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Closeable :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Variable ( vari . variable Type , Ġvari . name ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" close ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Spec ( Types . VOID ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Throwable # add Sup pressed ( Throwable ) ĊĠĠĠĠĠĠĠ Ġval Ġadd Sup pressed Invocation Ġ= Ġinvoke Virtual ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTypes . THROW ABLE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Variable ( throwable Variable . variable Type , Ġthrowable Variable . name ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" add Sup pressed ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Spec ( Types . VOID , ĠlistOf ( Types . THROW ABLE )), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( access Variable ( Types . THROW ABLE , Ġcatch 2 _ name )) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsur rounded Close Invocation Ġ= Ġtry Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInstructions . from Part ( close Invocation ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Types . THROW ABLE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable ( Types . THROW ABLE , Ġcatch 2 _ name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstructions . from Part ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Sup pressed Invocation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcatch Statements Ġ= Ġjava . util . ArrayList < Catch Statement >() ĊĊĠĠĠĠĠĠĠ Ġcatch Statements . add ( catch Statement ) ĊĠĠĠĠĠĠĠ Ġcatch Statements . addAll ( part . catch Statements ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtry Catch Statement Ġ= Ġtry Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpart . body , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Statements , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInstructions . from Part ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( access Variable ( vari . type , Ġvari . name )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstructions . from Part ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable Variable . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable Variable . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstructions . from Part ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsur rounded Close Invocation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstructions . from Part ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Invocation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ Ġpart . finally Statement ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprocessor Manager . process ( Try Statement :: class . java , Ġtry Catch Statement , Ġdata ) ĊĠĠĠ Ġ} ĊĊ Ċ }