/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠS me . UP ĠS . p . A . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . s me up . r pg parser . interpreter Ċ Ċ import Ġcom . s me up . r pg parser . parsing . ast .* Ċ import Ġcom . s me up . r pg parser . parsing . par set reet o ast . R pg Type Ċ import Ġcom . s me up . r pg parser . parsing . par set reet o ast . todo Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġjava . math . BigDecimal Ċ import Ġkotlin . math . ceil Ċ import Ġkotlin . math . max Ċ Ċ // ĠSupported Ġdata Ġtypes : Ċ // Ġ* ĠCharacter ĠFormat Ċ // Ġ* ĠNumeric ĠData ĠType Ċ // Ġ* ĠU CS - 2 ĠFormat Ċ // Ġ* ĠDate ĠData ĠType Ċ // Ġ* ĠTime ĠData ĠType Ċ // Ġ* ĠTimestamp ĠData ĠType Ċ // Ġ* ĠObject ĠData ĠType Ċ // Ġ* ĠB asing ĠPointer ĠData ĠType Ċ // Ġ* ĠProcedure ĠPointer ĠData ĠType Ċ Ċ @ Serializable Ċ sealed Ġclass ĠType Ġ{ ĊĠĠĠ Ġopen Ġfun ĠnumberOf Elements (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 1 ĊĠĠĠ Ġ} ĊĠĠĠ Ġopen Ġfun Ġelement Size (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġcan Be Assigned ( value : ĠValue ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . assign able To ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġcan Be Assigned ( type : ĠType ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġ== Ġtype ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġval Ġsize : ĠInt ĊĊĠĠĠ Ġfun Ġto Array ( n Elements : ĠInt ) Ġ= ĠArray Type ( this , Ġn Elements ) ĊĠĠĠ Ġfun ĠisArray () Ġ= Ġthis Ġis ĠArray Type ĊĠĠĠ Ġopen Ġfun Ġas Array (): ĠArray Type Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Not Ġan ĠArray Type ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġopen Ġfun Ġhas Variable Size () Ġ= Ġfalse Ċ } Ċ Ċ @ Serializable Ċ object ĠFig ur ative Type Ġ: ĠType () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġcan Be Assigned ( value : ĠValue ): ĠBoolean Ġ= Ġtrue Ċ } Ċ Ċ @ Serializable Ċ object ĠK ListType Ġ: ĠType () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġcan Be Assigned ( value : ĠValue ): ĠBoolean Ġ= Ġfalse Ċ } Ċ Ċ @ Serializable Ċ data Ġclass ĠData Structure Type ( val Ġfields : ĠList < FieldType >, Ġval Ġelement Size : ĠInt ) Ġ: ĠType () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġelement Size Ċ } Ċ Ċ @ Serializable Ċ data Ġclass ĠString Type ( val Ġlength : ĠInt , Ġval Ġvarying : ĠBoolean Ġ= Ġfalse ) Ġ: ĠType () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġlength Ċ } Ċ @ Serializable Ċ object ĠBoolean Type Ġ: ĠType () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ 1 ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġthis . java Class . simple Name Ċ } Ċ Ċ @ Serializable Ċ object ĠHi Val Type Ġ: ĠType () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthrow ĠIllegalStateException (" Has Ġvariable Ġsize ") ĊĊĠĠĠ Ġoverride Ġfun Ġhas Variable Size () Ġ= Ġtrue Ċ } Ċ Ċ @ Serializable Ċ object ĠLow Val Type Ġ: ĠType () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthrow ĠIllegalStateException (" Has Ġvariable Ġsize ") ĊĊĠĠĠ Ġoverride Ġfun Ġhas Variable Size () Ġ= Ġtrue Ċ } Ċ Ċ @ Serializable Ċ object ĠTime Stamp Type Ġ: ĠType () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ 2 6 Ċ } Ċ Ċ /** Ċ Ġ* ĠA ĠCharacter Type Ġis Ġbasically Ġvery Ġsimilar Ġto Ġan Ġarray Ġof Ġcharacters Ċ Ġ* Ġand Ġvery Ġsimilar Ġto Ġa Ġstring . Ċ Ġ*/ Ċ @ Serializable Ċ data Ġclass ĠCharacter Type ( val Ġn Chars : ĠInt ) Ġ: ĠType () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġn Chars Ċ } Ċ Ċ infix Ġfun ĠInt . pow ( exponent : ĠInt ): ĠLong Ġ{ ĊĠĠĠ Ġrequire ( exponent Ġ>= Ġ 0 ) ĊĠĠĠ Ġreturn Ġif Ġ( exponent Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠ 1 ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ġ* Ġthis . pow ( exponent Ġ- Ġ 1 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ infix Ġfun ĠLong . log ( base : ĠInt ): ĠDouble Ġ{ ĊĠĠĠ Ġreturn Ġ( Math . log ( this . toDouble ()) Ġ/ ĠMath . log ( base . toDouble ())) Ċ } Ċ Ċ @ Serializable Ċ data Ġclass ĠNumber Type ( val Ġentire Digits : ĠInt , Ġval Ġdecimal Digits : ĠInt , Ġval Ġr pg Type : ĠString ? Ġ= Ġ"") Ġ: ĠType () Ġ{ ĊĊĠĠĠ Ġconstructor ( ent ire Digits : ĠInt , Ġdecimal Digits : ĠInt , Ġr pg Type : ĠR pg Type ) Ġ: Ġthis ( ent ire Digits , Ġdecimal Digits , Ġr pg Type . r pg Type ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( r pg Type Ġ== ĠR pg Type . INTEGER . r pg Type Ġ|| Ġr pg Type Ġ== ĠR pg Type . UNSIGNED . r pg Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( ent ire Digits Ġ<= Ġ 2 0 ) Ġ{ Ġ" Integer Ġor ĠUnsigned Ġinteger Ġcan Ġhave Ġonly Ġlength Ġup Ġto Ġ 2 0 . ĠValue Ġspecified : Ġ$ this " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( decimal Digits Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( r pg Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR pg Type . PACK ED . r pg Type Ġ-> Ġceil (( numberOf Digits Ġ+ Ġ 1 ). toDouble () Ġ/ Ġ 2 . toFloat ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR pg Type . INTEGER . r pg Type , ĠR pg Type . UNSIGNED . r pg Type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ent ire Digits ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 .. 3 Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 4 .. 5 Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 6 .. 1 0 Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 1 .. 2 0 Ġ-> Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Only Ġpredefined Ġlength Ġallowed Ġfor Ġinteger , Ġsigned Ġor Ġunsigned ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR pg Type . BINARY . r pg Type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ent ire Digits ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 .. 4 Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 5 .. 9 Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Only Ġpredefined Ġlength Ġallowed Ġbinary Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠnumberOf Digits ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġinteger : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdecimal Digits Ġ== Ġ 0 ĊĠĠĠ Ġval Ġdecimal : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ! integer ĊĠĠĠ Ġval ĠnumberOf Digits : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġentire Digits Ġ+ Ġdecimal Digits ĊĊĠĠĠ Ġoverride Ġfun Ġcan Be Assigned ( type : ĠType ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġis ĠNumber Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtype . ent ire Digits Ġ<= Ġthis . ent ire Digits Ġ&& Ġtype . decimal Digits Ġ<= Ġthis . decimal Digits ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Serializable Ċ data Ġclass ĠArray Type ( val Ġelement : ĠType , Ġval Ġn Elements : ĠInt , Ġval Ġcompile Time Records Per Line : ĠInt ? Ġ= Ġnull ) Ġ: ĠType () Ġ{ ĊĠĠĠ Ġvar Ġasc end : ĠBoolean ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġelement . size Ġ* Ġn Elements ĊĊĠĠĠ Ġoverride Ġfun ĠnumberOf Elements (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġn Elements ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġelement Size (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelement . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġas Array (): ĠArray Type Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcompile Time Array (): ĠBoolean Ġ= Ġcompile Time Records Per Line Ġ!= Ġnull Ċ } Ċ Ċ @ Serializable Ċ data Ġclass ĠFieldType ( val Ġname : ĠString , Ġval Ġtype : ĠType ) Ċ Ċ fun ĠExpression . type (): ĠType Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠData Ref Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . variable . referred !!. type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠString Literal Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString Type ( this . value . length , Ġtrue ) Ġ// ĠTODO Ġverify Ġif Ġvarying Ġhas Ġto Ġbe Ġtrue Ġor Ġfalse Ġhere ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠInt Literal Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNumber Type ( BigDecimal . valueOf ( this . value ). precision (), Ġdecimal Digits Ġ= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠReal Literal Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNumber Type ( this . value . precision () Ġ- Ġthis . value . scale (), Ġthis . value . scale ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠArray Access Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġthis . array . type (). as Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtype . element ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠIndicator Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBoolean Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠGlobal Indicator Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠArray Type ( Boolean Type , Ġ 9 9 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠHi Val Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHi Val Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠLow Val Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLow Val Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSubst Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . string . type () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠQual ified Access Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . field . referred !!. type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠOn Ref Expr , Ġis ĠOff Ref Expr Ġ-> Ġreturn ĠBoolean Type ĊĠĠĠĠĠĠĠ Ġis ĠFig ur ative Constant Ref Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFig ur ative Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠPlus Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Type Ġ= Ġthis . left . type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Type Ġ= Ġthis . right . type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Type Ġis ĠNumber Type Ġ&& Ġright Type Ġis ĠNumber Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNumber Type ( max ( left Type . ent ire Digits , Ġright Type . ent ire Digits ), Ġmax ( left Type . decimal Digits , Ġright Type . decimal Digits )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" We Ġdo Ġnot Ġknow Ġthe Ġtype Ġof Ġa Ġsum Ġof Ġtypes Ġ$ left Type Ġand Ġ$ right Type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠMin us Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Type Ġ= Ġthis . left . type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Type Ġ= Ġthis . right . type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Type Ġis ĠNumber Type Ġ&& Ġright Type Ġis ĠNumber Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNumber Type ( max ( left Type . ent ire Digits , Ġright Type . ent ire Digits ), Ġmax ( left Type . decimal Digits , Ġright Type . decimal Digits )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" We Ġdo Ġnot Ġknow Ġthe Ġtype Ġof Ġa Ġsub traction Ġof Ġtypes Ġ$ left Type Ġand Ġ$ right Type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠLen Expr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ( this . value Ġas ĠData Ref Expr ). size (). toString (). length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNumber Type ( size , Ġdecimal Digits Ġ= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠFunction Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . parent Ġis ĠEval Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this . parent Ġas ĠEval Stmt ). target . type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtodo (" Unable Ġto Ġestablish ĠFunction Call Ġ'${ this . function . name }' Ġreturn Ġtype Ġof Ġwhich Ġ'${ this . parent }'. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO (" We Ġdo Ġnot Ġknow Ġhow Ġto Ġcalculate Ġthe Ġtype Ġof Ġ$ this Ġ(${ this . java Class . canonical Name }) ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġbase Type ( type : ĠType ): ĠType Ġ= Ġif Ġ( type Ġis ĠArray Type ) Ġtype . element Ġelse Ġtype