package Ġorg . jetbrains . research . k ex . re anim ator . codegen . jav agen Ċ Ċ import Ġorg . jetbrains . research . k ex . ExecutionContext Ċ import Ġorg . jetbrains . research . k ex . k type . K ex Type Ċ import Ġorg . jetbrains . research . k ex . k type . type Ċ import Ġorg . jetbrains . research . k ex . parameters . Parameters Ċ import Ġorg . jetbrains . research . k ex . re anim ator . call stack .* Ċ import Ġorg . jetbrains . research . k ex . re anim ator . codegen . Call Stack Printer Ċ import Ġorg . jetbrains . research . k ex . util . get Constructor Ċ import Ġorg . jetbrains . research . k ex . util . getMethod Ċ import Ġorg . jetbrains . research . k ex . util . k ex Ċ import Ġorg . jetbrains . research . k ex . util . load Class Ċ import Ġorg . jetbrains . research . k fg . ir . Class Ċ import Ġorg . jetbrains . research . k fg . type .* Ċ import Ġorg . jetbrains . research . k fg . type . Type Ċ import Ġorg . jetbrains . research . k the l per . assert . kt assert Ċ import Ġorg . jetbrains . research . k the l per . assert . unreachable Ċ import Ġorg . jetbrains . research . k the l per . logging . log Ċ import Ġjava . lang . reflect .* Ċ Ċ // ĠTODO : Ġthis Ġis Ġwork Ġof Ġs atan , Ġrefactor Ġthis Ġdam n Ġthing Ċ open Ġclass ĠCall Stack 2 Java Printer ( ĊĠĠĠ Ġval Ġctx : ĠExecutionContext , ĊĠĠĠ Ġfinal Ġoverride Ġval ĠpackageName : ĠString , ĊĠĠĠ Ġfinal Ġoverride Ġval Ġklass Name : ĠString Ċ ) Ġ: ĠCall Stack Printer Ġ{ ĊĠĠĠ Ġprotected Ġval Ġprinted Stack s Ġ= Ġmutable Set Of < String >() ĊĠĠĠ Ġprotected Ġval Ġbuilder Ġ= ĠJava Builder ( packageName ) ĊĠĠĠ Ġprotected Ġval Ġklass Ġ= Ġbuilder . run Ġ{ Ġklass ( packageName , Ġklass Name ) Ġ} ĊĠĠĠ Ġprotected Ġval Ġresolved Types Ġ= Ġmutable Map Of < Call Stack , ĠCS Type >() ĊĠĠĠ Ġprotected Ġval Ġactual Types Ġ= Ġmutable Map Of < Call Stack , ĠCS Type >() ĊĠĠĠ Ġlateinit Ġvar Ġcurrent : ĠJava Builder . Java Function ĊĠĠĠ Ġprotected Ġvar Ġstatic Counter Ġ= Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport (" java . lang . Throwable ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport (" java . lang . IllegalStateException ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport (" org . junit . Test ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( klass ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor () Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod (" unknown ", ĠlistOf ( type (" T "))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġtype (" T ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+" throw Ġnew ĠIllegalStateException ()" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Call Stack ( ĊĠĠĠĠĠĠĠ Ġmethod : Ġorg . jetbrains . research . k fg . ir . Method , Ġcall Stack s : ĠParameters < Call Stack > ĊĠĠĠ Ġ): ĠCall Stack Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġmethod . is Static Ġ-> ĠStatic MethodCall ( method , Ġcall Stack s . arguments ). wrap (" static ${ static Counter ++ }") ĊĠĠĠĠĠĠĠ Ġmethod . is Constructor Ġ-> Ġcall Stack s . instance !! ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġcall Stack s . instance !!. clone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance . stack Ġ+= ĠMethod Call ( method , Ġcall Stack s . arguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġcleanup () Ġ{ ĊĠĠĠĠĠĠĠ Ġprinted Stack s . clear () ĊĠĠĠĠĠĠĠ Ġresolved Types . clear () ĊĠĠĠĠĠĠĠ Ġactual Types . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprint Call Stack ( ĊĠĠĠĠĠĠĠ Ġtest Name : ĠString , ĊĠĠĠĠĠĠĠ Ġmethod : Ġorg . jetbrains . research . k fg . ir . Method , ĊĠĠĠĠĠĠĠ Ġcall Stack s : ĠParameters < Call Stack > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcleanup () ĊĠĠĠĠĠĠĠ Ġval Ġcall Stack Ġ= Ġbuild Call Stack ( method , Ġcall Stack s ) ĊĠĠĠĠĠĠĠ Ġwith ( builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( klass ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġmethod ( test Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġvoid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ+= Ġ" Test " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexceptions Ġ+= Ġ" Throwable " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresolve Types ( call Stack ) ĊĠĠĠĠĠĠĠ Ġcall Stack . print As Java () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġemit () Ġ= Ġbuilder . toString () ĊĊĊĠĠĠ Ġinterface ĠCS Type Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġis Subtype ( other : ĠCS Type ): ĠBoolean ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCS Star Projection Ġ: ĠCS Type Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Subtype ( other : ĠCS Type ) Ġ= Ġother Ġis ĠCS Star Projection ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"*" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCS Class ( val Ġtype : ĠType , Ġval Ġtype Params : ĠList < CS Type > Ġ= Ġempty List ()) Ġ: ĠCS Type Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Subtype ( other : ĠCS Type ): ĠBoolean Ġ= Ġwhen Ġ( other ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCS Class Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! type . is Subtype Of ( other . type ) Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Params . size Ġ!= Ġother . type Params . size Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtype Params . zip ( other . type Params ). all Ġ{ Ġ( a , Ġb ) Ġ-> Ġa . is Subtype ( b ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCS Star Projection Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Params Ġ= Ġwhen Ġ( type Params . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġtype Params . join ToString (", Ġ", Ġprefix Ġ= Ġ"< ", Ġpostfix Ġ= Ġ"> ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtype . java String Ġ+ Ġtype Params ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠC SP ri mary Array ( val Ġelement : ĠCS Type ) Ġ: ĠCS Type Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Subtype ( other : ĠCS Type ): ĠBoolean Ġ= Ġwhen Ġ( other ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC SP ri mary Array Ġ-> Ġelement . is Subtype ( other . element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCS Star Projection Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"${ element } []" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCS Array ( val Ġelement : ĠCS Type ) Ġ: ĠCS Type Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Subtype ( other : ĠCS Type ): ĠBoolean Ġ= Ġwhen Ġ( other ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCS Array Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! element . is Subtype ( other . element ) Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCS Star Projection Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"${ element } []" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠCS Type . k fg : ĠType ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCS Class Ġ-> Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCS Array Ġ-> Ġctx . types . get ArrayType ( element . k fg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC SP ri mary Array Ġ-> Ġctx . types . get ArrayType ( element . k fg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġunreachable Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġjava . lang . reflect . Type . cs Type : ĠCS Type ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġjava . lang . Class < *> Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . isArray Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġthis . component Type . cs Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCS Array ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠCS Class ( this . k ex . get K fg Type ( ctx . types )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParameter ized Type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Type Ġ= Ġthis . raw Type . cs Type . k fg ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Args Ġ= Ġthis . actual Type Arguments . map Ġ{ Ġit . cs Type Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCS Class ( raw Type , Ġtype Args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGeneric ArrayType Ġ-> ĠCS Array ( this . generic ComponentType . cs Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Variable < *> Ġ-> Ġthis . bounds . first (). cs Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ildcard Type Ġ-> Ġthis . upper Bounds . first (). cs Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCS Type . merge ( required Type : ĠCS Type ): ĠCS Type Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ġis ĠCS Class Ġ&& Ġrequired Type Ġis ĠCS Class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual K lass Ġ= Ġctx . loader . load Class ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequired K lass Ġ= Ġctx . loader . load Class ( required Type . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Assignable Ġ= Ġrequired K lass . isAssignableFrom ( actual K lass ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Assignable Ġ&& Ġactual K lass . type Parameters . size Ġ== Ġrequired K lass . type Parameters . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCS Class ( type , Ġrequired Type . type Params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Assignable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCS Class ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCS Type ?. is Assignable ( other : ĠCS Type ) Ġ= Ġthis ?. let Ġ{ Ġother . is Subtype ( it ) Ġ} Ġ?: Ġtrue ĊĊĠĠĠ Ġprivate Ġval ĠK ex Type . cs Type Ġget () Ġ= Ġthis . get K fg Type ( ctx . types ). cs Type ĊĊĠĠĠ Ġprotected Ġval ĠType . cs Type : ĠCS Type ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArray Type Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . component . is Primary Ġ-> ĠC SP ri mary Array ( component . cs Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠCS Array ( this . component . cs Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠCS Class ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġresolve Types ( call Stack : ĠCall Stack ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcall Stack . reversed (). map Ġ{ Ġresolve Types ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Types ( constructor : ĠConstructor <* >, Ġargs : ĠList < Call Stack >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġconstructor . generic Parameter Types ĊĠĠĠĠĠĠĠ Ġargs . zip ( params ). forEach Ġ{ Ġ( arg , Ġparam ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ! in Ġresolved Types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Types [ arg ] Ġ= Ġparam . cs Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Types ( arg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Types ( method : ĠMethod , Ġargs : ĠList < Call Stack >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġmethod . generic Parameter Types . toList () ĊĠĠĠĠĠĠĠ Ġargs . zip ( params ). forEach Ġ{ Ġ( arg , Ġparam ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ! in Ġresolved Types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Types [ arg ] Ġ= Ġparam . cs Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Types ( arg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Types ( call : ĠApi Call ) Ġ= Ġwhen Ġ( call ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠDefault Constructor Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠConstructor Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreflection Ġ= Ġctx . loader . load Class ( call . klass ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġreflection . get Constructor ( call . constructor , Ġctx . loader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Types ( constructor , Ġcall . args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠExternal Constructor Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreflection Ġ= Ġctx . loader . load Class ( call . constructor . klass ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġreflection . getMethod ( call . constructor , Ġctx . loader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Types ( constructor , Ġcall . args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠInner Class Constructor Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreflection Ġ= Ġctx . loader . load Class ( call . constructor . klass ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġreflection . get Constructor ( call . constructor , Ġctx . loader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Types ( call . outer Object ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Types ( constructor , Ġcall . args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠMethod Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreflection Ġ= Ġctx . loader . load Class ( call . method . klass ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġreflection . getMethod ( call . method , Ġctx . loader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Types ( method , Ġcall . args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠStatic MethodCall Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreflection Ġ= Ġctx . loader . load Class ( call . method . klass ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġreflection . getMethod ( call . method , Ġctx . loader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Types ( method , Ġcall . args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun ĠCall Stack . print As Java () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġin Ġprinted Stack s ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠPrimary Value <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġas Constant ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprinted Stack s Ġ+= Ġname ĊĠĠĠĠĠĠĠ Ġfor Ġ( call Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( current ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( statement Ġin Ġprint Api Call ( this @ print As Java , Ġcall )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ statement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval ĠClass . java String : ĠString Ġget () Ġ= Ġthis . type . java String ĊĊĠĠĠ Ġprotected Ġval ĠType . java String : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNull Type Ġ-> Ġ" null " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVoid Type Ġ-> Ġ" void " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBool Type Ġ-> Ġ" boolean " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠByte Type Ġ-> Ġ" byte " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShort Type Ġ-> Ġ" short " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChar Type Ġ-> Ġ" char " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt Type Ġ-> Ġ" int " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLong Type Ġ-> Ġ" long " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFloat Type Ġ-> Ġ" float " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Type Ġ-> Ġ" double " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArray Type Ġ-> Ġ"${ this . component . java String } []" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġ( this Ġas ĠClass Type ). klass ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanonical Desc Ġ= Ġklass . canonical Desc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit ted Ġ= Ġcanonical Desc . split ("$ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkt assert ( split ted . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( split ted [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . import ( this . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( substring Ġin Ġsplit ted . drop ( 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" .$ substring ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . import ( this . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġklass . name . replace ("$ ", Ġ". ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠCall Stack . stack Name : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPrimary Value < *> Ġ-> Ġas Constant ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġprint Api Call ( owner : ĠCall Stack , Ġapi Call : ĠApi Call ): ĠList < String > Ġ= Ġwhen Ġ( api Call ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠDefault Constructor Call Ġ-> Ġprint Default Constructor ( owner , Ġapi Call ) ĊĠĠĠĠĠĠĠ Ġis ĠConstructor Call Ġ-> Ġprint Constructor Call ( owner , Ġapi Call ) ĊĠĠĠĠĠĠĠ Ġis ĠExternal Constructor Call Ġ-> Ġprint External Constructor Call ( owner , Ġapi Call ) ĊĠĠĠĠĠĠĠ Ġis ĠInner Class Constructor Call Ġ-> Ġprint Inner Class Constructor ( owner , Ġapi Call ) ĊĠĠĠĠĠĠĠ Ġis ĠMethod Call Ġ-> Ġprint MethodCall ( owner , Ġapi Call ) ĊĠĠĠĠĠĠĠ Ġis ĠStatic MethodCall Ġ-> Ġprint Static MethodCall ( api Call ) ĊĠĠĠĠĠĠĠ Ġis ĠNew Array Ġ-> Ġprint New Array ( owner , Ġapi Call ) ĊĠĠĠĠĠĠĠ Ġis ĠArray Write Ġ-> Ġprint Array Write ( owner , Ġapi Call ) ĊĠĠĠĠĠĠĠ Ġis ĠField Setter Ġ-> Ġprint Field Setter ( owner , Ġapi Call ) ĊĠĠĠĠĠĠĠ Ġis ĠStatic Field Setter Ġ-> Ġprint Static Field Setter ( api Call ) ĊĠĠĠĠĠĠĠ Ġis ĠEnum Value Creation Ġ-> Ġprint EnumValue Creation ( owner , Ġapi Call ) ĊĠĠĠĠĠĠĠ Ġis ĠStatic Field Getter Ġ-> Ġprint Static Field Getter ( owner , Ġapi Call ) ĊĠĠĠĠĠĠĠ Ġis ĠUnknown Call Ġ-> Ġprint Unknown ( owner , Ġapi Call ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġunreachable Ġ{ Ġlog . error (" Unknown Ġcall ") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġ< T > ĠPrimary Value < T >. as Constant : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( val Ġvalue Ġ= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ" null ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . null Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> Ġ"$ value ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . bool Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠByte Ġ-> Ġ"( byte ) Ġ$ value ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . byte Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChar Ġ-> Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ' a ' .. ' z ' Ġ-> Ġ"' $ value '" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ' A ' .. ' Z ' Ġ-> Ġ"' $ value '" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"( char ) Ġ${ value . code }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . char Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠShort Ġ-> Ġ"( short ) Ġ$ value ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . short Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġ"$ value ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . int Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> Ġ"${ value } L ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . long Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . isNaN () Ġ-> Ġ" Float . NaN ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . import (" java . lang . Float ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . isIn finite () Ġ&& Ġvalue Ġ< Ġ 0 . 0 Ġ-> Ġ" Float . NEGATIVE _ INFINITY ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . import (" java . lang . Float ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . isIn finite () Ġ-> Ġ" Float . POSITIVE _ INFINITY ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . import (" java . lang . Float ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"${ value } F " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . float Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDouble Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . isNaN () Ġ-> Ġ" Double . NaN ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . import (" java . lang . Double ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . isIn finite () Ġ&& Ġvalue Ġ< Ġ 0 . 0 Ġ-> Ġ" Double . NEGATIVE _ INFINITY ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . import (" java . lang . Double ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . isIn finite () Ġ-> Ġ" Double . POSITIVE _ INFINITY ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . import (" java . lang . Double ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"$ value " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . double Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġunreachable Ġ{ Ġlog . error (" Unknown Ġprimary Ġvalue Ġ$ this ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCall Stack . cast ( req Type : ĠCS Type ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= Ġactual Types [ this ] Ġ?: Ġreturn Ġthis . stack Name ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreq Type . is Assignable ( actual Type ) Ġ-> Ġthis . stack Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" ($ req Type ) ${ this . stack Name }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCall Stack . force Cast If Null ( req Type : ĠCS Type ?): ĠString Ġ= Ġwhen Ġ( this . stack Name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" null " Ġ-> Ġ" ($ req Type ) ${ this . stack Name }" ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis . cast ( req Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint Var Declaration ( name : ĠString , Ġtype : ĠCS Type ): ĠString Ġ= Ġ"$ type Ġ$ name " ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint Default Constructor ( owner : ĠCall Stack , Ġcall : ĠDefault Constructor Call ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= ĠCS Class ( call . klass . type ) ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolved Types [ owner ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrest Ġ= Ġresolved Types [ owner ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġactual Type . merge ( rest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ print Var Declaration ( owner . name , Ġtype )} Ġ= Ġnew Ġ$ type ()" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġactual Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ print Var Declaration ( owner . name , Ġactual Type )} Ġ= Ġnew Ġ$ actual Type ()" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint Constructor Call ( owner : ĠCall Stack , Ġcall : ĠConstructor Call ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . args . forEach Ġ{ Ġit . print As Java () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . args . join ToString (", Ġ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . force Cast If Null ( resolved Types [ it ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= ĠCS Class ( call . klass . type ) ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolved Types [ owner ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrest Ġ= Ġresolved Types [ owner ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġactual Type . merge ( rest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ print Var Declaration ( owner . name , Ġtype )} Ġ= Ġnew Ġ$ type ($ args )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġactual Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ print Var Declaration ( owner . name , Ġactual Type )} Ġ= Ġnew Ġ$ actual Type ($ args )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġinner ClassName ( inner Type : ĠCS Type , Ġouter Type : ĠCS Type , Ġreq Outer Type : ĠCS Type ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( inner Type Ġ! is ĠCS Class ) Ġreturn Ġinner Type . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( outer Type Ġ! is ĠCS Class ) Ġreturn Ġinner Type . toString () ĊĊĠĠĠĠĠĠĠ Ġval Ġinner String Ġ= Ġ( inner Type . type Ġas ? ĠClass Type )?. klass ?. fullName Ġ?: Ġreturn Ġinner Type . toString () ĊĠĠĠĠĠĠĠ Ġval Ġouter String Ġ= Ġ( outer Type . type Ġas ? ĠClass Type )?. klass ?. fullName Ġ?: Ġreturn Ġinner Type . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( req Outer Type Ġ!= Ġnull Ġ&& Ġreq Outer Type Ġis ĠCS Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq TypeString Ġ= Ġ( req Outer Type . type Ġas ĠClass Type ). klass . fullName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inner String . startsWith ( req TypeString )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinner String . remove Prefix ("$ req TypeString \$ "). replace ('/', Ġ'.') ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( inner String . startsWith ( outer String )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinner String . remove Prefix ("$ outer String \$ "). replace ('/', Ġ'.') ĊĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint Inner Class Constructor ( owner : ĠCall Stack , Ġcall : ĠInner Class Constructor Call ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . outer Object . print As Java () ĊĠĠĠĠĠĠĠ Ġcall . args . forEach Ġ{ Ġit . print As Java () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . args . join ToString (", Ġ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . force Cast If Null ( resolved Types [ it ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= ĠCS Class ( call . constructor . klass . type ) ĊĠĠĠĠĠĠĠ Ġval Ġouter Object Ġ= Ġcall . outer Object . force Cast If Null ( resolved Types [ call . outer Object ]) ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolved Types [ owner ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrest Ġ= Ġresolved Types [ owner ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġactual Type . merge ( rest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner ClassName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner ClassName ( type , Ġactual Types [ call . outer Object ] !! , Ġresolved Types [ call . outer Object ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ print Var Declaration ( owner . name , Ġtype )} Ġ= Ġ$ outer Object . new Ġ$ inner ClassName ($ args )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġactual Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner ClassName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner ClassName ( actual Type , Ġactual Types [ call . outer Object ] !! , Ġresolved Types [ call . outer Object ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ print Var Declaration ( owner . name , Ġactual Type )} Ġ= Ġ$ outer Object . new Ġ$ inner ClassName ($ args )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint External Constructor Call ( owner : ĠCall Stack , Ġcall : ĠExternal Constructor Call ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . args . forEach Ġ{ Ġit . print As Java () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġcall . constructor ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . args . join ToString (", Ġ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . force Cast If Null ( resolved Types [ it ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= ĠCS Class ( constructor . returnType ) ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolved Types [ owner ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrest Ġ= Ġresolved Types [ owner ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġactual Type . merge ( rest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ print Var Declaration ( owner . name , Ġtype )} Ġ= Ġ${ constructor . klass . java String }.${ constructor . name } ($ args )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġactual Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint Var Declaration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ= Ġ${ constructor . klass . java String }.${ constructor . name } ($ args )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint MethodCall ( owner : ĠCall Stack , Ġcall : ĠMethod Call ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . args . forEach Ġ{ Ġit . print As Java () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġcall . method ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . args . join ToString (", Ġ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . force Cast If Null ( resolved Types [ it ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ("${ owner . name }.${ method . name } ($ args )") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint Static MethodCall ( call : ĠStatic MethodCall ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . args . forEach Ġ{ Ġit . print As Java () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġcall . method . klass ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġcall . method ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . args . join ToString (", Ġ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . force Cast If Null ( resolved Types [ it ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ("${ klass . java String }.${ method . name } ($ args )") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun ĠCS Type . elementType Depth ( depth : ĠInt Ġ= Ġ- 1 ): ĠPair < Int , ĠCS Type > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠCS Array Ġ-> Ġthis . element . elementType Depth ( depth Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġis ĠC SP ri mary Array Ġ-> Ġthis . element . elementType Depth ( depth Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdepth Ġto Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint New Array ( owner : ĠCall Stack , Ġcall : ĠNew Array ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= Ġcall . as Array . cs Type ĊĠĠĠĠĠĠĠ Ġval Ġ( depth , Ġelement Type ) Ġ= Ġactual Type . elementType Depth () ĊĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġactual Type ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ print Var Declaration ( owner . name , Ġactual Type )} Ġ= Ġnew Ġ$ elementType [ ${ call . length . stack Name }] ${ " [] ". repeat ( depth )}" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint Array Write ( owner : ĠCall Stack , Ġcall : ĠArray Write ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . value . print As Java () ĊĠĠĠĠĠĠĠ Ġval Ġrequired Type Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġres T Ġ= Ġresolved Types [ owner ] Ġ?: Ġactual Types [ owner ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCS Array Ġ-> Ġres T . element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC SP ri mary Array Ġ-> Ġres T . element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġunreachable Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ("${ owner . name }[ ${ call . index . stack Name }] Ġ= Ġ${ call . value . cast ( required Type )} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint Field Setter ( owner : ĠCall Stack , Ġcall : ĠField Setter ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . value . print As Java () ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ("${ owner . name }.${ call . field . name } Ġ= Ġ${ call . value . stack Name }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint Static Field Setter ( call : ĠStatic Field Setter ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . value . print As Java () ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ("${ call . klass . java String }.${ call . field . name } Ġ= Ġ${ call . value . stack Name }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint EnumValue Creation ( owner : ĠCall Stack , Ġcall : ĠEnum Value Creation ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= Ġcall . klass . type . cs Type ĊĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġactual Type ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ("${ print Var Declaration ( owner . name , Ġactual Type )} Ġ= Ġ${ call . klass . java String }.${ call . name }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint Static Field Getter ( owner : ĠCall Stack , Ġcall : ĠStatic Field Getter ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= Ġcall . klass . type . cs Type ĊĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġactual Type ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ("${ print Var Declaration ( owner . name , Ġactual Type )} Ġ= Ġ${ call . klass . java String }.${ call . name }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprint Unknown ( owner : ĠCall Stack , Ġcall : ĠUnknown Call ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġcall . target . type . cs Type ĊĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġtype ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ("${ print Var Declaration ( owner . name , Ġtype )} Ġ= Ġunknown () ") ĊĠĠĠ Ġ} Ċ } Ċ