/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . ir . backend . js . lower Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . Body Lower ing Pass Ċ import Ġorg . jetbrains . kotlin . backend . common . Ir Element Transformer Void WithContext Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . Symbols Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . Js Ir Backend Context Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . ir . Js Ir Builder Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . utils . to Js Array Literal Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions .* Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Classifier Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Simple Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Type Parameter Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types .* Ċ import Ġorg . jetbrains . kotlin . ir . util . isFunction Ċ import Ġorg . jetbrains . kotlin . ir . util . is Throwable Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . transform Children Void Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . types .* Ċ Ċ class ĠClass Reference Lower ing ( val Ġcontext : ĠJs Ir Backend Context ) Ġ: ĠBody Lower ing Pass Ġ{ ĊĠĠĠ Ġprivate Ġval Ġintr insics Ġ= Ġcontext . intr insics ĊĊĠĠĠ Ġprivate Ġval Ġprimitive Classes Object Ġ= Ġcontext . primitive Classes Object ĊĊĠĠĠ Ġprivate Ġval Ġprimitive Class Properties Ġ= Ġcontext . primitive Class Properties ĊĊĠĠĠ Ġprivate Ġfun Ġprimitive Class Property ( name : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġprimitive Class Properties . single OrNull Ġ{ Ġit . name Ġ== ĠName . identifier ( name ) Ġ} ?. getter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġprimitive Classes Object . owner . declarations . filter Is Instance < Ir Simple Function >(). single Ġ{ Ġit . name Ġ== ĠName . special ("< get -$ name >") Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfinal Primitive Classes Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Boolean Ġto Ġ" boolean Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Byte Ġto Ġ" byte Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Short Ġto Ġ" short Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Int Ġto Ġ" int Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Float Ġto Ġ" float Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Double Ġto Ġ" double Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: isArray Ġto Ġ" array Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: isString Ġto Ġ" string Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Boolean Array Ġto Ġ" boolean Array Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is CharArray Ġto Ġ" char Array Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is ByteArray Ġto Ġ" byteArray Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Short Array Ġto Ġ" short Array Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is IntArray Ġto Ġ" int Array Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Long Array Ġto Ġ" long Array Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Float Array Ġto Ġ" float Array Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Double Array Ġto Ġ" double Array Class " ĊĠĠĠĠĠĠĠ Ġ). map Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprimitive Class Property ( it . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġopen Primitive Classes Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Any Ġto Ġ" any Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: isNumber Ġto Ġ" number Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Throwable Ġto Ġ" throwable Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type :: is Nothing Ġto Ġ" nothing Class " ĊĠĠĠĠĠĠĠ Ġ). map Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprimitive Class Property ( it . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall Get K Class From Expression ( returnType : ĠIr Type , Ġtype Argument : ĠIr Type , Ġargument : ĠIr Expression ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprimitive K Class Ġ= Ġget Final Primitive K Class ( returnType , Ġtype Argument ) ĊĠĠĠĠĠĠĠ Ġif Ġ( primitive K Class Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJs Ir Builder . build Block ( returnType , ĠlistOf ( argument , Ġprimitive K Class )) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠJs Ir Builder . build Call ( intr insics . js Get K Class From Expression , ĠreturnType , ĠlistOf ( type Argument )). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġargument ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Primitive Class ( target : ĠIr Simple Function , ĠreturnType : ĠIr Type ) Ġ= ĊĠĠĠĠĠĠĠ ĠJs Ir Builder . build Call ( target . symbol , ĠreturnType ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= ĠJs Ir Builder . build GetObject Value ( primitive Classes Object . default Type , Ġprimitive Classes Object ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Final Primitive K Class ( returnType : ĠIr Type , Ġtype Argument : ĠIr Type ): ĠIr Call ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( type Predicate , Ġv ) Ġin Ġfinal Primitive Classes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Predicate ( type Argument )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Primitive Class ( v , ĠreturnType ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget Open Primitive K Class ( returnType : ĠIr Type , Ġtype Argument : ĠIr Type ): ĠIr Call ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( type Predicate , Ġv ) Ġin Ġopen Primitive Classes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Predicate ( type Argument )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Primitive Class ( v , ĠreturnType ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( type Argument . isFunction ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Interface Ġ= Ġtype Argument . getClass () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġar ity Ġ= Ġfunction Interface . type Parameters . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Primitive Class ( context . primitive Class Function Class , ĠreturnType ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , ĠJs Ir Builder . build Int ( context . ir Built Ins . int Type , Ġar ity )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall Get K Class ( ĊĠĠĠĠĠĠĠ ĠreturnType : ĠIr Type Ġ= Ġintr insics . js Get K Class . owner . returnType , ĊĠĠĠĠĠĠĠ Ġtype Argument : ĠIr Type ĊĠĠĠ Ġ): ĠIr Call Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprimitive K Class Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Final Primitive K Class ( returnType , Ġtype Argument ) Ġ?: Ġget Open Primitive K Class ( returnType , Ġtype Argument ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( primitive K Class Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprimitive K Class ĊĊĠĠĠĠĠĠĠ Ġreturn ĠJs Ir Builder . build Call ( intr insics . js Get K Class , ĠreturnType , ĠlistOf ( type Argument )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġcall Js Class ( type Argument )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall Js Class ( type : ĠIr Type ) Ġ= ĊĠĠĠĠĠĠĠ ĠJs Ir Builder . build Call ( intr insics . js Class , Ġtype Arguments Ġ= ĠlistOf ( type )) ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Call ( name : ĠIr Simple Function Symbol , Ġvar arg Ġargs : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ ĠJs Ir Builder . build Call ( name ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . forEach Indexed Ġ{ Ġindex , Ġir Expression Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( index , Ġir Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate K Type ( type : ĠIr Type , Ġvisited Type Params : ĠMutable Set < Ir Type Parameter >): ĠIr Expression Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġis ĠIr Simple Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Simple K Type ( type , Ġvisited Type Params ) ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġis ĠIr Dynamic Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Dynamic Type () ĊĠĠĠĠĠĠĠ Ġerror (" Unexpected Ġtype Ġ$ type ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Dynamic Type (): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Call ( context . intr insics . create Dynamic K Type !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Simple K Type ( type : ĠIr Simple Type , Ġvisited Type Params : ĠMutable Set < Ir Type Parameter >): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclassifier : ĠIr Classifier Symbol Ġ= Ġtype . classifier ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠCheck Ġwhy Ġdo Ġwe Ġhave Ġun - subst it uted Ġre ified Ġparameters ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġ( classifier Ġis ĠIr Type Parameter Symbol Ġ&& Ġclassifier . owner . is Re ified ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġerror (" Fail ") ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġk Classifier Ġ= Ġcreate K Classifier ( classifier , Ġvisited Type Params ) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠUse Ġstatic Ġarray Ġtypes ĊĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġtype . arguments . map Ġ{ Ġcreate K Type Projection ( it , Ġvisited Type Params ) Ġ}. to Js Array Literal ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . dynamic Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . dynamic Type ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġis Marked Nullable Ġ= ĠJs Ir Builder . build Boolean ( context . ir Built Ins . boolean Type , Ġtype . is Marked Nullable ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . create K Type !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk Classifier , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Marked Nullable ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate K Type Projection ( tp : ĠIr Type Argument , Ġvisited Type Params : ĠMutable Set < Ir Type Parameter >): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tp Ġ! is ĠIr Type Projection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild Call ( context . intr insics . get Star K Type Projection !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfactory Name Ġ= Ġwhen Ġ( tp . variance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVari ance . IN VARIANT Ġ-> Ġcontext . intr insics . create Invariant K Type Projection !! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVari ance . IN _ VARI ANCE Ġ-> Ġcontext . intr insics . create Contr av ari ant K Type Projection !! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVari ance . OUT _ VARI ANCE Ġ-> Ġcontext . intr insics . create Co variant K Type Projection !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġk Type Ġ= Ġcreate K Type ( tp . type , Ġvisited Type Params ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Call ( factory Name , Ġk Type ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate K Classifier ( classifier : ĠIr Classifier Symbol , Ġvisited Type Params : ĠMutable Set < Ir Type Parameter >): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( classifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Type Parameter Symbol Ġ-> Ġcreate K Type Parameter ( classifier . owner , Ġvisited Type Params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcall Get K Class ( type Argument Ġ= Ġclassifier . default Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate K Type Parameter ( type Parameter : ĠIr Type Parameter , Ġvisited Type Params : ĠMutable Set < Ir Type Parameter >): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSee ĠK T - 4 0 1 7 3 ĊĠĠĠĠĠĠĠ Ġif Ġ( type Parameter Ġin Ġvisited Type Params ) ĠTODO (" Non - re ified Ġtype Ġparameters Ġwith Ġrecursive Ġbounds Ġare Ġnot Ġsupported Ġyet ") ĊĊĠĠĠĠĠĠĠ Ġvisited Type Params . add ( type Parameter ) ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠJs Ir Builder . build String ( context . ir Built Ins . string Type , Ġtype Parameter . name . asString ()) ĊĠĠĠĠĠĠĠ Ġval Ġupper Bounds Ġ= Ġtype Parameter . super Types . map Ġ{ Ġcreate K Type ( it , Ġvisited Type Params ) Ġ}. to Js Array Literal ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . dynamic Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . dynamic Type ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvariance Ġ= Ġwhen Ġ( type Parameter . variance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVari ance . IN VARIANT Ġ-> ĠJs Ir Builder . build String ( context . ir Built Ins . string Type , Ġ" in variant ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVari ance . IN _ VARI ANCE Ġ-> ĠJs Ir Builder . build String ( context . ir Built Ins . string Type , Ġ" in ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVari ance . OUT _ VARI ANCE Ġ-> ĠJs Ir Builder . build String ( context . ir Built Ins . string Type , Ġ" out ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠCheck Ġwhy Ġdo Ġwe Ġhave Ġnon - in lined Ġre ified Ġparameters ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġ( type Parameter . is Re ified ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġerror (" Re ified Ġparameter ") ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . intr insics . create K Type Parameter !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupper Bounds , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariance ĊĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisited Type Params . remove ( type Parameter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlower ( ir Body : ĠIr Body , Ġcontainer : ĠIr Declaration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġir Body . transform Children Void ( object Ġ: ĠIr Element Transformer Void WithContext () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit GetClass ( expression : ĠIr GetClass ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Get K Class From Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġexpression . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Argument Ġ= Ġexpression . argument . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Ġ= Ġexpression . argument . transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Class Reference ( expression : ĠIr Class Reference ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Get K Class ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġexpression . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Argument Ġ= Ġexpression . class Type . make NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call ( expression : ĠIr Call ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Symbols . is TypeOf Intr insic ( expression . symbol )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate K Type ( expression . getType Argument ( 0 ) !! , Ġhash Set Of ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Call ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ } ĊĊ