/* Ċ Ġ* ĠĠĠĠĠ ĠK ores Ġ- ĠJava Ġsource Ġand ĠByte code Ġgeneration Ġframework Ġ< https :// github . com / Jon athan xD / K ores > Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ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 . helper Ċ Ċ import Ġcom . k ores framework . k ores . Instruction Ċ import Ġcom . k ores framework . k ores . Types Ċ import Ġcom . k ores framework . k ores . base . If Expr Ċ import Ġcom . k ores framework . k ores . base . If Group Ċ import Ġcom . k ores framework . k ores . factory . invoke Virtual Ċ import Ġcom . k ores framework . k ores . factory . isInstanceOf Ċ import Ġcom . k ores framework . k ores . factory . type Spec Ċ import Ġcom . k ores framework . k ores . operator . Operator Ċ import Ġcom . k ores framework . k ores . operator . Operators Ċ import Ġjava . lang . reflect . Type Ċ Ċ /** Ċ Ġ* ĠIf Ġexpression Ġhelper . Ċ Ġ*/ Ċ class ĠIf Expression Helper Ġprivate Ġconstructor () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlist Ġ= Ġmutable ListOf < Instruction >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġ[ part 1 ] Ġ[ operation ] Ġ[ part 2 ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck ( ĊĠĠĠĠĠĠĠ Ġpart 1 : ĠInstruction , ĊĠĠĠĠĠĠĠ Ġoperation : ĠOperator . Conditional , ĊĠĠĠĠĠĠĠ Ġpart 2 : ĠInstruction ĊĠĠĠ Ġ): ĠIf Expression Helper Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . list . add ( If Expr ( part 1 , Ġoperation , Ġpart 2 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComp ares Ġ[ part 1 ] Ġand Ġ[ part 2 ] Ġby Ġreference . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck Ref Equal ( part 1 : ĠInstruction , Ġpart 2 : ĠInstruction ): ĠIf Expression Helper Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . list . add ( If Expr ( part 1 , ĠOperators . EQUAL _ TO , Ġpart 2 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComp ares Ġ[ part 1 ] Ġand Ġ[ part 2 ] Ġusing Ġ[ Any . equals ] Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck Object Equal ( part 1 : ĠInstruction , Ġpart 2 : ĠInstruction ): ĠIf Expression Helper Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . check True ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Virtual ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAny :: class . java , Ġpart 1 , Ġ" equals ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec ( Types . BOOLEAN , ĠTypes . OBJECT ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( part 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġ[ part 1 ] Ġis Ġnot Ġ` null `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠcheckNotNull ( part 1 : ĠInstruction ): ĠIf Expression Helper Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . list . add ( com . k ores framework . k ores . factory . checkNotNull ( part 1 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġ[ part 1 ] Ġis Ġ` null `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck Null ( part 1 : ĠInstruction ): ĠIf Expression Helper Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . list . add ( com . k ores framework . k ores . factory . check Null ( part 1 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġ[ part 1 ] Ġis Ġ` true `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck True ( part 1 : ĠInstruction ): ĠIf Expression Helper Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . list . add ( com . k ores framework . k ores . factory . check True ( part 1 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġ[ part 1 ] Ġis Ġ` false `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck False ( part 1 : ĠInstruction ): ĠIf Expression Helper Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . list . add ( com . k ores framework . k ores . factory . check False ( part 1 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġ[ part 1 ] Ġis Ġ` instance of ` Ġ[ type ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck Instance ( part 1 : ĠInstruction , Ġtype : ĠType ): ĠIf Expression Helper Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . list . add ( isInstanceOf ( part 1 , Ġtype )) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠAnd ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAnd Ġchecks Ġif Ġ[ part 1 ] Ġ[ operation ] Ġ[ part 2 ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġand ( ĊĠĠĠĠĠĠĠ Ġpart 1 : ĠInstruction , ĊĠĠĠĠĠĠĠ Ġoperation : ĠOperator . Conditional , ĊĠĠĠĠĠĠĠ Ġpart 2 : ĠInstruction ĊĠĠĠ Ġ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . and (). check ( part 1 , Ġoperation , Ġpart 2 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAnd Ġcomp ares Ġ[ part 1 ] Ġand Ġ[ part 2 ] Ġby Ġreference . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġand Ref Equal ( part 1 : ĠInstruction , Ġpart 2 : ĠInstruction ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . and (). check Ref Equal ( part 1 , Ġpart 2 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAnd Ġcomp ares Ġ[ part 1 ] Ġand Ġ[ part 2 ] Ġusing Ġ[ Any . equals ] Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġand Object Equal ( part 1 : ĠInstruction , Ġpart 2 : ĠInstruction ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . and (). check Object Equal ( part 1 , Ġpart 2 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAnd Ġchecks Ġif Ġ[ part 1 ] Ġis Ġnot Ġ` null `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġand NotNull ( part 1 : ĠInstruction ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . and (). checkNotNull ( part 1 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAnd Ġchecks Ġif Ġ[ part 1 ] Ġis Ġ` null `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġand Null ( part 1 : ĠInstruction ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . and (). check Null ( part 1 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAnd Ġchecks Ġif Ġ[ part 1 ] Ġis Ġ` true `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġand True ( part 1 : ĠInstruction ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . and (). check True ( part 1 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAnd Ġchecks Ġif Ġ[ part 1 ] Ġis Ġ` false `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġand False ( part 1 : ĠInstruction ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . and (). check False ( part 1 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAnd Ġchecks Ġif Ġ[ part 1 ] Ġis Ġ` instance of ` Ġ[ type ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġand Check Instance ( part 1 : ĠInstruction , Ġtype : ĠType ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . and (). check Instance ( part 1 , Ġtype ) ĊĊĊĠĠĠ Ġ// ĠOr ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOr Ġchecks Ġif Ġ[ part 1 ] Ġ[ operation ] Ġ[ part 2 ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġor ( ĊĠĠĠĠĠĠĠ Ġpart 1 : ĠInstruction , ĊĠĠĠĠĠĠĠ Ġoperation : ĠOperator . Conditional , ĊĠĠĠĠĠĠĠ Ġpart 2 : ĠInstruction ĊĠĠĠ Ġ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . or (). check ( part 1 , Ġoperation , Ġpart 2 ) ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOr Ġcomp ares Ġ[ part 1 ] Ġand Ġ[ part 2 ] Ġby Ġreference . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġor Ref Equal ( part 1 : ĠInstruction , Ġpart 2 : ĠInstruction ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . or (). check Ref Equal ( part 1 , Ġpart 2 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOr Ġcomp ares Ġ[ part 1 ] Ġand Ġ[ part 2 ] Ġusing Ġ[ Any . equals ] Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġor Object Equal ( part 1 : ĠInstruction , Ġpart 2 : ĠInstruction ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . or (). check Object Equal ( part 1 , Ġpart 2 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOr Ġchecks Ġif Ġ[ part 1 ] Ġis Ġnot Ġ` null `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġor NotNull ( part 1 : ĠInstruction ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . or (). checkNotNull ( part 1 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOr Ġchecks Ġif Ġ[ part 1 ] Ġis Ġ` null `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġor Null ( part 1 : ĠInstruction ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . or (). check Null ( part 1 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOr Ġchecks Ġif Ġ[ part 1 ] Ġis Ġ` true `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġor True ( part 1 : ĠInstruction ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . or (). check True ( part 1 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOr Ġchecks Ġif Ġ[ part 1 ] Ġis Ġ` false `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġor False ( part 1 : ĠInstruction ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . or (). check False ( part 1 ) ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOr Ġchecks Ġif Ġ[ part 1 ] Ġis Ġ` instance of ` Ġ[ type ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġor Check Instance ( part 1 : ĠInstruction , Ġtype : ĠType ): ĠIf Expression Helper Ġ= ĊĠĠĠĠĠĠĠ Ġthis . or (). check Instance ( part 1 , Ġtype ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġand Ġexpression . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġand (): ĠIf Expression Helper Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . list . add ( Operators . AND ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġor Ġexpression . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġor (): ĠIf Expression Helper Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . list . add ( Operators . OR ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġa Ġif Ġgroup Ġto Ġexpression Ġlist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd If Group ( if Group : ĠIf Group ): ĠIf Expression Helper Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . list . add ( if Group ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuild Ġexpressions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild (): ĠList < Instruction > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . list ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġ[ If Expression Helper ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġbuilder (): ĠIf Expression Helper Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIf Expression Helper () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ