/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 Ġ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 . backend . jvm . lower . ind y Ċ Ċ import Ġorg . jetbrains . kotlin . backend . jvm . Jvm Backend Context Ċ import Ġorg . jetbrains . kotlin . backend . jvm . ir . Jvm Ir Builder Ċ import Ġorg . jetbrains . kotlin . backend . jvm . ir . create Jvm Ir Builder Ċ import Ġorg . jetbrains . kotlin . backend . jvm . ir . get Single Abstract Method Ċ import Ġorg . jetbrains . kotlin . descriptors . Descriptor Vis ibilities Ċ import Ġorg . jetbrains . kotlin . descriptors . Modal ity Ċ import Ġorg . jetbrains . kotlin . ir . builders .* Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . build Fun Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . build Value Parameter Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Container Expression Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Expression Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Function Reference Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Statement Origin Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Function Reference Impl Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types .* Ċ import Ġorg . jetbrains . kotlin . ir . util . functions Ċ import Ġorg . jetbrains . kotlin . ir . util . render Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . util . Operator Name Con ventions Ċ Ċ internal Ġsealed Ġclass ĠSam Delegating Lambda Block Ġ{ ĊĠĠĠ Ġabstract Ġval Ġblock : ĠIr Container Expression ĊĠĠĠ Ġabstract Ġval Ġref : ĠIr Function Reference ĊĠĠĠ Ġabstract Ġfun Ġreplace Ref With ( expression : ĠIr Expression ) Ċ } ĊĊ Ċ internal Ġclass ĠRegular Delegating Lambda Block ( ĊĠĠĠ Ġoverride Ġval Ġblock : ĠIr Container Expression , ĊĠĠĠ Ġoverride Ġval Ġref : ĠIr Function Reference Ċ ) Ġ: ĠSam Delegating Lambda Block () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġreplace Ref With ( expression : ĠIr Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock . statements [ block . statements . size Ġ- Ġ 1 ] Ġ= Ġexpression ĊĠĠĠĠĠĠĠ Ġblock . type Ġ= Ġexpression . type ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ internal Ġclass ĠNullable Delegating Lambda Block ( ĊĠĠĠ Ġoverride Ġval Ġblock : ĠIr Container Expression , ĊĠĠĠ Ġoverride Ġval Ġref : ĠIr Function Reference , ĊĠĠĠ Ġprivate Ġval Ġif Expr : ĠIr Expression , ĊĠĠĠ Ġprivate Ġval Ġif NotNull Block : ĠIr Container Expression Ċ ) Ġ: ĠSam Delegating Lambda Block () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġreplace Ref With ( expression : ĠIr Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif NotNull Block . statements [ if NotNull Block . statements . size Ġ- Ġ 1 ] Ġ= Ġexpression ĊĠĠĠĠĠĠĠ Ġif NotNull Block . type Ġ= Ġexpression . type ĊĠĠĠĠĠĠĠ Ġif Expr . type Ġ= Ġexpression . type ĊĠĠĠĠĠĠĠ Ġblock . type Ġ= Ġexpression . type ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ internal Ġclass ĠSam Delegating Lambda Builder ( private Ġval Ġj vm Context : ĠJ vm Backend Context ) Ġ{ ĊĠĠĠ Ġfun Ġbuild ( expression : ĠIr Expression , Ġsuper Type : ĠIr Type , Ġscope Symbol : ĠIr Symbol , Ġparent : ĠIr Declaration Parent ): ĠSam Delegating Lambda Block Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( super Type . is Nullable () Ġ&& Ġexpression . type . is Nullable ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Nullable Delegating Lambda ( expression , Ġsuper Type , Ġscope Symbol , Ġparent ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Regular Delegating Lambda ( expression , Ġsuper Type , Ġscope Symbol , Ġparent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Regular Delegating Lambda ( ĊĠĠĠĠĠĠĠ Ġexpression : ĠIr Expression , ĊĠĠĠĠĠĠĠ Ġsuper Type : ĠIr Type , ĊĠĠĠĠĠĠĠ Ġscope Symbol : ĠIr Symbol , ĊĠĠĠĠĠĠĠ Ġparent : ĠIr Declaration Parent ĊĠĠĠ Ġ): ĠSam Delegating Lambda Block Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġref : ĠIr Function Reference ĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġj vm Context . create Jvm Ir Builder ( scope Symbol , Ġexpression . start Offset , Ġexpression . end Offset ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġval Ġtmp Ġ= Ġ< expression > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġfun Ġ`< anonymous >` ( p 1 : ĠT 1 , Ġ..., Ġp N : ĠT N ): ĠR Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠ Ġtmp . invoke ( p 1 , Ġ..., Ġp N ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ:: `< anonymous >` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Block ( origin Ġ= ĠIr Statement Origin . L AMBDA ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġir Temporary ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlambda Ġ= Ġcreate Delegating Lambda ( expression , Ġsuper Type , Ġtmp , Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġ+ it Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref Ġ= Ġcreate Delegating Lambda Reference ( expression , Ġlambda ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġ+ it Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġblock . type Ġ= Ġexpression . type ĊĠĠĠĠĠĠĠ Ġreturn ĠRegular Delegating Lambda Block ( block , Ġref ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Nullable Delegating Lambda ( ĊĠĠĠĠĠĠĠ Ġexpression : ĠIr Expression , ĊĠĠĠĠĠĠĠ Ġsuper Type : ĠIr Type , ĊĠĠĠĠĠĠĠ Ġscope Symbol : ĠIr Symbol , ĊĠĠĠĠĠĠĠ Ġparent : ĠIr Declaration Parent ĊĠĠĠ Ġ): ĠSam Delegating Lambda Block Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġref : ĠIr Function Reference ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġif Expr : ĠIr Expression ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġif NotNull Block : ĠIr Container Expression ĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġj vm Context . create Jvm Ir Builder ( scope Symbol , Ġexpression . start Offset , Ġexpression . end Offset ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġval Ġtmp Ġ= Ġ< expression > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġif Ġ( tmp Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠ Ġfun Ġ`< anonymous >` ( p 1 : ĠT 1 , Ġ..., Ġp N : ĠT N ): ĠR Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . invoke ( p 1 , Ġ..., Ġp N ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠ Ġ:: `< anonymous >` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Block ( origin Ġ= ĠIr Statement Origin . L AMBDA ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġir Temporary ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif NotNull Block Ġ= Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlambda Ġ= Ġcreate Delegating Lambda ( expression , Ġsuper Type , Ġtmp , Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġ+ it Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref Ġ= Ġcreate Delegating Lambda Reference ( expression , Ġlambda ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġ+ it Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Expr Ġ= Ġir If Null ( expression . type , Ġir Get ( tmp ), Ġir Null (), Ġif NotNull Block ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġ+ it Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġblock . type Ġ= Ġexpression . type ĊĠĠĠĠĠĠĠ Ġreturn ĠNullable Delegating Lambda Block ( block , Ġref , Ġif Expr , Ġif NotNull Block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Delegating Lambda ( ĊĠĠĠĠĠĠĠ Ġexpression : ĠIr Expression , ĊĠĠĠĠĠĠĠ Ġsuper Type : ĠIr Type , ĊĠĠĠĠĠĠĠ Ġtmp : ĠIr Variable , ĊĠĠĠĠĠĠĠ Ġparent : ĠIr Declaration Parent ĊĠĠĠ Ġ): ĠIr Simple Function Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsuper Method Ġ= Ġsuper Type . get Single Abstract Method () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAssertionError (" SAM Ġtype Ġexpected : Ġ${ super Type . render () }") ĊĠĠĠĠĠĠĠ Ġval Ġeffective Value Parameters Count Ġ= Ġsuper Method . value Parameters . size Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( super Method . extension Receiver Parameter Ġ== Ġnull ) Ġ 0 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġinv oc able Function Class Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( super Method . is Suspend ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj vm Context . ir . symbols . suspend Function N ( effective Value Parameters Count ). owner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj vm Context . ir . symbols . function N ( effective Value Parameters Count ). owner ĊĠĠĠĠĠĠĠ Ġval Ġinvoke Function Ġ= Ġinv oc able Function Class . functions . single Ġ{ Ġit . name Ġ== ĠOperator Name Con ventions . IN VOKE Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtype Subst it utor Ġ= Ġcreate Type Subst it utor ( super Type ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġj vm Context . ir Factory . build Fun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠName . special ("< anonymous >") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġtype Subst it utor . substitute ( super Method . returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . LOCAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmod ality Ġ= ĠMod ality . FINAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠIr Declaration Origin . LOCAL _ FUNCTION _ FOR _ L AMBDA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Suspend Ġ= Ġsuper Method . is Suspend ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġlambda Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlambda . dispatch Receiver Parameter Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlambda . extension Receiver Parameter Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlambda . value Parameters Ġ= Ġcreate Lambda Value Parameters ( super Method , Ġlambda , Ġtype Subst it utor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlambda . body Ġ= Ġj vm Context . create Jvm Ir Builder ( lambda . symbol , Ġexpression . start Offset , Ġexpression . end Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ir Block Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( invoke Function ). also Ġ{ Ġinvoke Call Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġcast Ġreceiver Ġto Ġthe Ġfunction Ġtype Ġbecause Ġit Ġmight Ġhave Ġan Ġimag inary Ġtype Ġlike ĠK Function 2 Ġwhich ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġis Ġmapped Ġto ĠK Function Ġin Ġthe Ġcodegen Ġby Ġdefault , Ġwhich Ġhas Ġno Ġ' invoke '. ĠLooks Ġlike Ġcorrect Ġtype Ġarguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġare Ġnot Ġneeded Ġhere , Ġso Ġwe Ġuse Ġ" raw " Ġtype Ġfor Ġsimplicity . ĠIf Ġthat Ġstops Ġworking , Ġwe 'll Ġneed Ġto Ġcompute Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcorrect Ġsubstitution Ġof Ġinv oc able Function Class Ġby Ġvisit ing Ġtmp . type 's Ġhierarchy . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw FunctionType Ġ= Ġinv oc able Function Class . type With () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Call . dispatch Receiver Ġ= Ġir Implicit Cast ( ir Get ( tmp ), Ġraw FunctionType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġparameter Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Function . extension Receiver Parameter ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Call . extension Receiver Ġ= Ġir Get ( lambda . value Parameters [ parameter Index ++ ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( argument Index Ġin Ġinvoke Function . value Parameters . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Call . put Value Argument ( argument Index , Ġir Get ( lambda . value Parameters [ parameter Index ++ ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlambda . parent Ġ= Ġparent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Lambda Value Parameters ( ĊĠĠĠĠĠĠĠ Ġsuper Method : ĠIr Simple Function , ĊĠĠĠĠĠĠĠ Ġlambda : ĠIr Simple Function , ĊĠĠĠĠĠĠĠ Ġtype Subst it utor : ĠIr Type Subst it utor ĊĠĠĠ Ġ): ĠList < Ir Value Parameter > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlambda Parameters Ġ= ĠArrayList < Ir Value Parameter >() ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġsuper Method . extension Receiver Parameter ?. let Ġ{ Ġsuper Extension Receiver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlambda Parameters . add ( super Extension Receiver . copy Subst it uted ( lambda , Ġtype Subst it utor , Ġindex ++, ĠName . identifier ("\ $ receiver "))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper Method . value Parameters . map To ( lambda Parameters ) Ġ{ Ġsuper Value Parameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Value Parameter . copy Subst it uted ( lambda , Ġtype Subst it utor , Ġindex ++) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlambda Parameters ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Value Parameter . copy Subst it uted ( ĊĠĠĠĠĠĠĠ Ġfunction : ĠIr Simple Function , ĊĠĠĠĠĠĠĠ Ġsubstit utor : ĠIr Type Subst it utor , ĊĠĠĠĠĠĠĠ Ġnew Index : ĠInt , ĊĠĠĠĠĠĠĠ ĠnewName : ĠName Ġ= Ġname ĊĠĠĠ Ġ) Ġ= ĊĠĠĠĠĠĠĠ Ġbuild Value Parameter ( function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠnewName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġnew Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġsubstit utor . substitute ( this @ copy Subst it uted . type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJ vm Ir Builder . create Delegating Lambda Reference ( expression : ĠIr Expression , Ġlambda : ĠIr Simple Function ): ĠIr Function Reference Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠIr Function Reference Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset , Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlambda . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments Count Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Arguments Count Ġ= Ġlambda . value Parameters . size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreflection Target Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠIr Statement Origin . L AMBDA ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Type Subst it utor ( ir Type : ĠIr Type ): ĠIr Type Subst it utor Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ir Type Ġ! is ĠIr Simple Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" Simple Ġtype Ġexpected : Ġ${ ir Type . render () }") ĊĠĠĠĠĠĠĠ Ġval Ġir Class Symbol Ġ= Ġir Type . class OrNull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAssertionError (" Class Ġtype Ġexpected : Ġ${ ir Type . render () }") ĊĠĠĠĠĠĠĠ Ġreturn ĠIr Type Subst it utor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class Symbol . owner . type Parameters . map Ġ{ Ġit . symbol Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Type . arguments , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj vm Context . ir Built Ins ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ