package Ġorg . jetbrains . research . k ex . re anim ator . codegen . kot ling en Ċ Ċ 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 the l per . assert . unreachable Ċ import Ġorg . jetbrains . research . k the l per . logging . log Ċ import Ġjava . lang . reflect .* Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Classifier Ċ import Ġkotlin . reflect . K Type Ċ import Ġkotlin . reflect . K Type Parameter Ċ import Ġkotlin . reflect . jvm . kotlin Function Ċ import Ġjava . lang . reflect . Type Ġas ĠJ Type Ċ Ċ // ĠTODO : Ġthis Ġis Ġwork Ġof Ġs atan , Ġrefactor Ġthis Ġdam n Ġthing Ċ class ĠCall Stack 2 Kotlin Printer ( ĊĠĠĠ Ġval Ġctx : ĠExecutionContext , ĊĠĠĠ Ġoverride Ġval ĠpackageName : ĠString , ĊĠĠĠ Ġoverride Ġval Ġklass Name : ĠString Ċ ) Ġ: ĠCall Stack Printer Ġ{ ĊĠĠĠ Ġprivate Ġval Ġprinted Stack s Ġ= Ġmutable Set Of < String >() ĊĠĠĠ Ġprivate Ġval Ġbuilder Ġ= ĠK t Builder ( packageName ) ĊĠĠĠ Ġprivate Ġval Ġklass : ĠK t Builder . Kt Class ĊĠĠĠ Ġprivate Ġval Ġresolved Types Ġ= Ġmutable Map Of < Call Stack , ĠCS Type >() ĊĠĠĠ Ġprivate Ġval Ġactual Types Ġ= Ġmutable Map Of < Call Stack , ĠCS Type >() ĊĠĠĠ Ġprivate Ġvar Ġstatic Counter Ġ= Ġ 0 ĊĠĠĠ Ġlateinit Ġvar Ġcurrent : ĠK t Builder . Kt Function ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport (" kotlin . Exception ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport (" kotlin . IllegalStateException ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport (" org . junit . Test ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction ("< T > Ġunknown ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġtype (" T ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+" TODO ()" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġklass Ġ= Ġbuilder . run Ġ{ Ġklass ( packageName , Ġklass Name ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprint Call Stack ( ĊĠĠĠĠĠĠĠ Ġtest Name : ĠString , ĊĠĠĠĠĠĠĠ Ġmethod : Ġorg . jetbrains . research . k fg . ir . Method , ĊĠĠĠĠĠĠĠ Ġcall Stack s : ĠParameters < Call Stack > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresolved Types . clear () ĊĠĠĠĠĠĠĠ Ġactual Types . clear () ĊĠĠĠĠĠĠĠ Ġprinted Stack s . clear () ĊĠĠĠĠĠĠĠ Ġval Ġcall Stack Ġ= Ġbuild Call Stack ( method , Ġcall Stack s ) ĊĠĠĠĠĠĠĠ Ġwith ( builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( klass ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġmethod ( test Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġunit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ+= Ġ" Test " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresolve Types ( call Stack ) ĊĠĠĠĠĠĠĠ Ġcall Stack . print As Kt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġemit () Ġ= Ġbuilder . toString () ĊĊĊĠĠĠ Ġinterface ĠCS Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnullable : ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Subtype ( other : ĠCS Type ): ĠBoolean ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCS Star Projection Ġ: ĠCS Type Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġnullable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ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 (), ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġnullable : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ) Ġ: Ġ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 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Params . zip ( other . type Params ). any Ġ{ Ġ( a , Ġb ) Ġ-> Ġ! a . is Subtype ( b ) Ġ} Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ! (! nullable Ġ&& Ġother . nullable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ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 . kotlin String Ġ+ Ġtype Params Ġ+ Ġif Ġ( nullable ) Ġ" ?" Ġelse Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠC SP ri mary Array ( val Ġelement : ĠCS Type , Ġoverride Ġval Ġnullable : ĠBoolean Ġ= Ġtrue ) Ġ: ĠCS Type Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Subtype ( other : ĠCS Type ): ĠBoolean Ġ= Ġwhen Ġ( other ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC SP ri mary Array Ġ-> Ġelement . is Subtype ( other . element ) Ġ&& Ġ! (! nullable Ġ&& Ġother . nullable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCS Star Projection Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"${ element } Array " Ġ+ Ġif Ġ( nullable ) Ġ" ?" Ġelse Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCS Array ( val Ġelement : ĠCS Type , Ġoverride Ġval Ġnullable : ĠBoolean Ġ= Ġtrue ) Ġ: ĠCS Type Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Subtype ( other : ĠCS Type ): ĠBoolean Ġ= Ġwhen Ġ( other ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCS Array Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! element . is Subtype ( other . element ) Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! nullable Ġ&& Ġother . nullable Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCS Star Projection Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Array < ${ element }> " Ġ+ Ġif Ġ( nullable ) Ġ" ?" Ġelse Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠK Classifier . cs Type : ĠCS Type ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK Class < *> Ġ-> Ġjava . k ex . getC sType ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK Type Parameter Ġ-> Ġupper Bounds . first (). cs Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġunreachable Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 ĠK Type . cs Type : ĠCS Type ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġthis . classifier !!. cs Type . k fg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġthis . arguments . map Ġ{ Ġit . type ?. cs Type Ġ?: ĠCS Star Projection () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnull ability Ġ= Ġthis . is Marked Nullable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArray Type Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . component . is Primary Ġ-> ĠC SP ri mary Array ( type . component . getC sType ( false ), Ġnull ability ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠCS Array ( args . first (), Ġnull ability ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠCS Class ( type , Ġargs , Ġnull ability ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠJ 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 Ġ-> Ġthis . owner Type . 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 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( required K lass . isAssignableFrom ( actual K lass ) Ġ&& Ġactual K lass . type Parameters . size Ġ== Ġrequired K lass . type Parameters . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCS Class ( type , Ġrequired Type . type Params , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠTODO () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCS Type ?. is Assignable ( other : ĠCS Type ) Ġ= Ġthis ?. let Ġ{ Ġother . is Subtype ( it ) Ġ} Ġ?: Ġtrue ĊĊĠĠĠ Ġprivate Ġfun ĠK ex Type . getC sType ( nullable : ĠBoolean Ġ= Ġtrue ) Ġ= Ġthis . get K fg Type ( ctx . types ). getC sType ( nullable ) ĊĊĠĠĠ Ġprivate Ġfun ĠType . getC sType ( nullable : ĠBoolean Ġ= Ġtrue ): ĠCS Type Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠArray Type Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . component . is Primary Ġ-> ĠC SP ri mary Array ( component . getC sType ( false ), Ġnullable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠCS Array ( this . component . getC sType ( nullable ), Ġnullable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠCS Class ( this , Ġnullable Ġ= Ġnullable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Types ( call Stack : ĠCall Stack ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcall Stack . reversed (). map Ġ{ Ġresolve Types ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Types ( constructor : ĠConstructor <* >, Ġargs : ĠList < Call Stack >) Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor . kotlin Function Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġconstructor . kotlin Function !!. parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs . zip ( params ). forEach Ġ{ Ġ( arg , Ġparam ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ! in Ġresolved Types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Types [ arg ] Ġ= Ġparam . type . cs Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Types ( arg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ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 >) Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . kotlin Function Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġmethod . kotlin Function !!. parameters . drop ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs . zip ( params ). forEach Ġ{ Ġ( arg , Ġparam ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ! in Ġresolved Types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Types [ arg ] Ġ= Ġparam . type . cs Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Types ( arg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ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 Ġ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 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCall Stack . print As Kt () Ġ{ ĊĠĠĠĠĠĠĠ Ġ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 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ print Api Call ( this @ print As Kt , Ġcall ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠClass . kotlin String : ĠString Ġget () Ġ= Ġthis . type . kotlin String ĊĊĠĠĠ Ġprivate Ġval ĠType . kotlin String : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNull Type Ġ-> Ġ" null " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVoid Type Ġ-> Ġ" Unit " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ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 Ġ-> Ġwhen Ġ( val Ġtype Ġ= Ġthis . component ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBool Type Ġ-> Ġ" Boolean Array " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByte Type Ġ-> Ġ" ByteArray " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShort Type Ġ-> Ġ" Short Array " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChar Type Ġ-> Ġ" CharArray " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt Type Ġ-> Ġ" IntArray " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLong Type Ġ-> Ġ" Long Array " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloat Type Ġ-> Ġ" Float Array " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Type Ġ-> Ġ" Double Array " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" Array < ${ type . kotlin String }> " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġ( this Ġas ĠClass Type ). klass ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġklass . canonical Desc . replace ("$ ", Ġ". ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . import ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġklass . name . replace ("$ ", Ġ". ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠCall Stack . stack Name : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPrimary Value < *> Ġ-> Ġas Constant ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Api Call ( owner : ĠCall Stack , Ġapi Call : ĠApi Call ) Ġ= Ġ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 Ġ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 ") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġ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 , Ġnullable Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠByte Ġ-> Ġ"${ value }. to Byte () ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . byte Type , Ġnullable Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChar Ġ-> Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ' a ' .. ' z ' Ġ-> Ġ"' $ value '" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ' A ' .. ' Z ' Ġ-> Ġ"' $ value '" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"${ value . code }. to Char ()" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . char Type , Ġnullable Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠShort Ġ-> Ġ"${ value }. to Short () ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . short Type , Ġnullable Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġ"$ value ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . int Type , Ġnullable Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> Ġ"${ value } L ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . long Type , Ġnullable Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> Ġ"${ value } F ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . float Type , Ġnullable Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDouble Ġ-> Ġ"$ value ". also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ this ] Ġ= ĠCS Class ( ctx . types . double Type , Ġnullable Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ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 Ġ-> Ġ"${ this . stack Name } Ġas Ġ$ req Type " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCall Stack . force Cast If Null ( req Type : ĠCS Type ?): ĠString Ġ= Ġwhen Ġ( this . stack Name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" null " Ġ-> Ġ"${ this . stack Name } Ġas Ġ$ req Type " ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis . cast ( req Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Default Constructor ( owner : ĠCall Stack , Ġcall : ĠDefault Constructor Call ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= ĠCS Class ( call . klass . type , Ġnullable Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( resolved Types [ owner ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrest Ġ= Ġresolved Types [ owner ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġactual Type . merge ( rest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġ${ owner . name } Ġ= Ġ$ type ()" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġactual Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġ${ owner . name } Ġ= Ġ$ actual Type ()" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Constructor Call ( owner : ĠCall Stack , Ġcall : ĠConstructor Call ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . args . forEach Ġ{ Ġit . print As Kt () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . args . join ToString (", Ġ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . force Cast If Null ( resolved Types [ it ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= ĠCS Class ( call . klass . type , Ġnullable Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( resolved Types [ owner ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrest Ġ= Ġresolved Types [ owner ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġactual Type . merge ( rest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġ${ owner . name } Ġ= Ġ$ type ($ args )" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġactual Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġ${ owner . name } Ġ= Ġ$ actual Type ($ args )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint External Constructor Call ( owner : ĠCall Stack , Ġcall : ĠExternal Constructor Call ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . args . forEach Ġ{ Ġit . print As Kt () Ġ} ĊĠĠĠĠĠĠĠ Ġ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 ) ĊĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġactual Type ĊĠĠĠĠĠĠĠ Ġreturn Ġ" val Ġ${ owner . name } Ġ= Ġ${ constructor . klass . kotlin String }.${ constructor . name } ($ args )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint MethodCall ( owner : ĠCall Stack , Ġcall : ĠMethod Call ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . args . forEach Ġ{ Ġit . print As Kt () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġcall . method ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . args . join ToString (", Ġ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . force Cast If Null ( resolved Types [ it ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ owner . name }.${ method . name } ($ args )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Static MethodCall ( call : ĠStatic MethodCall ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . args . forEach Ġ{ Ġit . print As Kt () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġcall . method . klass ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġcall . method ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġcall . args . join ToString (", Ġ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . force Cast If Null ( resolved Types [ it ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ klass . kotlin String }.${ method . name } ($ args )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint New Array ( owner : ĠCall Stack , Ġcall : ĠNew Array ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Array Ġ= Ġwhen Ġ( val Ġtype Ġ= Ġcall . as Array . component ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠClass Type , Ġis ĠArray Type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= ĠCS Array ( type . getC sType (), Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" array Of Null s < ${ type . kotlin String }> " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġcall . as Array . getC sType ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . as Array . kotlin String ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ" val Ġ${ owner . name } Ġ= Ġ$ new Array (${ call . length . stack Name })" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Array Write ( owner : ĠCall Stack , Ġcall : ĠArray Write ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . value . print As Kt () ĊĠĠĠĠĠĠĠ Ġval Ġrequired Type Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres T Ġ= Ġresolved Types [ owner ] Ġ?: Ġactual Types [ owner ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res T Ġis ĠCS Array ) Ġres T . element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( res T Ġis ĠC SP ri mary Array ) Ġres T . element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġunreachable Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ owner . name }[ ${ call . index . stack Name }] Ġ= Ġ${ call . value . cast ( required Type )}" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Field Setter ( owner : ĠCall Stack , Ġcall : ĠField Setter ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . value . print As Kt () ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ owner . name }.${ call . field . name } Ġ= Ġ${ call . value . stack Name }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Static Field Setter ( call : ĠStatic Field Setter ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . value . print As Kt () ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ call . klass . kotlin String }.${ call . field . name } Ġ= Ġ${ call . value . stack Name }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint EnumValue Creation ( owner : ĠCall Stack , Ġcall : ĠEnum Value Creation ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= Ġcall . klass . type . getC sType ( false ) ĊĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġactual Type ĊĠĠĠĠĠĠĠ Ġreturn Ġ" val Ġ${ owner . name } Ġ= Ġ${ call . klass . kotlin String }.${ call . name }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Static Field Getter ( owner : ĠCall Stack , Ġcall : ĠStatic Field Getter ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= Ġcall . klass . type . getC sType ( false ) ĊĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġactual Type ĊĠĠĠĠĠĠĠ Ġreturn Ġ" val Ġ${ owner . name } Ġ= Ġ${ call . klass . kotlin String }.${ call . name }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Unknown ( owner : ĠCall Stack , Ġcall : ĠUnknown Call ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġcall . target . type . getC sType () ĊĠĠĠĠĠĠĠ Ġactual Types [ owner ] Ġ= Ġtype ĊĠĠĠĠĠĠĠ Ġreturn Ġ" val Ġ${ owner . name } Ġ= Ġunknown <$ type >() " ĊĠĠĠ Ġ} Ċ } Ċ