package Ġorg . jetbrains . research . k ex . re anim ator . call stack Ċ Ċ import Ġcom . abd ull in . k the l per . collection . queue Of Ċ import Ġcom . abd ull in . k the l per . logging . log Ċ import Ġorg . jetbrains . research . k ex . asm . util . Visibility Ċ import Ġorg . jetbrains . research . k ex . asm . util . visibility Ċ import Ġorg . jetbrains . research . k ex . config . k ex Config Ċ import Ġorg . jetbrains . research . k ex . k type .* Ċ import Ġorg . jetbrains . research . k ex . re anim ator . collector . external Construct ors Ċ import Ġorg . jetbrains . research . k ex . re anim ator . collector . has Setter Ċ import Ġorg . jetbrains . research . k ex . re anim ator . collector . setter Ċ import Ġorg . jetbrains . research . k ex . re anim ator . descriptor . Array Descriptor Ċ import Ġorg . jetbrains . research . k ex . re anim ator . descriptor . Descriptor Ċ import Ġorg . jetbrains . research . k ex . re anim ator . descriptor . Object Descriptor Ċ import Ġorg . jetbrains . research . k ex . re anim ator . descriptor . Static FieldDescriptor Ċ import Ġorg . jetbrains . research . k ex . smt . Checker Ċ import Ġorg . jetbrains . research . k ex . smt . Result Ċ import Ġorg . jetbrains . research . k ex . state . State Builder Ċ import Ġorg . jetbrains . research . k ex . state . transformer . TypeInfo Map Ċ import Ġorg . jetbrains . research . k ex . state . transformer . generate Final Descriptors Ċ import Ġorg . jetbrains . research . k fg . ir . Class Ċ import Ġorg . jetbrains . research . k fg . ir . Method Ċ import Ġorg . jetbrains . research . k fg . ir . Method Desc Ċ import Ġorg . jetbrains . research . k fg . type . ClassType Ċ Ċ private Ġval Ġvisibility Level Ġby Ġlazy Ġ{ Ġk ex Config . get EnumValue (" api Generation ", Ġ" visibility ", Ġtrue , ĠVisibility . PUBLIC ) Ġ} Ċ private Ġval Ġmax Stack Size Ġby Ġlazy Ġ{ Ġk ex Config . getInt Value (" api Generation ", Ġ" max Stack Size ", Ġ 5 ) Ġ} Ċ private Ġval Ġmax Query Size Ġby Ġlazy Ġ{ Ġk ex Config . getInt Value (" api Generation ", Ġ" max Query Size ", Ġ 1 0 0 0 ) Ġ} Ċ private Ġval Ġuse Rec Construct ors Ġby Ġlazy Ġ{ Ġk ex Config . getBoolean Value (" api Generation ", Ġ" use - recursive - construct ors ", Ġfalse ) Ġ} Ċ Ċ interface ĠGenerator Ġ{ ĊĠĠĠ Ġval Ġcontext : ĠGenerator Context ĊĊĠĠĠ Ġfun Ġsupports ( type : ĠK ex Type ): ĠBoolean ĊĠĠĠ Ġfun Ġgenerate ( descriptor : ĠDescriptor , Ġgeneration Depth : ĠInt Ġ= Ġ 0 ): ĠCall Stack Ċ } Ċ Ċ class ĠAny Generator ( private Ġval Ġfallback : ĠGenerator ) Ġ: ĠGenerator Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcontext Ġget () Ġ= Ġfallback . context ĊĊĠĠĠ Ġoverride Ġfun Ġsupports ( type : ĠK ex Type ) Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate ( descriptor : ĠDescriptor , Ġgeneration Depth : ĠInt ): ĠCall Stack Ġ= Ġwith ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdescriptor Ġas ? ĠObject Descriptor Ġ?: Ġthrow ĠIllegalArgumentException () ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ"${ descriptor . term }" ĊĠĠĠĠĠĠĠ Ġval Ġcall Stack Ġ= ĠCall Stack ( name ) ĊĠĠĠĠĠĠĠ Ġdescriptor . cache ( call Stack ) ĊĠĠĠĠĠĠĠ Ġcall Stack . generate Object ( descriptor , Ġgeneration Depth ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcall Stack ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠStack Wrapper ( val Ġvalue : ĠGenerator Context . Execution Stack ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġas ĠStack Wrapper ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . instance Ġeq Ġother . value . instance Ġ&& Ġvalue . depth Ġ<= Ġother . value . depth ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠGenerator Context . Execution Stack . wrap () Ġ= ĠStack Wrapper ( this ) ĊĊĠĠĠ Ġval ĠList < Api Call >. is Complete Ġget () Ġ= ĠCall Stack ("", Ġthis . to Mutable List ()). is Complete ĊĊĠĠĠ Ġprivate Ġfun ĠCall Stack . generate Object ( descriptor : ĠObject Descriptor , Ġgeneration Depth : ĠInt ) Ġ= Ġwith ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġdescriptor . deep Copy () ĊĠĠĠĠĠĠĠ Ġval Ġfallback s Ġ= Ġmutable Set Of < List < Api Call >>() ĊĊĠĠĠĠĠĠĠ Ġdescriptor . con cret ize ( cm ) ĊĠĠĠĠĠĠĠ Ġdescriptor . reduce () ĊĊĠĠĠĠĠĠĠ Ġlog . debug (" Generating Ġ$ descriptor ") ĊĊĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġdescriptor . klass . k fg Class ( types ) ĊĠĠĠĠĠĠĠ Ġif Ġ(( klass . accessible Construct ors Ġ+ Ġklass . external Construct ors ). isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ generate Object Ġ+= ĠUnknown Call ( klass . type , Ġoriginal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructors Ġ= Ġklass . accessible Construct ors ĊĠĠĠĠĠĠĠ Ġval Ġexternal Construct ors Ġ= Ġklass . external Construct ors ĊĊĠĠĠĠĠĠĠ Ġval Ġnon Recursive Construct ors Ġ= Ġconstructors . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . arg Types . all Ġ{ Ġarg Ġ-> Ġ!( klass . type . is Sup ertype Of ( arg ) Ġ|| Ġarg . is Sup ertype Of ( klass . type )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnon Recursive External Construct ors Ġ= Ġexternal Construct ors . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . arg Types . all Ġ{ Ġarg Ġ-> Ġ!( klass . type . is Sup ertype Of ( arg ) Ġ|| Ġarg . is Sup ertype Of ( klass . type )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrecursive Construct ors Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Rec Construct ors Ġ-> Ġconstructors . filter Ġ{ Ġit Ġ! in Ġnon Recursive Construct ors Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠlistOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrecursive External Construct ors Ġ= Ġexternal Construct ors . filter Ġ{ Ġit Ġ! in Ġnon Recursive External Construct ors Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġset ters Ġ= Ġdescriptor . generate Set ters ( generation Depth ) ĊĠĠĠĠĠĠĠ Ġval Ġqueue Ġ= Ġqueue Of ( Generator Context . Execution Stack ( descriptor , Ġset ters , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= Ġmutable Set Of < Stack Wrapper >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ( queue . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġes Ġ= Ġqueue . poll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( es . wrap () Ġin Ġcache ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( queue . size Ġ> Ġmax Query Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Ġ+= Ġes . wrap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( desc , Ġstack , Ġdepth ) Ġ= Ġes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġdescriptor . accept ( desc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( depth Ġ> Ġmax Stack Size ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Depth Ġ$ generation Depth , Ġstack Ġdepth Ġ$ depth , Ġquery Ġsize Ġ${ queue . size }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcheck Ctor Ġ= Ġfun Ġ( ctors : ĠList < Method >, Ġhandler : Ġ( ctor : ĠMethod ) Ġ-> ĠApi Call ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( method Ġin Ġct ors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Call Ġ= Ġhandler ( method ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġ( stack Ġ+ Ġapi Call ). reversed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . is Complete ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ generate Object . stack Ġ+= Ġ( stack Ġ+ Ġapi Call ). reversed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfallback s Ġ+= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Ctor ( non Recursive Construct ors ) Ġ{ Ġcurrent . check Constructor ( klass , Ġit , Ġgeneration Depth ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Ctor ( non Recursive External Construct ors ) Ġ{ Ġcurrent . check External Constructor ( it , Ġgeneration Depth ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Ctor ( recursive Construct ors ) Ġ{ Ġcurrent . check Constructor ( klass , Ġit , Ġgeneration Depth ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Ctor ( recursive External Construct ors ) Ġ{ Ġcurrent . check External Constructor ( it , Ġgeneration Depth ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( depth Ġ> Ġmax Stack Size Ġ- Ġ 1 ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccept Exec Result Ġ= Ġ{ Ġmethod : ĠMethod , Ġres : ĠGenerator Context . Execution Result , Ġold Depth : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( result , Ġargs ) Ġ= Ġres ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull Ġ&& Ġresult Ġne q Ġcurrent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrem apping Ġ= Ġ{ Ġmutable Map Of < Descriptor , ĠDescriptor >( result Ġto Ġcurrent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerated Args Ġ= Ġargs . map Ġ{ Ġfallback . generate ( it . deep Copy ( rem apping ()), Ġgeneration Depth Ġ+ Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Stack Ġ= Ġstack Ġ+ ĠMethod Call ( method , Ġgenerated Args ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Desc Ġ= Ġresult . merge ( current ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Ġ+= ĠGenerator Context . Execution Stack ( new Desc , Ġnew Stack , Ġold Depth Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( method Ġin Ġklass . accessible Methods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmethod . execute As Setter ( current ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept Exec Result ( method , Ġresult , Ġdepth ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( method Ġin Ġklass . accessible Methods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmethod . execute As Method ( current ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept Exec Result ( method , Ġresult , Ġdepth ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( fallback s . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ generate Object . stack Ġ+= Ġfallback s . random () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ generate Object Ġ+= ĠUnknown Call ( klass . type , Ġoriginal ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠObject Descriptor . check Constructor ( klass : ĠClass , Ġmethod : ĠMethod , Ġgeneration Depth : ĠInt ): ĠApi Call ? Ġ= Ġwith ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( this Desc , Ġargs ) Ġ= Ġmethod . execute As Constructor ( this @ check Constructor ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this Desc . is Final ( this @ check Constructor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Found Ġconstructor Ġ$ method Ġfor Ġ$ this , Ġgenerating Ġarguments Ġ$ args ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . arg Types . isEmpty () Ġ-> ĠDefault Constructor Call ( klass ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerated Args Ġ= Ġargs . map Ġ{ Ġfallback . generate ( it , Ġgeneration Depth Ġ+ Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstructor Call ( klass , Ġmethod , Ġgenerated Args ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠObject Descriptor . check External Constructor ( method : ĠMethod , Ġgeneration Depth : ĠInt ): ĠApi Call ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġargs ) Ġ= Ġmethod . execute As External Constructor ( this @ check External Constructor ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerated Args Ġ= Ġargs . map Ġ{ Ġfallback . generate ( it , Ġgeneration Depth Ġ+ Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExternal Constructor Call ( method , Ġgenerated Args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠObject Descriptor . generate Set ters ( generation Depth : ĠInt ): ĠList < Api Call > Ġ= Ġwith ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcalls Ġ= Ġmutable ListOf < Api Call >() ĊĠĠĠĠĠĠĠ Ġval Ġk fg K lass Ġ= Ġklass . k fg Class ( types ) ĊĠĠĠĠĠĠĠ Ġfor Ġ(( field , Ġvalue ) Ġin Ġfields . toMap ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk fg Field Ġ= Ġk fg K lass . getField ( field . first , Ġfield . second . get K fg Type ( types )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( visibility Level Ġ<= Ġk fg Field . visibility ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Direct ly Ġsetting Ġfield Ġ$ field Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalls Ġ+= ĠField Setter ( k fg Field , Ġfallback . generate ( value , Ġgeneration Depth Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields . remove ( field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduce () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( k fg Field . has Setter Ġ&& Ġvisibility Level Ġ<= Ġk fg Field . setter . visibility ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Using Ġsetter Ġfor Ġ$ field ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( result , Ġargs ) Ġ= Ġk fg Field . setter . execute As Setter ( this @ generate Set ters ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull Ġ&& Ġ( result [ field ] Ġ== Ġnull Ġ|| Ġresult [ field ] Ġ== Ġfield . second . default Descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrem apping Ġ= Ġ{ Ġmutable Map Of < Descriptor , ĠDescriptor >( result Ġto Ġthis @ generate Set ters ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerated Args Ġ= Ġargs . map Ġ{ Ġfallback . generate ( it . deep Copy ( rem apping ()), Ġgeneration Depth Ġ+ Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalls Ġ+= ĠMethod Call ( k fg Field . setter , Ġgenerated Args ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduce () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Used Ġsetter Ġfor Ġfield Ġ$ field , Ġnew Ġdesc : Ġ$ this ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcalls ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠArray Generator ( private Ġval Ġfallback : ĠGenerator ) Ġ: ĠGenerator Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcontext Ġget () Ġ= Ġfallback . context ĊĊĠĠĠ Ġoverride Ġfun Ġsupports ( type : ĠK ex Type ) Ġ= Ġtype Ġis ĠK ex Array ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate ( descriptor : ĠDescriptor , Ġgeneration Depth : ĠInt ): ĠCall Stack Ġ= Ġwith ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdescriptor Ġas ? ĠArray Descriptor Ġ?: Ġthrow ĠIllegalArgumentException () ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ"${ descriptor . term }" ĊĠĠĠĠĠĠĠ Ġval Ġcall Stack Ġ= ĠCall Stack ( name ) ĊĠĠĠĠĠĠĠ Ġdescriptor . cache ( call Stack ) ĊĊĠĠĠĠĠĠĠ Ġval Ġelement Type Ġ= Ġdescriptor . elementType . get K fg Type ( types ) ĊĠĠĠĠĠĠĠ Ġval Ġlength Call Ġ= ĠPrimary Value ( descriptor . length ) ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= ĠNew Array ( types . get ArrayType ( elementType ), Ġlength Call ) ĊĠĠĠĠĠĠĠ Ġcall Stack Ġ+= Ġarray ĊĊĠĠĠĠĠĠĠ Ġdescriptor . elements . forEach Ġ{ Ġ( index , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Call Ġ= ĠPrimary Value ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Write Ġ= ĠArray Write ( index Call , Ġfallback . generate ( value , Ġgeneration Depth Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Stack Ġ+= Ġarray Write ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcall Stack ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠString Generator ( private Ġval Ġfallback : ĠGenerator ) Ġ: ĠGenerator Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcontext : ĠGenerator Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfallback . context ĊĊĠĠĠ Ġoverride Ġfun Ġsupports ( type : ĠK ex Type ) Ġ= Ġtype Ġ== ĠK ex Class (" java / lang / String ") ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate ( descriptor : ĠDescriptor , Ġgeneration Depth : ĠInt ): ĠCall Stack Ġ= Ġwith ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdescriptor Ġas ? ĠObject Descriptor Ġ?: Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠ Ġdescriptor . reduce () ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ"${ descriptor . term }" ĊĠĠĠĠĠĠĠ Ġval Ġcall Stack Ġ= ĠCall Stack ( name ) ĊĠĠĠĠĠĠĠ Ġdescriptor . cache ( call Stack ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstring Class Ġ= Ġcontext . cm [" java / lang / String "] ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Descriptor Ġ= Ġdescriptor [" value ", ĠK ex Array ( K ex Char ()) ] ĊĠĠĠĠĠĠĠ Ġif Ġ( value Descriptor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Stack Ġ+= ĠDefault Constructor Call ( string Class ). wrap ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcall Stack ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfallback . generate ( value Descriptor , Ġgeneration Depth Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġstring Class . getMethod ("< init >", ĠMethod Desc ( array Of ( types . get ArrayType ( types . char Type )), Ġtypes . void Type )) ĊĠĠĠĠĠĠĠ Ġcall Stack Ġ+= ĠConstructor Call ( string Class , Ġconstructor , ĠlistOf ( value )). wrap ( name ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcall Stack ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠEnum Generator ( private Ġval Ġfallback : ĠGenerator ) Ġ: ĠGenerator Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcontext : ĠGenerator Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfallback . context ĊĊĠĠĠ Ġoverride Ġfun Ġsupports ( type : ĠK ex Type ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġk fg Type Ġ= Ġtype . get K fg Type ( context . types ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( k fg Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠClass Type Ġ-> Ġk fg Type .` class `. is Enum ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠDescriptor . matches ( other : ĠDescriptor ): ĠBoolean Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ġis ĠObject Descriptor Ġ&& Ġother Ġis ĠObject Descriptor Ġ-> Ġother . fields . all Ġ{ Ġ( field , Ġvalue ) Ġ-> Ġthis [ field ] Ġ== Ġvalue Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate ( descriptor : ĠDescriptor , Ġgeneration Depth : ĠInt ): ĠCall Stack Ġ= Ġwith ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġdescriptor . term . toString () ĊĠĠĠĠĠĠĠ Ġval Ġcs Ġ= ĠCall Stack ( name ) ĊĠĠĠĠĠĠĠ Ġdescriptor . cache ( cs ) ĊĊĠĠĠĠĠĠĠ Ġval Ġk fg Type Ġ= Ġdescriptor . type . get K fg Type ( context . types ) Ġas ĠClass Type ĊĠĠĠĠĠĠĠ Ġval Ġstatic Init Ġ= Ġk fg Type .` class `. getMethod ("< cl init >", Ġ" () V ") ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġstatic Init . method State Ġ?: Ġreturn Ġcs . also Ġ{ Ġit Ġ+= ĠUnknown Call ( k fg Type , Ġdescriptor ). wrap ( name ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġprepared State Ġ= Ġstate . prepare ( static Init , ĠType Info Map ()) ĊĠĠĠĠĠĠĠ Ġval Ġquery Builder Ġ= ĠState Builder () ĊĠĠĠĠĠĠĠ Ġwith ( query Builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenum Array Ġ= ĠK ex Array ( descriptor . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Field Ġ= Ġterm Ġ{ Ġ` class `( descriptor . type ). field ( enum Array , Ġ"\ $ VALUES ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerated Term Ġ= Ġterm Ġ{ Ġgenerate ( enum Array ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ{ Ġgenerated Term Ġequality Ġvalues Field . load () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Ġ{ Ġgenerated Term Ġin equality Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġprepared Query Ġ= Ġprepare Query ( query Builder . apply ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġchecker Ġ= ĠCheck er ( static Init , Ġcontext . loader , Ġp sa ) ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġwhen Ġ( val Ġresult Ġ= Ġchecker . check ( prepared State Ġ+ Ġprepared Query )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Sat Result Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Model : Ġ${ result . model }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Final Descriptors ( static Init , Ġcontext , Ġresult . model , Ġchecker . state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġcs . also Ġ{ Ġit Ġ+= ĠUnknown Call ( k fg Type , Ġdescriptor ). wrap ( name ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparams . static Fields ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġif Ġ( it . value Ġis ĠStatic FieldDescriptor ) Ġ( it . key Ġto Ġit . value Ġas ĠStatic FieldDescriptor ) Ġelse Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . first Ġto Ġit . second . value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . second . matches ( descriptor ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġcs . also Ġ{ Ġit Ġ+= ĠUnknown Call ( k fg Type , Ġdescriptor ). wrap ( name ) Ġ} ĊĠĠĠĠĠĠĠ Ġcs Ġ+= ĠEnum Value Creation ( cm [ result . first . klass ], Ġresult . first . fieldName String ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcs ĊĠĠĠ Ġ} Ċ }